要玩转大数据,Spark是一款很好的通用的并行计算框架。而经常接触Spark的数据人都会对RDD有一定的了解。那么,RDD到底是什么呢?今天,一起和大圣众包威客平台(www.dashengzb.cn)深入探讨RDD的相关知识点!
概括|RDD的基本介绍
RDD的全称是Resilient Distributed Datasets,顾名思义即为容错的、并行的数据结构。RDD可以让用户将数据显式地存储到磁盘和内存中,并能控制数据的分区。同时,RDD还提供了一组丰富的操作来控制这些数据。RDD一般包含4个部分,分别是:关于“血统”的信息,源码中的dependencies变量;源数据分割后的数据块,源代码中的splits变量;一些关于如何分块和数据存放位置的元信息,如源码中的partitioner和preferred Locations 0;一个计算函数(该RDD如何通过父RDD计算得到),源码中的iterator(split)和compute函数。
另外,RDD有几个核心概念不容忽视:Client——客户端进程,负责提交作业到Master;Master——Standalone模式中的主控节点,负责接收Client提交的作业、管理Worker,并命令Worker启动分配Driver的资源和启动Executor的资源;Worker——Standalone模式中slave节点上的守护进程,负责管理本节点的资源,定期向Master 汇报心跳、接收Master的命令,启动Driver和Executor;Driver——一个Spark作业运行时包括一个Driver进程,也是作业的主进程,负责作业的解析、生成Stage并调度Task到Executor上,其中包括DAG Scheduler、Task Scheduler;Executor——真正执行作业的地方,一个集群一般包含多个Executor,每个Executor接收Driver的命令Launch Task,一个Executor可以执行一到多个Task。
那么,简单而言,RDD有什么特点呢?我们都知道,它是在集群节点上的不可变的、已分区的集合对象,并通过并行转换的方式来创建map、filter、join等等。RDD可以控制存储级别(内存、磁盘等)来进行重用。失败能够自动重建的RDD,还必须是可序列化,而且是静态类型的。还有很值得说明的一点是,RDD中将依赖的两种类型,分别是窄依赖(narrow dependencies)和宽依赖(wide dependencies)。窄依赖是指父RDD的每个分区都只被子RDD的一个分区所使用。相应的,宽依赖是指父RDD的分区被多个子RDD的分区所依赖。例如,map就是一种窄依赖,而join则会导致宽依赖。这种依赖关系分类的特性是,首先,窄依赖可以在某个计算节点上直接通过计算父RDD的某块数据,计算得到子RDD对应的某块数据;其次,数据丢失时,对于窄依赖只需要重新计算丢失的那一块数据来恢复。
辨析|RDD 与 DSM的相异之处
在理论理解上,很多人会混淆RDD和DSM。众所周知,RDD只能通过粗粒度转换来创建,而DSM(Distributed Shared Memory)则允许对每个内存位置上进行数据的读与写。在这种定义下,DSM不仅包括了传统的共享内存系统,也包括了像提供了共享 DHT(distributed hash table)的 Piccolo 以及分布式数据库等。与DSM 相比较,RDD拥有4大优势,分别是高效的容错机制、结点落后问题的缓和(mitigate straggler) 、可批量操作,以及优雅降级(degrade gracefully)。综上,RDD 与 DSM还是有很多相异之处的。
实操|RDD之两种类型操作
看了以上对RDD的介绍后,很想拥有这款强大的数据结构吧。怎样才能获得呢?可以通过以下几种方法:从如HDFS的共享文件系统中获取;改变现有RDD的之久性,毕竟RDD是懒散短暂的;转换已存在的RDD;将已存在的scala集合(只要是Seq对象)并行化 ,通过调用Spark Context的parallelize方法实现。
在实际操作上,怎样去利用RDD呢?事实上,RDD提供了2种类型的操作,分别是transformation和action。Transformation意思是获取一个新的RDD,当然获取的方式有很多,无论是从数据源生成一个新的RDD,或是从RDD中生成一个新的RDD等方法都适用。而Action则是得到一个值,或者一个结果,例如直接将RDD cache到内存中去,它不会生成新的RDD,而只是将RDD上某项操作的结果返回给程序。值得注意的是,所有的transformation采用的都是懒策略,就是如果只是将transformation提交,那么RDD是不会执行计算(记录lineage)的,计算只有在action被提交的时候才会被触发。
汇总|RDD的常见术语
在执行RDD时,会遇到不少专业词汇,今天一次性看看有哪些:
RDD——Resilient Distributed Datasets的简称,即弹性分布式数据集,是Spark最核心的模块和类。
DAG Scheduler——实现将Spark作业分解成一到多个Stage,每个Stage根据RDD的Partition个数决定Task的个数,然后生成相应的Task set放到Task Scheduler中。
Task Scheduler——实现Task分配到Executor上执行。
Task——运行在Executor上的工作单元。
Stage——每个Job会被拆分很多组任务(task),每组任务被称为Stage,也称Task Set。
Job——Spark Context提交的具体Action操作,常和Action对应。
Data Frame——带有Schema信息的RDD,主要是对结构化数据的高度抽象。
Data Set——结合了Data Frame和RDD两者的优势,既允许用户很方便地操作领域对象,又具有SQL执行引擎的高效表现。
以上汇总的是最常见的执行RDD时遇到的专业术语,当然还有很多常见术语,在此不一一列出。
DT时代,Spark作为玩转大数据的常用工具,熟悉它最核心的模块和类——RDD,定能为你的工作增添不少方便。
原文地址:http://www.dashengzb.cn/articles/a-357.html
作者:大圣众包
链接:https://www.jianshu.com/p/7c545ee6b3c0