其它
1.Spark 广播变量的实现和原理
实现:调用SparkContext的broadcast(v)
函数即可。
原理:将要发送的数据向每个executor发一份只读数据,而不是向task发送,因此节省了很多时间。
使用场景:任务跨多个Stage,因为执行任务前Spark就会将一个Stage所需数据发到所在节点,因此单个Stage所
用数据不必再通过广播发送。
2.Spark 中的并行度等于什么
并行度概念:spark作业中,各个stage的task的数量,也就代表了spark作业在各个阶段stage的并行度;
-
如何设置?
- 增加 task 数据量
- 官方推荐 总核心数的 2 - 3 倍
- 增加 block 数量
- 如果读取的数据在HDFS上,增加block数,默认情况下split与block是一对一的,而split又与RDD中的partition对应,所以增加了block数,也就提高了并行度
- 算子中指定
reduceByKey(_+_, 分区数)
- 使用
repartition()
或coalesce()
动态调整分区- repartition() 强制触发Shuffle,可增加或减少分区数,适用于需要均匀分布数据的场景
注意:该方法会全量重分布数据,可能增加网络开销
val mergedRdd = rdd.coalesce(50) // 合并为50个分区(无Shuffle)
coalesce()
主要用于减少分区数(默认不触发Shuffle),适合合并小文件或优化资源利用:
若需增加分区或避免数据倾斜,可设置 shuffle=true 触发Shuffleval mergedRdd = rdd.coalesce(50) // 合并为50个分区(无Shuffle)
- repartition() 强制触发Shuffle,可增加或减少分区数,适用于需要均匀分布数据的场景
- 增加 task 数据量