2023年11月26日发(作者:)

Spark⼩⽂件合并

1.问题描述

最近使⽤spark sql执⾏etl时候出现了,最终结果⼤⼩只有⼏百k,但是⼩⽂件⼀个分区有上千的情况。

危害:

1. hdfs有最⼤⽂件数限制

2. 浪费磁盘资源(可能存在空⽂件);

3. hive中进⾏统计,计算的时候,会产⽣很多个map,影响计算的速度。

2.解决⽅法

1. ⽅法⼀:通过spark的coalesce()⽅法和repartition()⽅法

val rdd2 = ce(8, true) true表⽰是否shuffle

val rdd3 = ition(8)

说明:

coalesce:coalesce()⽅法的作⽤是返回指定⼀个新的指定分区的Rdd,

如果是⽣成⼀个窄依赖的结果,那么可以不发⽣shuffle,

分区的数量发⽣激烈的变化,计算节点不⾜,不设置true可能会出错。

repartition:coalesce()⽅法shuffle为true的情况。

1. ⽅便的话,可以采⽤coalesce()⽅法和repartition()⽅法

2. 如果任务逻辑简单,数据量少,可以直接降低并⾏度