生产环境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次!!!