在spark中,有一个不可变的分布式数据结构,即弹性分布式数据集(RDD),它是逻辑集中的实体,在集群中的多个节点上被分为多个分区。通过对多个节点上不同RDD分区的控制,能够减少机器之间的数据重排(data shuffling)。
Spark提供了一个”partitionBy”运算符,能够通过集群中多个节点之间对原始RDD进行数据再分配来创建一个新的RDD。
RDD是spark的核心数据结构,通过RDD的依赖关系形成spark的调度顺序。通过对RDD的操作形成整个spark程序。
RDD 可以包含 Python、Java、Scala 中任意类型的对象,甚至可以包含用户自定义的对象。
(1)RDD的三种生成方式
1)从Hadoop文件系统(与Hadoop兼容的其他持久化存储系统,如Hive、Cassandra、Hbase)输入(如HDFS)创建。
例如:
>>> lines = sc.textFile("test.txt")
2)在驱动器程序里分发驱动器程序中的对象集合(比如list和set)。
>>> lines = sc.parallelize(List(1,2,3))
3)从父RDD转换得到新的RDD
>>>testlines = lines.filter(line=>line.contains("spark"))
RDD其实并没有存储数据,只是数据的一个映像,RDD的内部属性有以下部分:
1)分区列表。
2)计算每个分区的函数
3)对父RDD的依赖列表
4)对key-Value对数据类型RDD的分区器,控制分区策略和分区数
5)每个数据分区的地址列表(如HDFS上的数据块的地址)
RDD支持粗粒度和细粒度的读操作。RDD上的很多函数操作(count和collect等)都是批量读操作,即扫描整个数据集,可以将任务分配到距离数据最近的节点上。同时,RDD也支持细粒度操作,即在哈希或范围分区的RDD上执行关键字查找。