Dataproc集群Hive on Tez任务运行10小时报Java heap OOM如何解决
问题根因
这个OOM问题不是单一配置错误导致的,核心是Tez容器内存分配不足、加上你设置的mapreduce.job.reduces=1不合理,叠加长时间运行的Tez会话内存泄漏/碎片累积共同引发的。你之前调整的都是Hive执行逻辑参数,没有触及内存分配的核心配置,所以无法解决问题。
无需重启集群的解决方法
1. 会话级调整配置(当前Hive会话立即生效)
执行以下set命令修正不合理配置、扩大内存分配:
# 移除原有的mapreduce.job.reduces=1配置,改为动态分配reduce set hive.exec.reducers.bytes.per.reducer=67108864; set hive.exec.reducers.max=20; # 调整Tez AM内存,避免AM侧堆溢出 set tez.am.resource.memory.mb=8192; set tez.am.java.opts=-Xmx6144m; # 调整Tez任务容器内存 set tez.task.resource.memory.mb=4096; set tez.task.launch.cmd-opts=-Xmx3072m; # 配置Tez会话自动超时销毁,避免长时间运行积累内存问题 set tez.session.am.dag.submit.timeout.secs=3600;
如果是通过beeline连接Hive,新开会话时可以直接指定客户端内存:beeline --hiveconf hive.driver.memory=4G
2. 清理现存占用内存的闲置Tez容器
无需重启整个集群,只需要kill掉长时间运行的闲置Tez应用即可:
- 执行
yarn application -list | grep TEZ查询当前运行的Tez应用ID - 执行
yarn application -kill <应用ID>销毁目标应用,Tez会在后续任务提交时自动启动新的容器,不影响集群其他业务运行
长期优化建议
- 如果该集群长期运行固定Hive任务,可以在Dataproc集群的元数据配置中永久修改上述Tez、Hive内存参数,后续新启动的集群会自动加载配置
- 大分区表的动态写入任务建议拆分任务批次,避免单任务处理数据量过大超出内存上限
内容的提问来源于stack exchange,提问作者prototype sql
相关产品推荐
相关产品推荐

