本文為您介紹阿里雲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的內容為現有連接器,例如hive、mysql等,執行DROP命令會直接刪除該連接器目錄下的所有內容,且無法恢複,因此請謹慎操作。叢集擴容時,擴容新增的節點不含上傳到原有節點的UDF包,因此在擴容前需先執行DROP命令,擴容完成後再重新執行ADD命令。
如果HDFS或OSS訪問失敗,請嘗試使用
hadoop fs -ls命令,確認叢集的每個節點能否直接存取到對應檔案。如果某個Worker節點無法訪問,可以在對應Worker節點的server.log記錄檔中尋找原因。
操作流程
步驟一:環境準備
將UDF對應的JAR包檔案放在對應的檔案系統中。
目前UDF檔案支援以下兩種方式:
方式一:將UDF的全部內容打成一個JAR包(例如,udfjar.jar),上傳到檔案系統中。如果OSS屬於其他帳號,或使用的是ACK叢集,則需保證該JAR包有公開的讀許可權。
重要包名不可與現有連接器或UDF重名。
建議包名只包含字母數字,否則可能出現不識別的情況。
Trino無法直接使用Presto的UDF,需修改包名後重新編譯,否則可能導致添加失敗。
方式二:如果UDF依賴多個JAR包,且不想打成一個包,可以將UDF的所有JAR包上傳到同一個目錄下(例如,udfdir),再將該目錄完整上傳到檔案系統中。
重要目錄名不可與現有連接器或UDF重名。
目錄下盡量不要有無關內容。
目錄需要配置許可權。
步驟二:添加UDF
啟動用戶端,串連Trino,並輸入以下指令添加UDF包。
通過SSH方式登入叢集,詳情請參見登入叢集。
執行如下命令,進入Trino控制台。
trino --server master-1-1:9090
執行如下命令,添加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;