1.问题描述
最近使用spark sql执行etl时候出现了,最终结果大小只有几百k,但是小文件一个分区有上千的情况。
危害:
- hdfs有最大文件数限制
- 浪费磁盘资源(可能存在空文件);
- hive中进行统计,计算的时候,会产生很多个map,影响计算的速度。
2.解决方法
-
方法一:通过spark的coalesce()方法和repartition()方法
val rdd2 = rdd1.coalesce(8, true) (true表示是否shuffle)
val rdd3 = rdd1.repartition(8)
说明:
coalesce:coalesce()方法的作用是返回指定一个新的指定分区的Rdd,
如果是生成一个窄依赖的结果,那么可以不发生shuffle,
分区的数量发生激烈的变化,计算节点不足,不设置true可能会出错。repartition:coalesce()方法shuffle为true的情况。
但是由于使用的是同事直接写好的模块,改新增函数相对比较麻烦,所以作为后手。
-
方法二:降低spark并行度,即调节spark.sql.shuffle.partitions
比如之前设置的为100,按理说应该生成的文件数为100;
但是由