CDH6.3集群Hive查询Parquet表执行count(1)出现OOM问题咨询
OOM触发原因
- 导入的Parquet文件存在超大行组:Parquet是按行组为单位读取的,读取时需要将整个行组一次性加载到内存中。你从其他集群迁移来的Parquet文件可能配置了远大于当前集群默认值的行组大小,哪怕总数据只有4.5GB,只要单个行组的解压后大小超过Map任务的堆内存上限,就会直接触发OOM。
- Parquet压缩特性导致内存放大:磁盘上存储的是压缩后的Parquet数据,加载到内存解压后体积可能达到磁盘大小的3~10倍,看起来4.5GB的小文件,实际解压后的内存占用会远高于磁盘占用。
- 默认Map任务堆内存配置过低:CDH 6.3默认的Map任务堆内存通常只有1~2GB,完全不足以支撑大尺寸Parquet行组的读取需求。
- 输入分片过大:如果启用了CombineFileInputFormat,多个小Parquet文件被合并为一个大分片交给单个Map处理,也会进一步推高单个Map的内存需求。
需要调整的参数
你可以先在Hive会话中临时设置以下参数测试,验证生效后再根据集群实际负载调整全局配置:
- 调整Map任务容器及堆内存大小:容器总内存建议设置为4~8GB,JVM堆内存设置为容器总内存的80%左右,预留空间给堆外内存使用:
set mapreduce.map.memory.mb=8192; set mapreduce.map.java.opts=-Xmx6554m;
- 限制单个输入分片的最大大小,避免单个Map处理过多数据:
set mapreduce.input.fileinputformat.split.maxsize=536870912;
- (长期优化建议)将迁移来的Parquet文件重新写入一次,生成符合当前集群配置的标准格式文件,避免后续再出现行组不匹配的问题:
INSERT OVERWRITE TABLE tableA SELECT * FROM tableA;
内容的提问来源于stack exchange,提问作者user2894829
相关产品推荐
相关产品推荐

