RDD是由若干個partition構(gòu)成的痪宰,一份待處理的原始數(shù)據(jù)會被按照相應(yīng)的邏輯切分成n份铐拐,每份數(shù)據(jù)對應(yīng)到RDD中的一個Partition丢胚,Partition的數(shù)量決定了task的數(shù)量销钝,影響著程序的并行度,所以理解Partition是了解spark背后運行原理的第一步酱固。
RDD的生成方式共有三種:
- 從Scala集合中創(chuàng)建械念,通過調(diào)用sc.makeRDD()和sc.parallelize()生成
- 加載外部數(shù)據(jù)來創(chuàng)建RDD,調(diào)用sc.textFile()方法
- 由其他RDD執(zhí)行transform操作轉(zhuǎn)換而來
一般來說运悲,加載Scala集合或者外部數(shù)據(jù)創(chuàng)建RDD的時候可以指定partition個數(shù)
決定RDD的每一條消息應(yīng)該分到哪一個分區(qū)的就是Partitioner龄减,只有<key,value>形式的RDD才有Partitioner
Partitioner主要有兩種,分別是Hash Partititoner(默認)和Range Partititoner.
使用Partitioner必須滿足兩個前提:1.rdd必須是<key,value>形式 2.發(fā)生shuffle操作
data skew(數(shù)據(jù)傾斜):由于hash計算出的key值對應(yīng)的數(shù)據(jù)量大小不同導致的班眯,解決辦法是通過自定義partitioner來解決