本文為您介紹阿里云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)有連接器,例如hive、mysql等,執(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日志文件中查找原因。
操作流程
步驟一:環(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
步驟三:刪除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;