文章目录
一 RDD分区和并行度
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合
默认情况下,Spark可以将一个作业切分多个任务后,发送给Executor节点并行计算,而能够并行计算的任务数量称之为并行度。这个数量可以在构建RDD时指定。
注意这里的并行执行的任务数量,并不是指的切分任务的数量。
1 分区原理
可分区:让数据能够并行计算,采用分区的概念,与kafka中的分区略有不同,kafka的分区可以保存数据,而RDD的分区不保存数据
既然RDD中的分区不存储数据,那么分区有什么用呢?
答:当有多个Executor多个Task时,为防止热点,过载问题,通过分区指示数据走哪个分区,可以将分区理解为管道,数据理解为水,水在管道中流,流过之后水并不会留在管道中
2 分区数量
saveAsTextFile方法可以生成分区文件,将数据按照分区的形式保存为文件,有几个分区就会保存几份文件
文件的保存过程由Executor完成,目前分区数量为系统默认(local[*])
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[*]").setAppName("RDD")
val sc = new SparkContext(conf)
val rdd1 = sc.makeRDD(
List(1,2,3,4)
)
rdd1.saveAsTextFile("output")
sc.stop()
}
如果构建RDD时,没有指定数据处理分区的数量,就会使用默认分区的数量
mkRDD方法存在第二个参数,代表分区的数量numSlices(存在默认值)
默认值为:scheduler.conf.getInt("spark.default.parallelism", totalCores)
其中conf指向的是以下代码中的conf
取到值使用spark.default.parallelism,取不到使用totalCores
如:conf.set("spark.default.parallelism","4")
totalCores : 当前Master环境的总(虚拟)核数,非系统的总核数,不是固定值
local:1个
local[2]:2个
local[*]:机器的总核数
分区设置的优先级 : 方法参数 > 配置参数 > 环境配置,只会使用一个
方法参数:
val rdd1 = sc.makeRDD(
List(1,2,3,4),1
)
配置参数:
conf.set("spark.default.parallelism","2")
环境配置:
val conf