windows(wsl)下的trino編譯和升級注意事項


最近在進行舊版本的prestosqlprestodb升級相關的操作,嘗試自己編譯了一下,這里記錄一下過程和遇到問題的處理。
因為Trino不支持windows下的編譯,如果使用windows最方便的方式就是使用wsl了。

WSL中編譯和調試

wsl的准備工作不累述了,升級到wsl2,使用的是ubuntu.
詳見:
Windows Subsystem for Linux Installation Guide for Windows 10

工具安裝

其他的過程包括安裝java並設置一下JAVA_HOME(maven需要使用) ,mavengit之類。

sudo apt install openjdk-11-jdk

#如果之前有其他發行版
update-alternatives --list java

wget https://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

sudo tar -xzvf apache-maven-3.6.3-bin.tar.gz  -C /opt/maven

idea同理,去官網下載然后移動到對應目錄即可。
(本來想通過jetbrain-toolbox安裝,但不知道為什么不能顯示gui界面放棄了)

配置修改

修改一下/etc/profile

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export M2_HOME=/opt/maven/apache-maven-3.6.3
export IDEA_HOME=/opt/idea/idea-IU-203.7148.57
export PATH=$M2_HOME/bin:$IDEA_HOME/bin:$PATH

xserver

為了方便xserver的配置,直接使用了mobaxterm,注意這里不用再去看網上的wsl的xserver設置,moba自己已經設置好了而且用的是和網上其他文檔不同的port,自己設置了反而彈不出來。

在wsl中輸入idea.sh即可彈出界面。
(這樣簡單設置無法使用外部的輸入法,已經不支持外部剪切板(默認支持內部的復制到外部)

編譯

默認的分支是最新版本的snapshot,需要切換到對應tag:

git fetch --all
git checkout tags/352

可以將wslmaven的本地倉庫路徑設置到外部的倉庫,這樣就可以復用已有的不需要完全下載新的。

編譯的方式和運行就按照trino倉庫即可(見trino),其中有一個文檔是不需要編譯的,且會比較耗時間,可以這么跳過:

mvn -pl '!docs' clean install -DskipTests

調試插件

啟動命令在官網倉庫中有,直接使用即可。

對於要調試的插件,將項目放入plugin目錄中,默認是不會加載的,修改一下core/trino-server-main/etc/config.propertiesplugin.bundles中加入自己項目的路徑即可。(這里的加載插件很多,啟動會比較慢可以適當減少一些)

升級遇到的問題

遷移的方法官網給了說明:Migrating from PrestoSQL to Trino
最主要的一點是在配置文件($TRINO_HOME/etc/config.properties)中增加
protocol.v1.alternate-header-name=Presto

UDF升級過程還可以,不得不說API的兼容性還是很好的,升級包之后API都是兼容的只是修改了一下路徑。
需要注意的是之前一直需要的那個io.trino.spi.Plugin文件不需要了,當前打包會自動生成,有了他反而會編譯失敗。

主要遇到了兩個問題:@OutputFunction注解的內容解析方式改變了,新版的Trino使用了SqlBase.g4type的語法。
我們之前的形式array(row(start timestamp,end timestamp))會解析失敗,在插件load的時候會掛掉(服務啟動失敗),因為end是一個保留字。

io.trino.sql.parser.ParsingException: line 1:35: mismatched input 'end'. Expecting: <identifier>, <type>
	at io.trino.sql.parser.ErrorHandler.syntaxError(ErrorHandler.java:108)
	at org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41)
	at org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:544)
	at org.antlr.v4.runtime.DefaultErrorStrategy.reportUnwantedToken(DefaultErrorStrategy.java:377)
	at org.antlr.v4.runtime.DefaultErrorStrategy.singleTokenDeletion(DefaultErrorStrategy.java:548)
	at org.antlr.v4.runtime.DefaultErrorStrategy.sync(DefaultErrorStrategy.java:266)
	at io.trino.sql.parser.SqlBaseParser.rowField(SqlBaseParser.java:11435)
	at io.trino.sql.parser.SqlBaseParser.type(SqlBaseParser.java:11103)
	at io.trino.sql.parser.SqlBaseParser.typeParameter(SqlBaseParser.java:11645)
	at io.trino.sql.parser.SqlBaseParser.type(SqlBaseParser.java:11329)
	at io.trino.sql.parser.SqlBaseParser.standaloneType(SqlBaseParser.java:404)
	at io.trino.sql.parser.SqlParser.invokeParser(SqlParser.java:139)
	at io.trino.sql.parser.SqlParser.createType(SqlParser.java:94)
	at io.trino.sql.analyzer.TypeSignatureTranslator.parseTypeSignature(TypeSignatureTranslator.java:98)
	at io.trino.operator.aggregation.AggregationImplementation$Parser.<init>(AggregationImplementation.java:315)
	at io.trino.operator.aggregation.AggregationImplementation$Parser.parseImplementation(AggregationImplementation.java:357)
	at io.trino.operator.aggregation.AggregationFromAnnotationsParser.parseFunctionDefinitions(AggregationFromAnnotationsParser.java:83)
	at io.trino.metadata.SqlAggregationFunction.createFunctionsByAnnotations(SqlAggregationFunction.java:45)
	at io.trino.metadata.FunctionExtractor.extractFunctions(FunctionExtractor.java:49)
	at io.trino.server.PluginManager.installPluginInternal(PluginManager.java:203)
	at io.trino.server.PluginManager.installPlugin(PluginManager.java:175)
	at io.trino.server.PluginManager.loadPlugin(PluginManager.java:169)
	at io.trino.server.PluginManager.loadPlugin(PluginManager.java:157)
	at io.trino.server.PluginManager.loadPlugins(PluginManager.java:143)

