hive-3.0.0 版本中遇到的bug 彙總

.狂飙的蜗牛發表於2024-03-04

目前公司用的hive 版本是 hive-3.0.0 bug 較多,這裡彙總整理下,以備查閱 (如有缺失歡迎補充)

1.表單屬性bucket_version 不同,導致join資料異常

1.1 自查方式

1.用spark-sql和hive 的結果資料對比
2.用hive引擎對比有無 hive.optimize.joinreducededuplication=false 引數時的結果
目前生產環境發生資料丟失過的場景有

1.2 發生的場景有

  1. 多個不同 bucketing_version屬性的表單進行join,且reduce個數大於2時,存在資料丟失
  2. 兩個不同 bucketing_version 屬性的表進行join時,且 有子查詢裡有group by時存在資料丟失
  3. presto 建立的表單,create table xxx like語句建立的表單都因缺失bucketing_version屬性,在和其他hive 表關聯計算時都有這個資料丟失的風險

1.3 修復方式

如果有出現資料異常的,可以根據實際情況自願選擇3種修復方式

  1. hive-site.xml 中設定表的預設建表屬性值 hive.table.parameters.default = 'bucketing_version=2';
  2. 設定最佳化引數: set hive.optimize.joinreducededuplication=false ;
  3. 修改表結構屬性: alter table [tablename] set tblproperties('bucketing_version'='2');
  4. 先用create table as select xxxx 建立臨時表的方式將不同bucket_version的取數結果分別用臨時表來封裝,再來join

1.4 相關社群文件

在一些特殊場景join 時存在資料丟失的情況,相關文件
https://issues.apache.org/jira/browse/HIVE-24033
https://issues.apache.org/jira/browse/HIVE-22098

2.group by和distinct 欄位個數不能超過64個, 否則報錯異常

2.1 異常確認

關鍵字:
SemanticException [Error 10411]: Grouping sets size cannot be greater than 64

2.2 避坑說明

這類場景畢竟少見,可以將string型別的欄位透過 concat_ws 拼接起來group by,然後拆分

2.3 社群相關連結

到 4.0 版本有修復,可以考慮合入該patch
https://issues.apache.org/jira/browse/HIVE-21018

3.container 重用導致的bug,多個dag 共用一個container導致, 導致container 的輸出檔案異常

3.1 異常確認

3.2 避坑引數說明

該類異常僅發生在hql檔案中有多個sql語句(會生成tez任務的ddl語句),或者有小檔案合併引數中,因不是必現的,小機率會發生,且設定到為true 時會,每個語句會多消耗一個container,沒有在叢集層面設定, 有出現過錯誤的或者任務比較重要的可以設定該引數避免出現該類錯誤
set tez.am.container.reuse.enabled=false;

3.3 社群相關連結

到 4.0 版本有修復,可以考慮合入該patch
https://issues.apache.org/jira/browse/HIVE-22373

4.container 重用導致的bug

4.1 異常確認

出現如下關鍵字
Was expecting dummy store operator but found:

Tez的bug導致,container複用開啟後,同一container在成功執行完mergejoin/groupby reduce任務後,執行同一個vertex的其他reduce任務時可能觸發報錯。

4.2 避坑引數說明

set tez.am.container.reuse.enabled=false;

4.3 相關社群連結

https://issues.apache.org/jira/browse/HIVE-23010

5.merge task跑到了default佇列

5.1 異常確認

在任務的執行日誌中如果有 File Merge的profile,找到對應appid,在tez-ui 中可以看到執行佇列

5.2 避坑引數說明

目前沒有合適的引數避免該問題,且該問題影響面較小, 暫時不用做特殊處理,後續考慮合入社群patch

5.3 相關社群連結

https://issues.apache.org/jira/browse/HIVE-22527

6.sort-merge semijoin導致的異常

6.1 異常確認,報錯中含有如下關鍵字

Attempting to overwrite nextKeyWritables[1]

6.2 避坑引數說明

在啟用sortmerge join 時會偶爾發生該類問題,關閉sortmerge join即可
set hive.auto.convert.sortmerge.join=false;

6.3 相關社群連結

https://issues.apache.org/jira/browse/HIVE-24073

7.查詢結果為空的情況下,目標表/分割槽資料並不會被清理

7.1 異常確認

如題,查詢結果為空的情況下,insert overwrite 不會清空目標表裡的資料和目錄, 理論上目標目錄下的資料應該要被清空的

7.2 避坑說明

目前還沒有好的避坑方法, 後面可以考慮合併此類patch,社群已有相關jira單

7.3 相關社群連結

https://issues.apache.org/jira/browse/HIVE-21714

8.mapjoin 導致的資料丟失

8.1 異常確認

任務沒有報錯,查詢語句中有lateral view explode 關鍵字,結果資料不寫入結果表的情況下正常查詢,在寫入到結果表後資料丟失
可以嘗試使用 set hive.auto.convert.join=false,再執行一次,如果查詢結果返回正常 說明是mapjoin 導致的bug

8.2 引數避坑說明

1.設定引數 hive.auto.convert.join=false, 避免出現此類問題
2.將 有lateral view explode 部分的子查詢改為先寫入到臨時表,再最後mapjoin時

8.3 社群相關連結

https://issues.apache.org/jira/browse/HIVE-11576

9.dynamic semijoin導致的異常

9.1 異常確認

執行任務時,編譯解析sql報錯:java.lang.NullPointerException at org.apache.hadoop.hive.ql.parse.TezCompiler.removeSemijoinOptimizationByBenefit
且sql 中存在join情況

9.2 引數避坑說明

set hive.tez.dynamic.semijoin.reduction=false;
這個配置可以禁用semi join最佳化,從而規避該問題,但需注意不建議叢集全域性加上這類配置,會導致本該最佳化的semi join失效。

9.3 社群相關

https://issues.apache.org/jira/browse/HIVE-24671
https://issues.apache.org/jira/browse/HIVE-22572

10.cube 資料重複異常

10.1 異常確認

執行的sql語句中有 cube關鍵字,cube欄位中有常量值
查詢驗證,相同的組合有兩天相同的記錄

10.2 避坑說明

初步判斷是和cube 中有常量欄位有關,將常量欄位移除cube,或者先寫入到臨時表中可以避免此類問題

10.3 社群相關說明

https://issues.apache.org/jira/browse/HIVE-17499

11.hiveserver2 因頻繁載入臨時函式導致的記憶體洩漏問題

11.1 異常確認

11.2 避坑說明

目前還沒有引數設定可以避免此類問題,只能透過patch修復這類問題

11.3 社群相關說明

https://issues.apache.org/jira/browse/HIVE-11408
https://issues.apache.org/jira/browse/HIVE-24636?focusedWorklogId=558506&page=com.atlassian.jira.plugin.system.issuetabpanels%3Aworklog-tabpanel#worklog-558506

12.hive 在join時或者語句中存在exists時,且有非等值得過濾時,cbo會將謂詞下推到join時導致結果異常

12.1 異常確認

檢查執行語句結果出現資料異常

12.2 避坑說明

關閉cbo最佳化器即可
set hive.cbo.enable=false;

12.3 社群相關說明

https://issues.apache.org/jira/browse/HIVE-18490

13.在left join 的語句中,如果子查詢中有union 和group by時,會導致查詢結果異常

12.1 異常確認
可以對比 presto/spark 和hive 的結果

12.2 避坑說明

子查詢中儘量避免同時使用 union和 group by 語句,目前社群還沒有解決方案

12.3 社群相關說明

https://issues.apache.org/jira/browse/HIVE-24907

相關文章