如果说对于的大数据处理最有奉献的当属Hadoop的三招绝学,HDFS、YARN、MapReduce,而Spark师从Hadoop,青出于蓝而胜于蓝,创立的Spark Core改良了Hadoop基于磁盘的分布式计算,独成一派创立了时机内存的分布式计算引擎。Hadoop MapReduce欲知Spark详情还必须从Hadoop的三招绝学说起,其一便是MapReduce。顾名思义,MapReduce实际上就是两种计算的形象,Map和Reduce类。Map:用于封装数据映射逻辑,通过map接口来定义数据转换流程关上文件Reduce:用户封装数据聚合逻辑,通过reduce接口来定义数据汇聚过程
Map计算完结后,一般来说须要对数据进行散发能力启动Reduce计算逻辑来执行数据汇聚的操作,数据散发的过程称之为Shuffle。MapReduce 提供的分布式任务调度让开发者专一于业务逻辑实现,而无需关怀依赖治理、代码散发等分布式实现问题。在 MapReduce 框架下,为了实现端到端的计算作业,Hadoop 采纳 YARN 来实现分布式资源调度从而充分利用便宜的硬件资源,采纳 HDFS 作为计算形象之间的数据接口来躲避便宜磁盘引入的零碎稳定性问题。尽管Hadoop自成体系的三板斧能够实现任何分布式解决工作,然而也存在一个不可扭转的弊病,基于磁盘的分片正本会带来微小的磁盘I/O和网络I/O开销。Spark CoreSpark是基于Hadoop的一种改良,基于内存的分布式计算引擎。基于内存的计算并不是将所有的计算都放在的内存中实现,而是通过RDD来实现。RDDRDD(Resilient Distributed Datasets),全称是“弹性分布式数据集”,是Spark对于分布式数据进行形象的数据模型,这种数据模型用于囊括、封装所有内存中和磁盘中的分布式数据实体。RDD算子 VS HDFS算子?回顾Hadoop计算流程,MapReduce计算模型中采纳HDFS所做算子之间的数据接口,所有算子的长期后果都以文件的模式存储到HDFS,以供上游数据的生产,上游的算子再从HDFS读取文件转为键值对,通过Map或者Reduce操作后再以文件的存储到HDFS。不难发现,以HDFS作为数据接口才是Hadoop计算效率低的本源
RDD 的设计以数据作为第一视角,不再强调算子的重要性,算子仅仅是 RDD 数据转换的一种计算规定,map 算子和 reduce 算子纷纷被弱化、浓缩。以RDD外围属性中的 dependencies 与 compute 来确定RDD流转操作,这两个操作形容了“从以后 RDD 登程,再通过怎么的计算规定与转换,能够取得新的数据集”。
能够看出RDD通过dependencies 中指定的依赖关系和 compute 定义的计算逻辑形成了一条从终点到起点的数据转换门路。这条门路在Spark有个专门的术语,叫做Lineage——血统。Spark Core 依赖血统进行依赖治理、阶段划分、工作散发、失败重试,任意一个 Spark 计算作业都能够析构为一个 Spark Core 血统。另外三个外围属性就是partitions、partitioner 和 preferredLocations。partitions 属性记录了 RDD 的每一个数据分片,不便开发者灵便地拜访数据集partitioner 则形容了 RDD 划分数据分片的规定和逻辑,采纳不同的 partitioner 对 RDD 进行划分,可能以不同的形式失去不同数量的数据分片preferredLocations —— 地位偏好,该属性与 partitions 属性一一对应,定义了每一个数据分片的物理地位偏好。具体来说包含:本地内存、本地磁盘、本机架磁盘、其余机架磁盘Lineage VS DAG如果说Lineage是从数据流转的视角登程来形容RDD转换逻辑,那么DAG(Directed Acyclic Graph,有向无环图)就是就是从计算角度来形容RDD转换逻辑。由DAG实现的数据流转能够通过节点示意RDD数据,通过DAG的连接线示意算子的操作。
依据RDD之间依赖关系的不同将DAG划分成不同的Stage(调度阶段)。对于窄依赖,partition的转换解决在一个Stage中实现计算。对于宽依赖,因为有Shuffle的存在,只能在parent RDD解决实现后,能力开始接下来的计算,因而宽依赖是划分Stage的根据。内存计算的由来本着缩小数据IO的目标,遵循“数据不动代码动”的准则。Spark Core尊重数据分片的存储地位的偏好,尽可能将计算散发到本地计算节点去执行,从而缩小来源于数据传输带来的大幅开销,进而从整体上晋升了执行性能。为了实现这一目标,RDD的5大外围属性别离从数据视角和计算视角来刻画数据模型的形象,任何分布式作业都能够通过RDD形象之间的转换来实现。实践上来说,如果计算节点的内存足够多,所有的RDD转换操作都能够放到内存中来执行。