本文為您介紹阿里云EMR Trino如何動態(tài)加載和更新UDF。

背景信息

EMR-3.39.1之前版本和EMR-5.5.0之前版本的Trino新增UDF需要把JAR包上傳到所有節(jié)點,然后重啟服務(wù)器生效,此方式不是很方便。在on ACK場景下,如果需要使用新的UDF,還需重新打鏡像,此方式不太友好。因此EMR-3.39.1及之后版本和EMR-5.5.0及之后版本的阿里云EMR Trino實現(xiàn)了UDF的動態(tài)加載和更新。

使用限制

EMR-3.39.1及后續(xù)版本、EMR-5.5.0及后續(xù)版本的Hadoop集群或選擇了Trino的集群,支持UDF的動態(tài)加載和更新。

注意事項

  • 如果本文示例中的xxxxxx的內(nèi)容為現(xiàn)有連接器,例如hivemysql等,執(zhí)行DROP命令會直接刪除該連接器目錄下的所有內(nèi)容,且無法恢復(fù),因此請謹(jǐn)慎操作。
  • 集群擴(kuò)容時,擴(kuò)容新增的節(jié)點不含上傳到原有節(jié)點的UDF包,因此在擴(kuò)容前需先執(zhí)行DROP命令,擴(kuò)容完成后再重新執(zhí)行ADD命令。
  • 如果HDFS或OSS訪問失敗,請嘗試使用hadoop fs -ls命令,確認(rèn)集群的每個節(jié)點能否直接訪問到對應(yīng)文件。如果某個Worker節(jié)點無法訪問,可以在對應(yīng)Worker節(jié)點的server.log日志文件中查找原因。

操作流程

  1. 步驟一:環(huán)境準(zhǔn)備
  2. 步驟二:增加UDF
  3. 步驟三:刪除UDF

步驟一:環(huán)境準(zhǔn)備

將UDF對應(yīng)的JAR包文件放在對應(yīng)的文件系統(tǒng)中。

目前UDF文件支持以下兩種方式:
  • 方式一:將UDF的全部內(nèi)容打成一個JAR包(例如,udfjar.jar),上傳到文件系統(tǒng)中。如果OSS屬于其他賬號,或使用的是ACK集群,則需保證該JAR包有公開的讀權(quán)限。
    重要
    • 包名不可與現(xiàn)有連接器或UDF重名。
    • 建議包名只包含字母數(shù)字,否則可能出現(xiàn)不識別的情況。
    • Trino無法直接使用Presto的UDF,需修改包名后重新編譯,否則可能導(dǎo)致添加失敗。
  • 方式二:如果UDF依賴多個JAR包,且不想打成一個包,可以將UDF的所有JAR包上傳到同一個目錄下(例如,udfdir),再將該目錄完整上傳到文件系統(tǒng)中。
    重要
    • 目錄名不可與現(xiàn)有連接器或UDF重名。
    • 目錄下盡量不要有無關(guān)內(nèi)容。
    • 目錄需要配置權(quán)限。

步驟二:增加UDF

  1. 啟動客戶端,連接Trino,并輸入以下指令增加UDF包。
    1. 通過SSH方式登錄集群,詳情請參見登錄集群
    2. 執(zhí)行如下命令,進(jìn)入Trino控制臺。
      Trino --server master-1-1:9090
  2. 執(zhí)行如下命令,增加UDF。
    此操作會在Trino安裝路徑的plugin目錄下新建一個文件夾,然后將路徑所對應(yīng)的文件上傳到新建的文件夾下,并刷新當(dāng)前函數(shù)列表。語法為add jar "xxxxxx"
    • 如果是步驟一:環(huán)境準(zhǔn)備中的方式一,則對應(yīng)命令如下。
      add jar "oss://路徑/udfjar.jar"
    • 如果是步驟一:環(huán)境準(zhǔn)備中的方式二,則對應(yīng)命令如下。
      add jar "oss://路徑/udfdir"

      此時Trino能夠識別出要上傳的是一個目錄,并將目錄下的所有內(nèi)容下載到集群上。

    • 如果是將UDF文件保存在HDFS上,則對應(yīng)命令如下。
      add jar "hdfs://xxxxxx";
    • 如果是將UDF文件保存在本地文件系統(tǒng)上,則對應(yīng)命令如下。
      add jar "file:///xxxxxx";
      重要 在使用本地文件系統(tǒng)時,需要將UDF文件上傳到Trino運行的所有節(jié)點的對應(yīng)路徑下,file后面需要三個正斜線(/)。

步驟三:刪除UDF

直接刪除plugin目錄下對應(yīng)名稱的整個目錄,指定UDF包名即可刪除UDF,并重新加載函數(shù)列表。

語法為DROP JAR xxxxxx
說明 語法中的xxxxxx為上傳的文件名,同時也是Trino讀取UDF plugin的路徑名。
刪除語句不需要加引號,且無論通過方式一還是方式二上傳,刪除時均不需要加jar后綴。示例如下:
  • drop jar udfjar;
  • drop jar udfdir;