Spark SQL处理小文件

生产环境DataNode仅有7个,每个datanode文件数阈值50w块,
也就是说整个集群共能容纳7 * 50w=350w / 3个副本 =120w块!
有张表按照年月日分区=10年12月365天=4.4w块,仅能存25张此表。
正常情况下分布:
10000块 * 20张、
1000块 * 200张、
100块 * 2000张、
10块 * 20000张、
实际生产中会产生很多小文件,占用集群资源,为此很头疼,必须妥善处理,方法如下:
在这里插入图片描述
方法一 使用repartition(spark2.4之后)

spark.sql("create table table1 as select /*+ REPARTITION(4) */ * from table_1 where age >18 ")

方法二 使用hive默认合并方式(配置并行度)

insert overwrite table table_1 select * from table_1;
#分区表
insert overwrite table table_1 partition (day_time='2018-09-01') select * from table_1 where day_time = '2019-08-01';

根据实际情况:
1亿条数据量大约40G(年数据量),按照目前集群性能:
repartition(4)需要25min左右
repartition(10)需要10min左右
假如采用 repartition(4)方式,某个workflow共生成3个宽表计算的话需要额外花费25 * 3=75min
假如采用 repartition(10)方式,某个workflow共生成3个宽表计算的话需要额外花费10 * 3=30min
也就是说通过repartition的形式减少小文件并不理想,实际还是需要写程序单独处理小文件个数。然后定时任务1个月执行1次!!!

发布了118 篇原创文章 · 获赞 25 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/lhxsir/article/details/99588064