使用Hive Beeline统计ORC表行数失败求助
Hive on Tez统计ORC表行数报错的解决思路
问题场景
组件版本:Hadoop 3.1.4、Hive 3.1.3、Tez 0.9.2
执行select count(*) from ORC_TABLE统计ORC表行数时触发报错,错误信息如下:
Error: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Vertex failed, vertexName=Map 1, vertexId=vertex_1670915386694_0182_1_00, diagnostics=[Vertex vertex_1670915386694_0182_1_00 [Map 1] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: jio_ar_consumer_events initializer failed, vertex=vertex_1670915386694_0182_1_00 [Map 1], java.lang.RuntimeException: ORC split generation failed with exception: java.lang.NoSuchMethodError: org.apache.hadoop.fs.FileStatus.compareTo(Lorg/apache/hadoop/fs/FileStatus;)I at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.generateSplitsInfo(OrcInputFormat.java:1851) at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.getSplits(OrcInputFormat.java:1939) at org.apache.hadoop.hive.ql.io.HiveInputFormat.addSplitsForGroup(HiveInputFormat.java:519) at org.apache.hadoop.hive.ql.io.HiveInputFormat.getSplits(HiveInputFormat.java:765) at org.apache.hadoop.hive.ql.exec.tez.HiveSplitGenerator.initialize(HiveSplitGenerator.java:243) at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:278) at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:269) Caused by: java.util.concurrent.ExecutionException: java.lang.NoSuchMethodError: org.apache.hadoop.fs.FileStatus.compareTo(Lorg/apache/hadoop/fs/FileStatus;)I at java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.util.concurrent.FutureTask.get(FutureTask.java:192) at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat.generateSplitsInfo(OrcInputFormat.java:1790) ... 17 more Caused by: java.lang.NoSuchMethodError: org.apache.hadoop.fs.FileStatus.compareTo(Lorg/apache/hadoop/fs/FileStatus;)I at org.apache.hadoop.hive.ql.io.AcidUtils.lambda$getAcidState$0(AcidUtils.java:1117) at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) at java.util.TimSort.sort(TimSort.java:220) at java.util.Arrays.sort(Arrays.java:1512) at java.util.ArrayList.sort(ArrayList.java:1464) at java.util.Collections.sort(Collections.java:177) at org.apache.hadoop.hive.ql.io.AcidUtils.getAcidState(AcidUtils.java:1115) at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator.callInternal(OrcInputFormat.java:1207) at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator.access$1500(OrcInputFormat.java:1142) at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator$1.run(OrcInputFormat.java:1179) at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator$1.run(OrcInputFormat.java:1176) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator.call(OrcInputFormat.java:1176) at org.apache.hadoop.hive.ql.io.orc.OrcInputFormat$FileGenerator.call(OrcInputFormat.java:1142) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) ... 3 more
已知正常场景:
- 执行
select * from ORC_TABLE(带/不带LIMIT)可正常提取记录 - Spark 3.3.1的Spark SQL可正常统计行数及获取数据
- 切换为MR执行引擎时该统计语句可正常运行
- 执行
CONCATENATE操作无法解决问题
根因分析
java.lang.NoSuchMethodError属于类版本不兼容问题:
- Hadoop 3.x中
FileStatus.compareTo方法的签名,与Tez自身打包的Hadoop依赖版本存在差异 - Tez引擎的类加载机制会优先加载自身内置的Hadoop类,而非集群部署的Hadoop 3.1.4版本类,导致在处理ORC表ACID状态排序时,找不到对应方法签名的
compareTo方法
解决思路
1. 对齐Tez与Hadoop依赖版本
- 重新编译Tez 0.9.2,指定依赖Hadoop 3.1.4版本,替换集群中现有Tez包
- 或直接选用官方适配Hadoop 3.x的Tez发行版本(需提前验证版本兼容性)
2. 调整Tez类加载顺序
在Tez配置文件tez-site.xml中添加以下配置,让Tez优先使用集群的Hadoop类:
<property> <name>tez.use.cluster.hadoop-libs</name> <value>true</value> </property> <property> <name>tez.lib.uris</name> <value>${fs.defaultFS}/apps/tez/tez-0.9.2,${fs.defaultFS}/apps/tez/tez-0.9.2/lib</value> </property>
确保tez.lib.uris指向集群中Tez的实际部署路径,且路径下依赖已适配Hadoop 3.1.4
3. 排查Hive与Tez依赖冲突
- 检查
hive-env.sh配置,移除多余的Hadoop/Tez依赖路径 - 执行
hive --debug启动Beeline,查看类加载日志,定位加载FileStatus类的JAR来源,删除冲突包
4. 临时规避方案(不推荐长期使用)
若暂时无法调整依赖,可在执行统计语句前临时禁用ACID相关优化:
set hive.optimize.sort.dynamic.partition=false; set hive.acid.enabled=false;
注意:该方案可能影响其他ACID表功能,仅作临时测试使用
内容的提问来源于stack exchange,提问作者Afroz Baig
相关产品推荐
相关产品推荐

