编译Apache Tez 0.9.2源码失败求助:适配Hadoop 3.3.6遇报错
问题描述
在CentOS 8节点集群搭建环境:
- Hadoop版本:3.3.6
- 计划为Hive 3.1.3配置Apache Tez 0.9.2作为执行引擎
- Java版本:8
修改Tez源码的pom.xml中的Hadoop版本后,执行编译命令:
mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true
出现编译错误:
[ERROR] /usr/local/hadoop/apache-tez-0.9.2-src/tez-dag/src/main/java/org/apache/tez/state/StateMachineTez.java:[28,8] org.apache.tez.state.StateMachineTez is not abstract and does not override abstract method getPreviousState() in org.apache.hadoop.yarn.state.StateMachine
尝试切换到Apache Tez 0.9.0版本,依然出现方法匹配错误:
[ERROR] /usr/local/hadoop/apache-tez-0.9.0-src/tez-mapreduce/src/main/java/org/apache/tez/mapreduce/client/NotRunningJob.java:[89,29] no suitable method found for newInstance(...)
解决方案
1. 选用兼容Hadoop 3.x的Tez版本
Tez 0.9.x系列主要适配Hadoop 2.x生态,Hadoop 3.x的API有较多变化,导致编译不兼容。建议直接使用Tez 0.10.2及以上版本(如0.10.2、0.11.0),这些版本原生支持Hadoop 3.x,无需手动修改源码即可完成编译。
2. 若坚持使用Tez 0.9.x,手动修复API兼容问题
修复StateMachineTez编译错误
在tez-dag/src/main/java/org/apache/tez/state/StateMachineTez.java中,添加getPreviousState()方法的实现:
// 先在类中添加成员变量保存前状态 private STATE previousState; // 实现父类的抽象方法 @Override public STATE getPreviousState() { return previousState; }
同时需要在状态切换的逻辑(如transition方法)中更新previousState的值。
修复NotRunningJob方法匹配错误
检查Hadoop 3.x中对应newInstance方法的参数签名变化,调整NotRunningJob.java中调用该方法的参数列表,确保参数类型、数量与Hadoop 3.x的API一致。
3. 直接使用预编译Tez包
避免手动编译的麻烦,直接下载Apache官方提供的对应Hadoop版本的预编译Tez发布包,解压后配置到Hive的环境中即可使用,无需编译源码。
内容的提问来源于stack exchange,提问作者Quok
相关产品推荐
相关产品推荐

