Spark工作机制(一)——RDD的概念

注:本博客文章在 https://yyddbull.github.io/coffeecat/  同步更新

要了解Spark工作机制,首先要知道几个概念,第一个就是RDD:

1、什么是RDD

RDD(Resilient Distributed Datasets) 是 Spark 的核心概念,中文名是弹性数据集,通俗的讲可以理解为是一种抽象的大规模数据集合,或者是一个大的数组,这个数组是分布在集群上的,Spark会在这个数据集合上做一系列的数据处理、计算,然后产生新的RDD,直到最后得到计算结果。

至于为什么叫弹性数据集,弹性如何解释?这里是指在任何时候都能进行重算。举个例子,当集群中的一台节点故障导致RDD丢失后,Spark还可以重新计算出这部分的分区的数据,所以,RDD是一种天生具有容错机制的特殊集合,不需要通过数据冗余的方式(比如检查点)实现容错,对用户来说,感觉不到这部分的内容曾经丢失,所以RDD数据集就像一个海绵一样,无论如何挤压都是完整的。

2、RDD的特性

Spark官网对RDD的描述:

  • A list of partitions
  • A function for computing each split
  • A list of dependencies on other RDDs
  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)

解释如下:

  • 是一组分区(partition),类似hadoop,能够被切分,从而实现并行计算,如图1所示,RDD1中有3个区分(p1,p3,p4),分别存储在3个节点上
  • 有一个函数计算分片,每个RDD都会实现compute函数,对每个分区内的数据进行计算
  • 依赖其他RDD的列表,例如由于RDD的转换生成一个新的RDD,这样RDD之间就会形成类似于流水线一样的前后依赖关系
  • 可选,一个分区函数。Spark中有HashPartitioner和RangePartitioner。只有对于于key-value的RDD,才会有Partitioner,非key-value的RDD的Parititioner的值是None
  • 可选,一个存储存取每个Partition的优先位置的列表。对于HDFS文件来说,这个列表保存的就是每个Partition所在块的位置

                               

                                                                        图1 RDD数据模型

3、RDD的操作分类

RDD有2种操作类型:

  • 转换(transformations) :从已经存在的数据集中创建一个新的数据集,会创建一个新的RDD,例如map操作,会针对将数据集的每个元素传给函数处理,并生成一个新的RDD
  • 动作(actions) :在数据集上进行计算之后返回一个值到驱动程序,例如reduce动作,使用函数聚合RDD所有元素,并将结果返回给驱动程序

常用的Transformation如下:

  • map(func):返回一个新的分布式数据集,该数据集由每一个输入元素经过func函数转换后组成
  • fitler(func):返回一个新的数据集,该数据集由经过func函数计算后返回值为true的输入元素组成
  • flatMap(func):类似于map,但是每一个输入元素可以被映射为0或多个输出元素(因此func返回一个序列,而不是单一元素)
  • mapPartitions(func):类似于map,但独立地在RDD上每一个分片上运行,因此在类型为T的RDD上运行时,func函数类型必须是Iterator[T]=>Iterator[U]
  • mapPartitionsWithSplit(func):类似于mapPartitons,但func带有一个整数参数表示分片的索引值。因此在类型为T的RDD上运行时,func函数类型必须是(Int,Iterator[T])=>Iterator[U]
  • sample(withReplacement,fraction,seed):根据fraction指定的比例对数据进行采样,可以选择是否用随机数进行替换,seed用于随机数生成器种子
  • union(otherDataSet):返回一个新数据集,新数据集是由原数据集和参数数据集联合而成
  • distinct([numTasks]):返回一个包含原数据集中所有不重复元素的新数据集
  • groupByKey([numTasks]):在一个(K,V)数据集上调用,返回一个(K,Seq[V])对的数据集。注意默认情况下,只有8个并行任务来操作,但是可以传入一个可选的numTasks参数来改变它
  • reduceByKey(func,[numTasks]):在一个(K,V)对的数据集上调用,返回一个(K,V)对的数据集,使用指定的reduce函数,将相同的key的值聚合到一起。与groupByKey类似,reduceByKey任务的个数是可以通过第二个可选参数来设置的
  • sortByKey([[ascending],numTasks]):在一个(K,V)对的数据集上调用,K必须实现Ordered接口,返回一个按照Key进行排序的(K,V)对数据集。升序或降序由ascending布尔参数决定
  • join(otherDataset0,[numTasks]):在类型为(K,V)和(K,W)数据集上调用,返回一个相同的key对应的所有元素在一起的(K,(V,W))数据集
  • cogroup(otherDataset,[numTasks]):在类型为(K,V)和(K,W)数据集上调用,返回一个(K,Seq[V],Seq[W])元祖的数据集。这个操作也可以称为groupwith
  • cartesain(ohterDataset):笛卡尔积,在类型为T和U类型的数据集上调用,返回一个(T,U)对数据集(两两的元素对)
     

常用的Action如下:

  • reduce(func):通过函数func(接收两个参数,返回一个参数)聚集数据集中的所有元素。这个功能必须可交换且可关联的,从而可以正确的并行运行
  • collect():在驱动程序中,以数组形式返回数据集中的所有元素。通常在使用filter或者其他操作返回一个足够小的数据子集后再使用会比较有用
  • count():返回数据集元素个数
  • first():返回数据集第一个元素(类似于take(1))
  • take(n):返回一个由数据集前n个元素组成的数组,注意 这个操作目前并非并行执行,而是由驱动程序计算所有的元素
  • takeSample(withReplacement,num,seed):返回一个数组,该数组由从数据集中随机采样的num个元素组成,可以选择是否由随机数替换不足的部分,seed用户指定随机数生成器种子
  • saveAsTextFile(path):将数据集的元素以textfile的形式保存到本地文件系统--HDFS或者任何其他Hadoop支持的文件系统。对于每个元素,Spark将会调用toString方法,将它转换为文件中的文本行
  • saveAsSequenceFile(path):将数据集中的元素以Hadoop sequencefile的格式保存到指定的目录下,可以是本地系统、HDFS或者任何其他的Hadoop支持的文件系统。这个只限于由key-value对组成,并实现了Hadoop的Writable接口,或者可以隐式的转换为Writable的RDD(Spark包括了基本类型转换,例如Int、Double、String等)
  • countByKey():对(K,V)类型的RDD有效,返回一个(K,Int)对的map,表示每一个key对应的元素个数
  • foreach(func):在数据集的每一个元素上,运行函数func进行更新。通常用于边缘效果,例如更新一个叠加器,或者和外部存储系统进行交互,如HBase
     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章