oozie下使用hive UDF的慘痛教訓

2021-07-05 21:48:40 字數 1035 閱讀 2627

問題現象:

oozie中跑的乙個workflow,hql指令碼的匯出結果和預期不一致,出錯。

漫長的dubug之路:

1.首先想到的是通過在hue中來跑同乙個hql指令碼,查詢問題。通過在oozie的log中找到解析完的hql,跑了下,結果發現和預期一致,頭有點兒大。。。

2.經過分析hql,推測可能是和指令碼中用到自己之前寫的乙個udf有關。於是單獨用這個udf寫了乙個和問題中涉及業務相同的簡單hql,分別在hue和oozie中執行,發現結果不一致,初步定為到問題所在。

3.針對hue和oozie,分別用這個udf呼叫的hdfs中的jar,新建兩個全新名字的udf,保證hue和oozie呼叫的為同乙個名字的jar包,試驗之後發現結果依然不一樣,頭更大了。。。

4.重新分析hue和oozie的日誌,發現在hql執行之前,系統add了兩個相同名字的jar,就是這個udf對應的jar。乙個存在於集群中hive例項所在linux機器的/usr/lib/hive/aux/lib/目錄下,乙個存在於hdfs的目錄下。之前在建udf的時候,關聯的都是hdfs中的jar包位址,但執行的時候,會把這兩個jar都預先載入進來,jar中的包和類的結構完全一致,導致實際呼叫的時用的不是乙個jar。至此,完全定位到問題的原因。

6.追溯根源時發現,一開始udf的jar包是直接放到hive自己的lib中的,後來覺得丟到hdfs中針對每個庫來新建udf更加靈活,就重新在hdfs中上傳了乙個,原有hive自己的lib那個jar卻忘記刪除了;另外,上傳hdfs的那位同事本地git客戶端那兩天的問題,導致上傳的版本漏了重要的bug修改的一版,然後jar包又是在本地打包上傳的,最終導致了這個問題。真是各種no zuo no die啊。。。

解決問題:

將所有地方的jar包再linux和hdfs上都刪除,重新上傳最新的jar到hdfs,drop所有涉及的udf並重新create,最後重啟hive和hue,問題解決

經驗和教訓:

1.所有的jar和war都必須從jenkins伺服器上獲取

2.udf涉及的jar包必須統一放在同乙個地方,若實在需要改動,一定要徹底刪除之前相關所有的jar包並重啟hive

Hive UDF函式使用

udf函式 udf user defined functions 即是使用者定義的hive函式。hive自帶的函式並不能完全滿足業務需求,這時就需要我們自定義函式了 開發自定義udf函式需要繼承 org.apache.hadoop.hive.ql.exec.udf 類,並實現evaluate函式 實...

oozie使用shell重新整理impala元資料

如果不加python egg cache環境變數會導致執行失敗,impala shell本身可以正常執行,估計是oozie呼叫shell時會使用到python的乙個快取檔案,這裡加上export python egg cache tmp python eggs即可成功呼叫服務 flush impal...

關於oozie使用的一些坑

樓主主要是在hue上面配置oozie任務,在這裡記錄一下遇到的一些問題 hue使用者許可權的問題 配置一些hive或者shell指令碼的impala任務時,會使用hue登入的使用者執行,所以會造成一些許可權的問題,hue的使用者和linux的使用者並不是相同的,牽扯到許可權的問題在這裡先不多說了。配...