天天看點

Hive的Udf Jar包不能太大

Hive Udf的注冊流程我們都清楚,是寫好代碼之後打成jar包,将jar包存放在HDFS上.

前端時間因業務需要,增加一個對資料加密的UDF,該功能因為依賴了外部庫,是以在POM檔案中添加了一些外部依賴.因為maven本身會将我們添加依賴的依賴鍊處理好,是以導緻寫完代碼打包後,Jar包過大.

添加加密UDF前jar包大小為30k+,增加後為70M+,沒考慮太多,直接上傳.

第二天早晨九點開始,叢集炸了.報錯伺服器磁盤空間不足,很多任務都失敗了.登入到伺服器檢視,是/tmp檔案夾被占滿了.裡邊有很多xxxx_resources的檔案夾,大概有2000多個.cd 進去一看,裡邊是我昨天上傳到HDFS上的UDF jar包.

怪不得空間占滿了,直接删除rm -rf ./*_resources之後,問題解決.

問題分析:

    如果一個機器執行了使用UDF的SQL的子任務,那麼該機器需要将UDF的jar包加載到自己記憶體中,加載記憶體前,需要下載下傳到本地的tmp檔案夾中,這一點在執行udf的時候是有日志提醒的.如下:

Hive的Udf Jar包不能太大

SO,udf的Jar包一定不能太大,因為每調用一次UDF就會存儲到本地一份UDF的jar包.如何将jar包變小呢.

從項目依賴中觀察到,hive和Hadoop的包也都被當做依賴加進來了.但是叢集中,hive和Hadoop的所有jar都是已經有了的.,配置已有依賴項到provided scope中,比如hive和Hadoop的依賴項,pom添加如下内容

<dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>${hive.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
            <scope>provided</scope>
        </dependency>
           

增加之後使用maven打包,jar包從70M+變成了4M+,大小可以接受.