1、内存数据的切片逻辑
val conf = new SparkConf().setMaster("local[*]").setAppName("RDD")
conf.set("spark.default.parallelism", "4")
val sc = new SparkContext(conf)
val rdd1 : RDD[Int] = sc.makeRDD(Seq(1,2,3,4,5), 3)
rdd1.saveAsTextFile("output")
sc.stop()
源码跟进
defaultParallelism逻辑
defaultParallelism分析过程
defaultParallelism小总结
1、由 setMaster 决定 local 默认 1 local[*] 默认线程数
2、由参数 spark.default.parallelism 决定
3、直接在函数中传入
权重 依次 3 > 2 > 1
切片逻辑
切片逻辑小总结
核心方法是 positions
根据序列的大小,以及分区数,计算出每个切片的首位索引
然后算出每个切片的数据
2、文件数据的切片逻辑
val conf = new SparkConf().setMaster("local[*]").setAppName("RDD")
val sc = new SparkContext(conf)
val rdd = sc.textFile("data/word.txt", 3)
rdd.saveAsTextFile("output")
sc.stop()
其他
切片流程小分析
1、计算 goalSize long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
由文件大小 / 切片数 比如 10G 文件 / 2个 切片 goalSize = 5G
2、计算 minSize Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input. FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);
mapreduce.input.fileinputformat.split.minsize
minSize 得到 值 1
3、计算 blockSize = file.getBlockSize(); 本地 32M,hadoop 集群默认 128M
4、splitSize = Math.max(minSize (1), Math.min(goalSize(5G), blockSize (128M));
最终 切片大小为 128M
5、SPLIT_SLOP = 1.1 如果最后1个切片的大小小于切片的 10 % ,将会合并到前1个切片中,形成最终切片
案例分析
123
456
789
注意光标的位置
因为存在换行符 所以 11 = 9 + 2 (2个换行符)
hadoop 是按行读取文件,不是字符
11 / 3 = 3.6666666.... > 3.1 ===> 4 个分区文件
splitSize = 3
123# 0123
456# 4567
789 8910
[0, 3] => [123] [3, 6] => [456] [6, 9] => [789] [9, 10] => []
文件切片小总结
分区数据的处理也是由Hadoop决定的。 hadoop在计算分区时会处理数据时的逻辑不一样。 核心公式: long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits); splitSize = Math.max(minSize , Math.min(goalSize, blockSize); Spark读取文件数据底层使用的就是hadoop读取的,所以读取规则用的是hadoop hadoop读取数据是按行读取的,不是按字节读取 hadoop读取数据是偏移量读取的 hadoop读取数据时,不会重复读取相同的偏移量