Spark中的RDD|青训营笔记

117 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第7天

今天带来的是Spark相关的内容。

什么是Spark

Spark是 UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,是专为大规模数据处理而设计的快速通用的大数据处理引擎及轻量级的大数据处理统一平台。

Spark运行架构和工作原理

Spark应用在集群上运行时,包括了多个独立的进程,这些进程之间通过驱动程序(Driver Program)中的SparkContext对象进行协调,SparkContext对象能够与多种集群资源管理器(Cluster Manager)通信,一旦与集群资源管理器连接,Spark会为该应用在各个集群节点上申请执行器(Executor),用于执行计算任务和存储数据。Spark将应用程序代码发送给所申请到的执行器,SparkContext对象将分割出的任务(Task)发送给各个执行器去运行。

Spark 的内存计算框架

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合

RDD具有数据流模型特点:自动容错、位置感知性调度和可伸缩。RDD允许用户在执行多个查询时,显示地将工作集缓存在内存中,后续的查询能够重用工作集,这将会极大的提升查询的效率。

RDD的五大特性

1.一组分片(Partition),即数据集的基本组成单位。对于RDD来说,每个分片都会被一个计算任务处 理,并决定并行计算的粒度。用户可以在创建RDD的时候指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU Cores的数目。

2.对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。用户可以在创建RDD的 时候指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPUCores的数目。

3.RDD之间互相存在依赖关系。RDD的每次转换都会生成一个新的RDD ,所以RDD之前就会形成类似 于流水线一样的前后依赖关系。在部分分区数据丢失时,Spark 可以通过这个依赖关系重新计算丢失部分的分区数据,而不是对 RDD的所有分区进行重新计算。

4.一个Partitioner,即RDD的分片函数。当前Spark 中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另外一个是基于范围的RangePartitioner。只有对于key-value的RDD ,才会有Partitioner,非 key-value 的RDD的 Partitioner的值是None。Partitioner函数不但决定了RDD本身的分片数量,也决定了Parent RDD Shuffle输出时的分片数量。

5.一个列表,存储存取每个Partition的优先位置(preferred location)。对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块位置。安装"移动数据不如移动计算的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。

如何创建RDD

一 由一个存在的Scala集合进行创建。

二 由外部的存储系统的数据集创建,包括本地的文件系统,还有所有 Hadoop支持的数据集,比如HDFS、Cassandra、Hbase。

三 调用一个已经存在了的RDD的Transformation,会生成一个新的RDD。

RDD执行过程

image.png

划分Stage的整体思路:从后往前推,遇到宽依赖就断开,划分为一个Stage。遇到窄依赖,就将这个RDD加入该Stage中,DAG最后一个阶段会为每个结果的Partition生成一个ResultTask。每个Stage里面的Task数量由最后一个RDD的Partition数量决定,其余的阶段会生成ShuffleMapTask。 当RDD对象创建后,SparkContext会根据RDD对象构建DAG有向无环图,然后将Task提交给 DAGScheduler。DAGScheduler根据ShuffleDependency将DAG划分为不同的Stage,为每个Stage生成TaskSet任务集合,并以TaskSet为单位提交给TaskScheduler。TaskScheduler根据调度算法(FIFO/FAIR)对多个TaskSet进行调度,并通过集群中的资源管理器(Standalone模式下是Master,Yarn模式下是 ResourceManager)把Task调度(locality)到集群中Worker的Executor,Executor由SchedulerBackend提供。