以数据源为HDFS上的文件为例:
JavaRDD data_raw = sc.textfile(path, partitionnum),path指定数据所在位置,partitionnum影响data_raw RDD所具有的partition数以及每个partition大小。
首先计算两个值,第一个是与参数partitionnum有关,goalSize = totalSize/partitionnum,totalSize是文件大小,若未传入参数partitionnum,则partitionnum=1。这个goalSize可以看做是用户希望的partition的大小,因为partitionnum影响将文件分为几个partition以及每个partition的大小。
第二个是splitSize = max(minSize,min(goalSize, blockSize)),Apache hadoop 的HDFS blockSize默认为64m
minSize = max(SPLIT_MINSIZE,1),org.apache.hadoop.mapreduce.lib.input.FileInputFormat.SPLIT_SIZE默认值为1,也就是说一个partition的最小Size为1,splitSize可以理解为分片之后实际每个partition的大小。
若是空文件,则goalSize=0,splitSize=1,会产生一个size为1的partition;若不是空文件,则splitSize相当于是考虑用户希望的partition的大小和blockSize的大小,取二者之中更小的那个作为splitSize。
若指定的path中有多个文件,对于小文件(小于splitSize的文件),则一个文件是一个partition;对于大文件(大于splitSize的文件),则分成totalSize/splitSize个partition。