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

背景信息

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

使用限制

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

注意事項(xiàng)

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

操作流程

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

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

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

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

步驟二:增加UDF

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

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

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

步驟三:刪除UDF

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

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