SparkCore-核心数据集RDD
??今天真是美好的一天啊,那我们开始吧,我们今天讲一下RDD,为什么要将RDD了,先说一下我,作为一枚标准的理工男,如果没有彻底弄明白一个东西,就去实操,那肯定是一脸懵逼的,即使瞎一道题目猫碰上死耗子,暂时有了正确结果,但是题目文件类型一变,那又将是懵逼树上懵逼果,懵逼树下你和我。还记得高中化学,1mol水分子=2mol氢原子+1mol氧原子,没有弄明白mol的我,为什么2+1=1???
??好吧 就这样。因为初步我们的数据集都将是一个一个的RDD(这里我的理解是RDD是一个模板,会随数据复刻出许许多多的RDD),但是不明白RDD,我们很难讲一个RDD转化为另一个RDD。在SparkCore中,数据处理就是RDD之间的互相转换。 在Spark源码中对于RDD的描述是这样的:
A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. Represents an immutable, partitioned collection of elements that can be operated on in parallel. This class contains the basic operations available on all RDDs, such as map, filter, and persist. In addition, PairRDDFunctions contains operations available only on RDDs of key-value pairs, such as groupByKey and join; DoubleRDDFunctions contains operations available only on RDDs of Doubles; and SequenceFileRDDFunctions contains operations available on RDDs that can be saved as SequenceFiles. All operations are automatically available on any RDD of the right type (e.g. RDD[(Int, Int)]) through implicit.
Internally, each RDD is characterized by five main properties:
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)
All of the scheduling and execution in Spark is done based on these methods, allowing each RDD to implement its own way of computing itself. Indeed, users can implement custom RDDs (e.g. for reading data from a new storage system) by overriding these functions. Please refer to the Spark paper for more details on RDD internals.
说人话就是:Resilient Distributed Dataset (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)
好吧,我不是人。 1、RDD的理解
RDD了。我们可以将 RDD 理解为一个分布式对象集合,本质上是一个只读的分区记录集合。每个 RDD 可以分成多个分区,每个分区就是一个数据集片段。一个 RDD 的不同分区可以保存到集群中的不同结点上,从而可以在集群中的不同结点上进行并行计算。 阁下请看图:
我们就好比RDD是一个长度为4的二维列表,四个小列表分别存储在不同的集群节点上(这仅代表我不成熟的想法)。 RDD 具有容错机制,并且只读不能修改,可以执行确定的转换操作创建新的 RDD。具体来讲,RDD 具有以下几个属性。
只读:不能修改,只能通过转换操作生成新的 RDD。
分布式:可以分布在多台机器上进行并行处理。
弹性:计算过程中内存不够时它会和磁盘进行数据交换。
基于内存:可以全部或部分缓存在内存中,在多次计算间重用。
2、RDD的属性 ??我们又要回到官方的解释了,别怕哈,这次我们来翻译。
-
A list of partitions 即数据集的基本组成单位。对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU Core的数目。 -
A function for computing each split 一个计算每个分区的函数。Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。 -
A list of dependencies on other RDDs 一个计算每个分区的函数。Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。 -
Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) 一个计算每个分区的函数。Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。 -
Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file) 一个计算每个分区的函数。Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。
|