Spark Runtime包含Spark的基本功能,这些功能主要包括任务调度、内存管理、故障恢复以及和存储系统的交互等。Spark的一切操作都是基于RDD实现的,RDD是Spark中最核心的模块,也是Spark设计的精华所在。
9.3.2.1 RDD
RDD(Resilient Distributed Datasets,简称RDD)即弹性分布式数据集,可以简单地把RDD理解成一个提供了许多操作接口的数据集合,和一般数据集不同的是,其实际数据分布存储在磁盘和内存中。
对开发者而言,RDD可以看作是Spark中的一个对象,它本身运行于内存中,如读文件是一个RDD,对文件计算是一个RDD,结果集也是一个RDD,不同的分片、数据之间的依赖、Key-Value类型的Map数据都可以看作RDD。RDD是一个大的集合,将所有数据都加载到内存中,方便进行多次重用。
例如经典的WordCount程序,其在Spark编程模型下的操作方式如图9-8所示。
图9-8 WordCount程序在Spark编程模型下的RDD转换
操作步骤如下:
(1)使用textFile函数读取文件系统中的文本文件,创建RDD1。
(2)RDD1经过flatMap(类似于Map)函数转换得到RDD2。
(3)RDD2再经过reduceByKey函数转换得到RDD3。
(4)RDD3中的数据重新写回文件系统。
可以看到Spark的一切操作都是基于RDD实现的。(www.xing528.com)
使用RDD的好处如下:
(1)RDD是分布式的,可以分布在多台机器上,进行计算。
(2)RDD是弹性的,在计算处理过程中,机器的内存不够时,它会和硬盘进行数据交换。
(3)RDD计算的中间结果会被保存。出于可靠性考虑,同一个计算结果也会在集群中的多个节点进行保存备份。
(4)如果其中的某一数据子集在计算过程中出现了问题,针对该数据子集的处理会被重新调度,进而完成容错机制。
9.3.2.2 RDD的操作类型与DAG图
RDD提供了丰富的编程接口来操作数据集合,一种是Transformation操作,另一种是Action操作。
(1)Transformation的返回值是一个RDD,如Map,Filter,Union等操作。它可以理解为一个领取任务的过程。如果只提交Transformation是不会提交任务来执行的,任务只有在Action提交时才会被触发。
(2)Action返回的结果把RDD持久化起来,是一个真正触发执行的过程。它将规划以任务(Job)的形式提交给计算引擎,由计算引擎将其转换为多个Task,然后分发到相应的计算节点,开始真正的处理过程。
Spark的计算发生在RDD的Action操作,而对Action之前的所有Transformation,Spark只是记录下RDD生成的轨迹,而不会触发真正的计算。
Spark内核会在需要计算发生的时刻绘制一张关于计算路径的有向无环图(Directed Acyclic Graph,简称DAG)。举个例子,在图9-9中,从输入中逻辑上生成A和C两个RDD,经过一系列Transformation操作,逻辑上生成了F,注意,这时候计算没有发生,Spark内核只是记录了RDD的生成和依赖关系。当F要进行输出(进行了Action操作)时,Spark会根据RDD的依赖生成DAG,并从起点开始真正的计算。
图9-9 有向无环图DAG的生成
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。