阅读量:7
目录
一、事件复盘:
hdfs无法创建新的文件,xceivercount超过最大设置,平时每个datanode只有100个左右的连接,突然达到8000以上。
事故原因,跨多天的动态分区导致: sql如下
set hive.exec.reducers.max=1000; INSERT INTO TABLE table1 PARTITION (dt) select uid, times, memo, idfa, dt from table2 where dt>=20230101 and dt<=20231231 distribute by rand()
使用动态分区虽然非常方便,但会带来很多小文件,像上面这个sql,动态分区是365天,reduce是1000个,如果计算比较复杂,资源充足,就会同时创建365*1000个文件。 因为是动态分区,每个reduce都要写365个文件到各自的分区中,因为数据by rand()把数据打散了。
二、解决方案:
1、降低同时正在运行的reduce数
配置如下:
mapreduce.job.running.reduce.limit=200;
这样同时运行的reduce只能到200,就是有一年的分区,也最多创建 365*200个文件。
2、如果想限制动态分区的跨天范围,也可以做如下限制
hive.exec.max.dynamic.partitions=100;
也就是动态分区只能一次创建100个,超过会报错。
3、其实动态分区不适合跨天的情况,跨天数据重跑完全可以按天一天一天的补,通过提高重跑天的次数来完成并发。
三、讨论
有人会觉得我可以增大xceivercount的数目,来避免这个问题,但是这个首先要重启datanode,另外,这个方案始终(目前已经达到了8000个连接一台机器)还是会导致大量的连接数存在,对整个集群不是很友好,还是尽量减少小文件的生成为最佳