本文為您介紹阿里云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)有連接器,例如hive、mysql等,執(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日志文件中查找原因。
操作流程
步驟一:環(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
步驟三:刪除UDF
直接刪除plugin目錄下對應(yīng)名稱的整個目錄,指定UDF包名即可刪除UDF,并重新加載函數(shù)列表。
語法為
DROP JAR xxxxxx
。
說明 語法中的
xxxxxx
為上傳的文件名,同時也是Trino讀取UDF plugin的路徑名。
刪除語句不需要加引號,且無論通過方式一還是方式二上傳,刪除時均不需要加
jar
后綴。示例如下:
drop jar udfjar;
drop jar udfdir;