簡體   English   中英

Hive 表的 ORC 拆分生成問題

[英]ORC Split Generation issue with Hive Table

我在 Hadoop 3.3.4 和 Tez 0.9.2 上使用 Hive 版本 3.1.3。 當我創建一個包含拆分的 ORC 表並嘗試查詢它時,我收到一個ORC split generation failed異常。 如果我連接表格,這在某些情況下可以解決問題。 然而,在其他情況下,問題仍然存在。

首先我像這樣創建表,然后嘗試查詢它:

CREATE TABLE ClaimsOrc STORED AS ORC
AS
SELECT *
FROM ClaimsImport;

SELECT COUNT(*) FROM ClaimsOrc WHERE ClaimID LIKE '%8%';

然后我得到以下異常:

Vertex failed, vertexName=Map 1, vertexId=vertex_1667735849290_0008_6_00, diagnostics=[Vertex vertex_1667735849290_0008_6_00 [Map 1] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: claimsorc initializer failed, vertex=vertex_1667735849290_0008_6_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)
        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.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:269)
        at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:253)
        at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:108)
        at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:41)
        at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:77)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:750)
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)

但是,如果我先連接表格,將 output 文件組合成更少的小文件,表格工作正常:

ALTER TABLE ClaimsOrc CONCATENATE;
OK
Time taken: 11.673 seconds

SELECT COUNT(*) FROM ClaimsOrc WHERE ClaimID LIKE '%8%';
OK
1463419
Time taken: 7.446 seconds, Fetched: 1 row(s)

初始 CTAS 查詢計算拆分的方式似乎出了問題,並且CONCATENATE在某些情況下修復了它。 但在某些情況下,它不會,也沒有解決方法。 我怎樣才能解決這個問題?

其他一些值得注意的事情:

  • 使用DESCRIBE EXTENDED ClaimsOrc; 顯示ClaimsOrc是一個 ORC 表。
  • 源表ClaimsImport包含大約 24 個 gzip pipe 分隔文件。
  • CONCATENATE之前, ClaimsOrc表包含大約 24 個文件
  • CONCATENATE之后, ClaimsOrc表僅包含 3 個文件拆分
  • CONCATENATE命令之前,ORC 文件似乎是有效的。 使用orcfiledump 命令,我沒有看到我抽查的幾個錯誤。

在 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_0168_1_00, diagnostics=[Vertex vertex_1670915386694_0168_1_00 [Map 1] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: jio_ar_consumer_events initializer failed, vertex=vertex_1670915386694_0168_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)
Caused by: java.util.concurrent.ExecutionException: java.lang.NoSuchMethodError: org.apache.hadoop.fs.FileStatus.compareTo(Lorg/apache/hadoop/fs/FileStatus;)I

@Patrick - 你找到相同的解決方案了嗎?

我們用似乎工作正常的 spark SQL 嘗試了相同的操作。 這意味着它能夠獲取通過 Metastore 命中的記錄數,但是當通過直線運行時,當它通過 Hive server2 時,它似乎會拋出此錯誤。

Tez 0.9.2 包含一個tez.tar.gz ,需要放在 HDFS 位置。 這個 tez.tar.gz 包含 hadoop-common-2.7.2.jar 默認情況下(這沒有作為異常拋出的方法 compareTo,如錯誤所示)

將這個 jar 與最新的 Hadoop jars 或從你的版本 (hadoop 3.3.4) 復制,你可能需要與其他 jars 重新打包,如 guava、Woodstox、stax2 api 等等。 將這個重新打包的tez的tar gz放到所有節點和hdfs位置。

這個錯誤應該 go 消失。 您最終可能會遇到其他錯誤,就像我說的那樣,您可以通過添加附加 Hadoop 依賴項 jars 來解決這些錯誤。

否則將 tez 升級到 0.10.x 版本,驗證其 Hadoop 版本。 期望它是 hadoop3.x 這將立即成為解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM