单节点Hadoop下Tez引擎执行6TB数据Hive查询卡顿求助
单节点Hadoop环境,使用Tez引擎执行10GB数据的Hive查询时运行正常,但加载6TB数据后,查询卡在**"Launching Job 1 out of 1"**阶段,相关Hive日志如下:
Tez system stage directory hdfs://127.0.0.1:9000/tmp/hive/hadoop/_tez_session_dir/0716a629-1a1d-4500-86d9-6041aaf61596/.tez/application_1675755644314_0003 doesn't exist and is created
2023-02-07T13:12:01,670 INFO [Tez session start thread] impl.YarnClientImpl: Killed application application_1675755644314_0002
2023-02-07T13:12:01,671 ERROR [Tez session start thread] tez.TezSessionState: Failed to start Tez session
java.io.IOException: java.lang.InterruptedException: sleep interrupted
at org.apache.hadoop.hive.ql.exec.tez.TezSessionState.startSessionAndContainers(TezSessionState.java:456) ~[hive-exec-3.1.2.jar:3.1.2]
at org.apache.hadoop.hive.ql.exec.tez.TezSessionState.access$100(TezSessionState.java:101) ~[hive-exec-3.1.2.jar:3.1.2]
at org.apache.hadoop.hive.ql.exec.tez.TezSessionState$1.call(TezSessionState.java:376) ~[hive-exec-3.1.2.jar:3.1.2]
at org.apache.hadoop.hive.ql.exec.tez.TezSessionState$1.call(TezSessionState.java:371) ~[hive-exec-3.1.2.jar:3.1.2]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_352]
at java.lang.Thread.run(Thread.java:750) [?:1.8.0_352]
Caused by: java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method) ~[?:1.8.0_352]
at org.apache.tez.client.TezClient.waitTillReady(TezClient.java:1020) ~[tez-api-0.9.2.jar:0.9.2]
at org.apache.tez.client.TezClient.waitTillReady(TezClient.java:982) ~[tez-api-0.9.2.jar:0.9.2]
at org.apache.hadoop.hive.ql.exec.tez.TezSessionState.startSessionAndContainers(TezSessionState.java:453) ~[hive-exec-3.1.2.jar:3.1.2]
... 5 more
2023-02-07T13:12:01,833 INFO [93c56d8b-6e20-4b06-a5ba-1101e67ac8d7 main] impl.YarnClientImpl: Submitted application application_1675755644314_0003
2023-02-07T13:12:01,839 INFO [93c56d8b-6e20-4b06-a5ba-1101e67ac8d7 main] client.TezClient: The url to track the Tez Session: http://hadoop-node:8088/proxy/application_1675755644314_0003/
1. 调整YARN与Tez资源配置(单节点核心瓶颈)
单节点处理6TB数据时,默认资源配置不足以支撑,需针对性调整:
- 修改
yarn-site.xml:- 增大
yarn.nodemanager.resource.memory-mb为机器物理内存的70%(如32G内存设为22528) - 设置
yarn.scheduler.maximum-allocation-mb不小于上述值 - 调整
yarn.nodemanager.resource.cpu-vcores为机器可用CPU核心数的80%
- 增大
- 修改
tez-site.xml:- 增大
tez.am.resource.memory.mb至4096或更高,避免ApplicationMaster因内存不足被Kill - 设置
tez.container.max.java.heap.fraction为0.7,合理分配容器堆内存比例
- 增大
2. 延长Tez会话超时时间
日志中的InterruptedException: sleep interrupted说明会话启动超时,需调大等待阈值:
- 在Hive命令行临时设置:
或在set tez.session.am.dag.submit.timeout.secs=300; set tez.client.startup.timeout.secs=600;tez-site.xml中配置对应参数,永久生效。
3. 优化Hive查询与数据处理
通过数据拆分和参数调优降低单节点压力:
- 对6TB大表做分区或分桶,减少查询扫描的数据量
- 开启Hive并行执行:
set hive.exec.parallel=true; - 调整MapReduce任务数:根据数据块大小设置
mapreduce.job.maps(如6TB数据可设为100,避免单节点同时启动过多Map任务),同时合理增大mapreduce.job.reduces
4. 清理临时目录并重启服务
- 删除HDFS上的Tez临时目录:
hdfs dfs -rm -r /tmp/hive/hadoop/_tez_session_dir - 重启Hadoop、YARN和Hive服务,释放残留资源,确保配置生效
5. 排查系统资源瓶颈
单节点处理大数据时,磁盘IO和系统负载易成为卡点:
- 用
iostat查看磁盘使用率,top监控CPU、内存负载,确认是否有资源耗尽情况 - 若磁盘IO过高,可将数据迁移至SSD磁盘,或优化磁盘缓存策略
内容的提问来源于stack exchange,提问作者user2894607

