RDD的核心方法:
首先看1下getPartitions方法的源碼:
getPartitions返回的是1系列partitions的集合,即1個(gè)Partition類型的數(shù)組
我們就想進(jìn)入HadoopRDD實(shí)現(xiàn):
1、getJobConf():用來獲得job Configuration,獲得配置方式有clone和非clone方式,但是clone方式 是not thread-safe,默許是制止的,非clone方式可以從cache中獲得,如cache中沒有那就創(chuàng)建1個(gè)新的,然后再放到cache中
2、進(jìn)入 getInputFormcat(jobConf)方法:
3、進(jìn)入inputFormat.getSplits(jobConf, minPartitions)方法:
進(jìn)入FileInputFormcat類的getSplits方法:
5、進(jìn)入HadoopPartition:
而getDependencies表達(dá)是RDD之間的依賴關(guān)系,以下所示:
getDependencies返回的是依賴關(guān)系的1個(gè)Seq集合,里面的Dependency數(shù)組中的下劃線是類型的PlaceHolder
我們進(jìn)入ShuffledRDD類中的getDependencies方法:
我們進(jìn)入ShuffleDependency類:
每一個(gè)RDD都會(huì)具有計(jì)算的函數(shù),以下所示:
我們進(jìn)入HadoopMapPartitionsWithSplitRDD的 compute方法:
Compute方法是針對(duì)RDD的每一個(gè)Partition進(jìn)行計(jì)算的,其TaskContext參數(shù)的源碼以下:
getPreferredLocations是尋覓Partition的首選位置:
我們進(jìn)入NewHadoopRDD的getPreferredLocations:
其實(shí)RDD還有1個(gè)可選的分區(qū)策略:
Partitioner的源碼以下:
可以看出默許使用的是HashPartitioner,要注意key為Array的情況;
spark.default.parallelism必須要設(shè)置,否則會(huì)根據(jù)partitions數(shù)據(jù)來傳輸RDD,這樣也會(huì)很容易出現(xiàn)OOM