RDD是由若干个partition构成的,一份待处理的原始数据会被按照相应的逻辑切分成n份,每份数据对应到RDD中的一个Partition,Partition的数量决定了task的数量,影响着程序的并行度,所以理解Partition是了解spark背后运行原理的第一步。
RDD的生成方式共有三种:
- 从Scala集合中创建,通过调用sc.makeRDD()和sc.parallelize()生成
- 加载外部数据来创建RDD,调用sc.textFile()方法
- 由其他RDD执行transform操作转换而来
一般来说,加载Scala集合或者外部数据创建RDD的时候可以指定partition个数
决定RDD的每一条消息应该分到哪一个分区的就是Partitioner,只有<key,value>形式的RDD才有Partitioner
Partitioner主要有两种,分别是Hash Partititoner(默认)和Range Partititoner.
使用Partitioner必须满足两个前提:1.rdd必须是<key,value>形式 2.发生shuffle操作
data skew(数据倾斜):由于hash计算出的key值对应的数据量大小不同导致的,解决办法是通过自定义partitioner来解决