全部產品
Search
文件中心

E-MapReduce:動態載入UDF

更新時間:Nov 12, 2024

本文為您介紹阿里雲EMR Trino如何動態載入和更新自訂函數(UDF)。

背景資訊

EMR-3.39.1之前版本和EMR-5.5.0之前版本的Trino新增UDF需要把JAR包上傳到所有節點,然後重啟伺服器生效,此方式不是很方便。在on ACK情境下,如果需要使用新的UDF,還需重新打鏡像,此方式不太友好。因此EMR-3.39.1及之後版本和EMR-5.5.0及之後版本的阿里雲EMR Trino實現了UDF的動態載入和刪除。

使用限制

EMR-3.39.1及後續版本、EMR-5.5.0及後續版本的Hadoop叢集或選擇了Trino的叢集,支援UDF的動態載入和刪除。

注意事項

  • 如果本文樣本中的xxxxxx的內容為現有連接器,例如hivemysql等,執行DROP命令會直接刪除該連接器目錄下的所有內容,且無法恢複,因此請謹慎操作。

  • 叢集擴容時,擴容新增的節點不含上傳到原有節點的UDF包,因此在擴容前需先執行DROP命令,擴容完成後再重新執行ADD命令。

  • 如果HDFS或OSS訪問失敗,請嘗試使用hadoop fs -ls命令,確認叢集的每個節點能否直接存取到對應檔案。如果某個Worker節點無法訪問,可以在對應Worker節點的server.log記錄檔中尋找原因。

操作流程

  1. 步驟一:環境準備

  2. 步驟二:添加UDF

  3. 步驟三:刪除UDF

步驟一:環境準備

將UDF對應的JAR包檔案放在對應的檔案系統中。

目前UDF檔案支援以下兩種方式:

  • 方式一:將UDF的全部內容打成一個JAR包(例如,udfjar.jar),上傳到檔案系統中。如果OSS屬於其他帳號,或使用的是ACK叢集,則需保證該JAR包有公開的讀許可權。

    重要
    • 包名不可與現有連接器或UDF重名。

    • 建議包名只包含字母數字,否則可能出現不識別的情況。

    • Trino無法直接使用Presto的UDF,需修改包名後重新編譯,否則可能導致添加失敗。

  • 方式二:如果UDF依賴多個JAR包,且不想打成一個包,可以將UDF的所有JAR包上傳到同一個目錄下(例如,udfdir),再將該目錄完整上傳到檔案系統中。

    重要
    • 目錄名不可與現有連接器或UDF重名。

    • 目錄下盡量不要有無關內容。

    • 目錄需要配置許可權。

步驟二:添加UDF

  1. 啟動用戶端,串連Trino,並輸入以下指令添加UDF包。

    1. 通過SSH方式登入叢集,詳情請參見登入叢集

    2. 執行如下命令,進入Trino控制台。

      trino --server master-1-1:9090
  2. 執行如下命令,添加UDF。

    此操作會在Trino安裝路徑的plugin目錄下建立一個檔案夾,然後將路徑所對應的檔案上傳到建立的檔案夾下,並重新整理當前函數列表。

    文法為add jar "xxxxxx" ;

    說明

    若在執行添加UDF時報錯,您可以在Worker節點的/mnt/disk1/log/trino/var/log/server.log記錄檔中尋找原因。

    • 如果是步驟一:環境準備中的方式一,則對應命令如下。

      add jar "oss://路徑/udfjar.jar";
    • 如果是步驟一:環境準備中的方式二,則對應命令如下。

      add jar "oss://路徑/udfdir";

      此時Trino能夠識別出要上傳的是一個目錄,並將目錄下的所有內容下載到叢集上。

    • 如果是將UDF檔案儲存在HDFS上,則對應命令如下。

      add jar "hdfs://xxxxxx";
    • 如果是將UDF檔案儲存在本地檔案系統上,則對應命令如下。

      add jar "file:///xxxxxx";
      重要

      在使用本地檔案系統時,需要將UDF檔案上傳到Trino啟動並執行所有節點的對應路徑下,file後面需要三個正斜線(/)。

步驟三:刪除UDF

直接刪除plugin目錄下對應名稱的整個目錄,指定UDF包名即可刪除UDF,並重新載入函數列表。

文法為DROP JAR xxxxxx ;

說明

文法中的xxxxxx為上傳的檔案名稱,同時也是Trino讀取UDF plugin的路徑名。

刪除語句不需要加引號,且無論通過方式一還是方式二上傳,刪除時均不需要加jar尾碼。樣本如下:

  • drop jar udfjar;

  • drop jar udfdir;