Spark分区原理和数据的分布
将从内存数据和文件数据两个方向,讲述下数据如何分区,分区后的数据如何分配的问题
本实例使用本地模式实践解析
1. 集合数据的分区和数据分布
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("parallelism")
//sparkConf.set("spark.default.parallelism","5")
val sc = new SparkContext(sparkConf)
val rdd = sc.makeRDD(List(1,2,3,4,5),3)
// 将处理的数据保存成分区文件
rdd.saveAsTextFile("output")
sc.stop()
1.1 集合数据如何设置分区数
- 使用makeRDD
第二个参数表示分区数量,如果第二个参数不传递,则使用默认的并行度:defaultParallelism
override def defaultParallelism(): Int = backend.defaultParallelism()
override def defaultParallelism(): Int =
scheduler.conf.getInt("spark.default.parallelism", totalCores)
通过源码可知:
Spark会从配置对象"spark.default.parallelism"中获取分区数
如果获取不到,则使用totalCores属性,totalCores表示当前环境的最大处理器核数(本地模式下就是cpu的核数)
- 修改配置
sparkConf.set(“spark.default.parallelism”,“5”)
sparkConf.setMaster(“local[4]”)
local[*]表示分区数为处理器核算,local[4]表示指