Hive自定義函數後,編譯源碼,並解決數據傾斜

一、下載源碼

首先進入網站:http://archive.cloudera.com/cdh5/cdh/5/

然後搜索 hive-1.1.0-cdh5.15.1-src

Hive自定義函數後,編譯源碼,並解決數據傾斜

二、自定義函數

2.1 添加隨機數前綴函數

解壓之後,可以用idea打開工程,然後在目錄hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf下新建一個類UDFAddRandomPrefix

Hive自定義函數後,編譯源碼,並解決數據傾斜

Hive自定義函數後,編譯源碼,並解決數據傾斜

2.2 移除前綴函數

同樣的在目錄

hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf下新建一個類UDFRemoveRandomPrefix

Hive自定義函數後,編譯源碼,並解決數據傾斜

2.3 註冊函數

上面的函數類我們已經定義好了,但是要註冊一下,hive才會知道我們自己寫的兩個函數,

在類FunctionRegistry的靜態代碼塊static下添加如下代碼:

Hive自定義函數後,編譯源碼,並解決數據傾斜

Hive自定義函數後,編譯源碼,並解決數據傾斜

三、編譯

終端切換到hive-1.1.0-cdh5.15.1目錄

Hive自定義函數後,編譯源碼,並解決數據傾斜

然後執行下面命令

mvn clean package -DskipTests -Phadoop-2 -Pdist

最後出現下面這個圖,說明編譯成功

Hive自定義函數後,編譯源碼,並解決數據傾斜

四、結果

最終打包後的文件在hive-1.1.0-cdh5.15.1/packaging/target目錄下

Hive自定義函數後,編譯源碼,並解決數據傾斜

後面直接進行部署就可以了

下圖是hive-exec模塊的編譯結果

Hive自定義函數後,編譯源碼,並解決數據傾斜

因為我們剛剛添加的函數在hive-exec模塊下添加自定義函數的,也可以把hive-exec-1.1.0-cdh5.15.1.jar直接上傳部署好hive的lib目錄下面

Hive自定義函數後,編譯源碼,並解決數據傾斜

五、測試函數

查看函數

show functions;

可以看到我們自己定義的兩個函數了,如下圖

Hive自定義函數後,編譯源碼,並解決數據傾斜

Hive自定義函數後,編譯源碼,並解決數據傾斜

我們看下函數的詳細描述,看看文檔是不是我們剛剛寫的

desc function extended add_random_prefix;

如下圖,這些不就是我們剛剛自定義函數寫的說明麼

Hive自定義函數後,編譯源碼,並解決數據傾斜

我們來使用一下這個函數:

select add_random_prefix('hive',10);

自動給我們加上隨機數了

Hive自定義函數後,編譯源碼,並解決數據傾斜

我們再測試一下移除隨機數

select remove_random_prefix('9_hive');

Hive自定義函數後,編譯源碼,並解決數據傾斜

到這裡,說明我們的自定義的函數沒有問題

六、解決數據傾斜問題

數據傾斜一般發生在聚合計算的時候,由於相同的key過多導致的,導致有一個task可能會計算的很慢,導致整個job的時間很長

Hive自定義函數後,編譯源碼,並解決數據傾斜

  1. 上面這個數據,是每個用戶購買的產品,現在我們要計算每個用戶總共購買了多少產品;
  2. 從上面的數據可以看出user3用戶比較多,如果數量再擴大幾十萬倍,進行聚合的時候會發生數據傾斜的問題了,那麼我們可以用上面兩個自定義的函數解決數據傾斜問題

6.1 先把uid打散

打散的意思就是在uid字段的值前面加上隨機數

select add_random_prefix(uid,5) as rdm_uid from user_pid;

Hive自定義函數後,編譯源碼,並解決數據傾斜

6.2 第一次聚合

把上面一次查詢的結果作為臨時表,對打散後的uid進行第一次聚合

Hive自定義函數後,編譯源碼,並解決數據傾斜

Hive自定義函數後,編譯源碼,並解決數據傾斜

6.3 移除隨機數

現在可以用移除隨機數的函數,把上面的結果uid前面的隨機數進行移除

Hive自定義函數後,編譯源碼,並解決數據傾斜

Hive自定義函數後,編譯源碼,並解決數據傾斜

6.4 第二次聚合

把上面的結果作為臨時表,把uid作為分組條件,對cnt進行求和,就可以得到我們的結果

Hive自定義函數後,編譯源碼,並解決數據傾斜

Hive自定義函數後,編譯源碼,並解決數據傾斜

到此數據傾斜解決


分享到:


相關文章: