hive on spark/mr 启动慢/报错:NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration
·
Hive-on-Spark模式启动HiveServer2时,出现NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration。从堆栈跟踪看,HiveServer2在启动时尝试初始化Tez会话池,但我们实际上使用的是Spark执行引擎,因此需要避免Tez相关的初始化。
版本:hive 3.x;spark 3.x
解决方案:
1. 禁用Tez相关功能
在 hive-site.xml 中添加以下配置:
注意:
最有效的方法是组合使用:
- 设置
hive.server2.tez.sessions.per.default.queue=0 - 设置
hive.server2.tez.initialize.default.sessions=false
Hive 3.x 不能识别 hive.tez.session.pool.enabled与hive.server2.tez.session.pool.enabled

<!-- 可选优化:禁用Tez自动初始化,进一步减少HS2启动耗时 -->
<property>
<name>hive.server2.tez.initialize.default.sessions</name>
<value>false</value>
<description>禁止HS2启动时自动创建Tez默认会话</description>
</property>
<property>
<name>hive.server2.tez.sessions.per.default.queue</name>
<value>0</value>
<description>每个队列的Tez会话数为0</description>
</property>
<!-- 优化:关闭HS2的Web UI无关日志,减少资源消耗 -->
<property>
<name>hive.server2.webui.logging.enabled</name>
<value>false</value>
</property>
<!-- H2高可用参数,开启此参数可以提高hiveserver2的启动速度 -->
<property>
<name>hive.server2.active.passive.ha.enable</name>
<value>true</value>
<!-- 关闭Tez DAG访问 - 重要 -->
<property>
<name>hive.server2.tez.dag.access.check.enabled</name>
<value>false</value>
</property>
<!-- 禁用Tez DAG提交 -->
<property>
<name>hive.tez.auto.reducer.parallelism</name>
<value>false</value>
</property>
</property>
其它【自行选择】
<!-- 添加Spark主节点配置 -->
<property>
<name>spark.master</name>
<value>yarn</value>
</property>
<property>
<name>spark.submit.deployMode</name>
<value>cluster</value>
</property>
2. 从类路径中移除Tez JAR(推荐)
# 查看是否有tez相关的jar
# 进入 Hive 的 lib 目录
cd $HIVE_HOME/lib
ls -la | grep tez
或:
find /opt/installs/apache-hive-3.1.2-bin -name "*tez*.jar"
# 如果有,移动到备份目录
sudo mkdir -p /opt/installs/temp
sudo mv tez*.jar /opt/installs/tez_backup/ 2>/dev/null || echo "No tez jars found"
#或直接删除所有 Tez 相关的 JAR 包
rm -f tez-*.jar
rm -f hadoop-yarn-*.jar # Tez 依赖的 Hadoop 依赖包(通常包含 Tez 类)
# 检查 Hive lib 目录是否还残留 Tez JAR
2ls $HIVE_HOME/lib | grep -E 'tez|yarn'
💡 为什么需要移除 tez*.jar、hadoop-yarn-*.jar?
类加载发生在配置解析前,必须移除 JAR;hive 配置仅阻止 Tez 会话池,无法阻止 HiveServer2 尝试加载 Tez 类;Tez 依赖的 Hadoop YARN JAR 包中可能包含 Tez 类(如 TezConfiguration),即使不使用 Tez,Hive 也会尝试加载这些类。
3. 重启步骤
# 1. 停止所有Hive服务
ps aux | grep hiveserver2 | grep -v grep | awk '{print $2}' | xargs kill -9
# 2. 清除临时文件
rm -rf /tmp/hive* /tmp/root/
#3.前台启动便于观察日志
$HIVE_HOME/bin/hive --service hiveserver2
# 4. 查看日志确认
tail -f /opt/installs/hive/logs/hiveserver2.log
4. 验证启动成功
# 检查进程
jps | grep RunJar
# 查看端口监听
netstat -tlnp | grep 10000
# 连接测试
$HIVE_HOME/bin/beeline -u jdbc:hive2://node01:10000 -n root
#连接成功,执行查询并查看执行引擎
SET hive.execution.engine;
-- 应输出:spark
好
更多推荐

所有评论(0)