spark是什么?
    分布式计算框架

    Spark 的一个主要特点就是能够在内存中进行计算,因而更快。不过即使是必须在磁盘上 进行的复杂计算,Spark 依然比 MapReduce 更加高。

    Spark Core 中还包含了对弹性分布式数据集(resilient distributed dataset,简 称 RDD)的 API 定义。RDD 表示分布在多个计算节点上可以并行操作的元素集合,是 Spark 主要的编程抽象。

    Spark RDD 是惰性求值的,而有时我们希望能多次使用同一个 RDD。如果简单 地对 RDD 调用行动操作,Spark 每次都会重算 RDD 以及它的所有依赖.

    reduceByKey() 与 reduce() 相当类似;它们都接收一个函数,并使用该函数对值进行合并。 reduceByKey() 会为数据集中的每个键进行并行的归约操作,每个归约操作会将键相同的值合 并起来。

    1.rdd 五大特性:
    1)rdd是有分区的
    2)rdd的方法会作用到所有分区上
    3)rdd之间是有依赖关系的
    4) k-v型的rdd可以有分区器
    5) rdd的分区规划,尽可能靠近数据所在的服务器

    面试题:Hadoop的基于进程的计算和Spark基于线程方式优缺点?
    答案:Hadoop中的MR中每个map/reduce task都是一个java进程方式运行,好处在于进程之间是互相独立的,
    每个task独享进程资源,没 有互相干扰,监控方便,但是问题在于task之间不方便共享数据,执行效率比较低。
    比如多个map task读取不同数据源文件需要将数据源加 载到每个map task中,造成重复加载和浪费内存。
    而基于线程的方式计算是为了数据共享和提高执行效率,Spark采用了线程的最小的执行 单位,
    但缺点是线程之间会有资源竞争。

    【扩展阅读】:线程基本概念
     线程是CPU的基本调度单位
     一个进程一般包含多个线程, 一个进程下的多个线程共享进程的资源  不同进程之间的线程相互不可见
     线程不能独立执行
     一个线程可以创建和撤销另外一个线程

    Spark程序运行层次结构
    Spark Application程序运行时三个核心概念:Job、Stage、 Task,说明如下:
     Job:由多个 Task 的并行计算部分,一般 Spark 中的 action 操作(如 save、collect,后面进一步说明),会 生成一个 Job。
     Stage:Job 的组成单位,一个 Job 会切分成多个 Stage ,Stage 彼此之间相互依赖顺序执行,而每个 Stage 是多 个 Task 的集合,类似 map 和 reduce stage。
     Task:被分配到各个 Executor 的单位工作内容,它是 Spark 中的最小执行单位,一般来说有多少个 Paritition (物理层面的概念,即分支可以理解为将数据划分成不同 部分并行处理),就会有多少个 Task,每个 Task 只会处 理单一分支上的数据。

    1)、Master(ResourceManager):集群大管家, 整个 集群的资源管理和分配
    2)、Worker(NodeManager):单个机器的管家,负责 在单个服务器上提供运行容器,管理当前机器的资源.
    3)、Driver:单个Spark任务的管理者,管理Executor 的任务执行和任务分解分配, 类似YARN的 ApplicationMaster;
    4)、Executor:具体干活的进程, Spark的工作任务 (Task)都由Executor来负责执行.