windows(wsl)下的trino編譯和升級注意事項
阿新 • • 發佈:2021-02-22
最近在進行舊版本的`prestosql`和`prestodb`升級相關的操作,嘗試自己編譯了一下,這裡記錄一下過程和遇到問題的處理。
因為`Trino`不支援windows下的編譯,如果使用windows最方便的方式就是使用`wsl`了。
# WSL中編譯和除錯
`wsl`的準備工作不累述了,升級到`wsl2`,使用的是`ubuntu`.
詳見:
[Windows Subsystem for Linux Installation Guide for Windows 10](https://docs.microsoft.com/en-us/windows/wsl/install-win10)
## 工具安裝
其他的過程包括安裝`java`並設定一下`JAVA_HOME`(maven需要使用) ,`maven`和`git`之類。
```bash
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`
```bash
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:
```bash
git fetch --all
git checkout tags/352
```
可以將`wsl`的`maven`的本地倉庫路徑設定到外部的倉庫,這樣就可以複用已有的不需要完全下載新的。
編譯的方式和執行就按照`trino`倉庫即可(見[trino](https://github.com/trinodb/trino)),其中有一個文件是不需要編譯的,且會比較耗時間,可以這麼跳過:
```bash
mvn -pl '!docs' clean install -DskipTests
```
## 除錯外掛
啟動命令在官網倉庫中有,直接使用即可。
對於要除錯的外掛,將專案放入`plugin`目錄中,預設是不會載入的,修改一下`core/trino-server-main/etc/config.properties`在`plugin.bundles`中加入自己專案的路徑即可。(這裡的載入外掛很多,啟動會比較慢可以適當減少一些)
# 升級遇到的問題
遷移的方法官網給了說明:[Migrating from PrestoSQL to Trino](https://trino.io/blog/2021/01/04/migrating-from-prestosql-to-trino.html)
最主要的一點是在配置檔案(`$TRINO_HOME/etc/config.properties`)中增加
`protocol.v1.alternate-header-name=Presto` 。
`UDF`升級過程還可以,不得不說API的相容性還是很好的,升級包之後API都是相容的只是修改了一下路徑。
需要注意的是之前一直需要的那個`io.trino.spi.Plugin`檔案不需要了,當前打包會自動生成,有了他反而會編譯失敗。
主要遇到了兩個問題:`@OutputFunction`註解的內容解析方式改變了,新版的`Trino`使用了`SqlBase.g4`中`type`的語法。
我們之前的形式`array(row(start timestamp,end timestamp))`會解析失敗,在外掛load的時候會掛掉(服務啟動失敗),因為end是一個保留字。
```java
io.trino.sql.parser.ParsingException: line 1:35: mismatched input 'end'. Expecting: ,
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.(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))`。
至此可以編譯成功(型別掛掉的都是因為和解析不符)。
但執行使用這個`UDF`的`sql`會報錯,這就是另一個問題了,`timestamp`的型別增加了。 `timestamp(3)`和`timestamp`不匹配,這個比較有意思,文件裡說了`timestamp`是`timestamp(3)`的別名:
> [#TIMESTAMP](https://trino.io/docs/current/language/types.html?highlight=timestamp%203#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](https://stackedi