spark RDD textFile算子 分区数量详解

spark RDD textFile算子 分区数量详解进入textFile原码
发现 分区数量调用 hadoopFile中的TextInputFormat类,传入参数Key为LongWritable即偏移量,value为Text,
由此得知是通过这个类来读取

继续进入TextInputFormat类中
spark RDD textFile算子 分区数量详解发现有个是否可以切分的判断,可以知道 一些不可拆分的文件由此过滤掉,可以切片拆分的文件继续往下寻找却没有相关处理逻辑 ,所以我们向上去到父类FileInputFormat中

spark RDD textFile算子 分区数量详解找到如上逻辑,调用了listStatu与namenode交互获取文件属性,把要读取的文件总长度计算出来 totalSize

spark RDD textFile算子 分区数量详解下面找到一个关键变量goalSize他的值为所有文件总长度除以默认最小分区数,
中间过程不一一赘述,关键代码在computeSplitSize
进入computeSplitSize中
spark RDD textFile算子 分区数量详解三个参数值 goalSize上述计算过,minSize默认为1,blockSize为HDFS默认块大小 128M
computeSplitSize主处理很简单,先比较goalSize和blockSize大小取两者最小的,再与minSize比较取两者最大的 最终结果赋给splitSize
spark RDD textFile算子 分区数量详解

之后回到先前逻辑, 定义一个bytesRemaining接收每个文件的长度,进入while循环 条件为
文件长度/splitSize >1.1即SPLIT_SLOP便执行切分操作 直到条件不满足 停止循环切分

举例说明:
4个文件长度分别为100 100 100 1400字节,默认最小分区为2
首先计算全部文件总长度totalSize=100+100+100+1400=1700
goalSize=totalSize/最小分区数即2 =850
blockSize=128M换算成字节为134217728
minSize=1
goalSize与blockSize取最小 值为850
850 与minSize取最大 值为850
即splitSize为850
然后 每个文件长度除以850 判断是否大于1.1
文件1,2,3都是100所以各生成1个分区,
文件4位1400,除以850>1.1 切分一个分区,剩余
(1400-850)/850 >1.1不再成立 又生成一个分区.
所以举例中的四个文件 共生成5个分区

上一篇:hive添加txt文件转oec表


下一篇:官网阅读——走近Spark之QuickStart