開啟第乙個檔案發現udf函式沒找到,對比執行sql,on dwc_mart.transtring(a.altitem)=dwc_mart.transtring(b.pa_code) 使用了udf
explain 執行語句,找到stage4,發現啟動了本地模式,本地模式下進行了mapjoin操作
開啟第三個log,發現 ql.driver報錯
左邊是小表的執行過程,udf包放在了hdfs上,在本地模式下,不會去hdfs上找udf的jar包,所以啟動local task jvm時找不到對應的jar包報錯。
在hive客戶端提交上面sql,在客戶端本地啟動乙個driverjvm程序,
driver 程序解析指令碼,語法分析,語意分析,讀取元資料,生成邏輯執行計畫,邏輯優化,最終生成乙個物理執行計畫。
接下來執行物理執行計畫。對於這個sql來說,流程如下。
因為右側表是小表,所以生成的物理執行計畫是mapjoin ,那麼就在客戶端本地機器啟動乙個localtask jvm程序,(這一步可以從日誌中看到)用來從hdfs讀取小表資料到記憶體中,在記憶體中轉換為hashtable,根據語句,在這裡執行自定義函式。
當local task 執行完畢後,driver 程序負責將classpath 中jar 包、物理執行計畫、小表生成的hashtable 提交yarn 上去執行。
然後每個map節點處理大表的一部分資料,同時與小表進行關聯,這一步就是mapjoin,關聯的結果輸出寫入hdfs。
根據日誌,顯然是在local task這一步出錯了,報的錯是classnotfound,為什麼找不到udf的類呢?所以猜測jar包的載入是在driver jvm中做的,local task中並沒有載入jar包,所以找不到類。
避免mapjoin使用udf函式。在join之前處理好對應列。
關閉mapjoin,設定set hive.auto.convert.join=false;
在單機模式下,本地載入udf包(待驗證)
HIVE中MAPJOIN可以使用的場景分析
最近開發中遇到幾種應用,剛好使用mapjoin來解決實際的問題。應用共同點如下 1 有乙個極小的表 1000行 2 需要做不等值join操作 a.x b.y 或者 a.x like b.y等 這種操作如果直接使用join的話語法不支援不等於操作,hive語法解析會直接丟擲錯誤 如果把不等於寫到whe...
大表join小表,獨鍾愛mapjoin
在hive調優裡面,經常會問到乙個很小的表和乙個大表進行join,如何優化。shuffle 階段代價非常昂貴,因為它需要排序和合併。減少 shuffle 和 reduce 階段的代價可以提高任務效能。mapjoin通常用於乙個很小的表和乙個大表進行join的場景,具體小表有多小,由引數hive.ma...
Spark查詢多字元分隔符hive表時遇到的問題
首先要引入建立多分隔符hive表時的jar包,hive contrib 3.1.0.3.0.0.0 1634.jar 然而使用spark shell jars hive contrib 3.1.0.3.0.0.0 1634.jar引入jar包後查詢多分隔符hive表時仍然提示classnotfoun...