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 中添加以下配置:

注意:

最有效的方法是组合使用:

  1. 设置 hive.server2.tez.sessions.per.default.queue=0
  2. 设置 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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