什么是RDD
分布式计算会带来的问题有:
- 分区控制
- Shuffle控制
- 数据存储\序列化\发送
- 数据计算API
- 等一系列的问题
这些功能不能使用python内置的本地集合对象(List\字典等)去完成,我们在分布式框架中,需要有一个统一的数据抽象的对象,来实现上述分布式计算所需要的功能
这个对象就是RDD
RDD(Reslient Distributed Dataset):弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变的,可分区,里面的元素可并行计算的集合。Distributed分布式,RDD中数据的存储是分布式存储的(RDD的数据是跨越机器来存储的跨进程)
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 RDD (RDD之间有依赖关系)
- Optionally, a Partitioner for key-value RDDs
- Optionally, a list of preferrd location to compute each split on (RDD分区数据的读取会尽量数据读取所在地)
RDD中的分区是RDD数据存储的最小单位,分区是物理概念,以多个分区物理的对象抽象成一个逻辑上的概念RDD。
import findspark
findspark.init()
from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName("rdd_init").setMaster("local[*]")
sc = SparkContext(conf=conf)
rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7], 3)
print(rdd.glom().collect())
Key-Value型的RDD是可以分区器,默认分区器:Hash分区规则,也可以手动设置一个分区器(rdd.partitionBy的分区方法来设置),这个特性是可能吗,因为不是所有的RDD都是k-v型的;
RDD的分区规划,会尽量靠近数据所在的服务器,这样可以走本地读取,避免网络读取,本地读取的性能是大于网络读取的性能,spark会在确保并行计算的能力的前提下,尽量的去确保本地读取,所以这个特性也是可能的。