You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:40:39