這部分的規則是這樣組成的:

type
    : ROW '(' rowField (',' rowField)* ')'     <- 命中這條                                    #rowType
...  

rowField
    : type
    | identifier type; <- 命中這條  

identifier
    : IDENTIFIER             #unquotedIdentifier
    | QUOTED_IDENTIFIER      #quotedIdentifier
    | nonReserved            #unquotedIdentifier <- END不在這里
    | BACKQUOTED_IDENTIFIER  #backQuotedIdentifier
    | DIGIT_IDENTIFIER       #digitIdentifier
    ;

nonReserved
    // IMPORTANT: this rule must only contain tokens. Nested rules are not supported. See SqlParser.exitNonReserved
    : ADD | ADMIN | ALL | ANALYZE | ANY | ARRAY | ASC | AT | AUTHORIZATION
    | BERNOULLI
    | CALL | CASCADE | CATALOGS | COLUMN | COLUMNS | COMMENT | COMMIT | COMMITTED | CURRENT
    | DATA | DATE | DAY | DEFINER | DESC | DISTRIBUTED | DOUBLE
    | EXCLUDING | EXPLAIN
...  

END: 'END';

修改很簡單,只需要end加上轉義即可,變為了array(row(start timestamp,\"end\" timestamp))
至此可以編譯成功(類型掛掉的都是因為和解析不符)。

但運行使用這個UDFsql會報錯,這就是另一個問題了,timestamp的類型增加了。 timestamp(3)timestamp不匹配,這個比較有意思,文檔里說了timestamptimestamp(3)的別名:

#TIMESTAMP
TIMESTAMP is an alias for TIMESTAMP(3) (millisecond precision).

UDF里就是不能這么寫,最后改為array(row(start timestamp(3),\"end\" timestamp(3)))
至此問題解決。

現在還在測試中,UDF這些的文檔有些欠缺了,自己摸索了一下發現還不如看源碼來得直接,這部分的文檔缺失的也厲害,寫/改UDF基本也是靠已有的例子摸索。
其他的部分都還不錯,兼容性也很好,可見Trino的社區支持還是很到位的,要感謝各位大佬的努力 😃。

希望之后替換可以順利吧~

Written with StackEdit.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM