windows(wsl)下的trino编译和升级注意事项
最近在进行旧版本的prestosql
和prestodb
升级相关的操作,尝试自己编译了一下,这里记录一下过程和遇到问题的处理。
因为Trino
不支持windows下的编译,如果使用windows最方便的方式就是使用wsl
了。
WSL中编译和调试
wsl
的准备工作不累述了,升级到wsl2
,使用的是ubuntu
.
详见:
Windows Subsystem for Linux Installation Guide for Windows 10
工具安装
其他的过程包括安装java
并设置一下JAVA_HOME
(maven需要使用) ,maven
和git
之类。
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
可以将wsl
的maven
的本地仓库路径设置到外部的仓库,这样就可以复用已有的不需要完全下载新的。
编译的方式和运行就按照trino
仓库即可(见trino),其中有一个文档是不需要编译的,且会比较耗时间,可以这么跳过:
mvn -pl '!docs' clean install -DskipTests
调试插件
启动命令在官网仓库中有,直接使用即可。
对于要调试的插件,将项目放入plugin
目录中,默认是不会加载的,修改一下core/trino-server-main/etc/config.properties
在plugin.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.g4
中type
的语法。
我们之前的形式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))
。
至此可以编译成功(类型挂掉的都是因为和解析不符)。
但运行使用这个UDF
的sql
会报错,这就是另一个问题了,timestamp
的类型增加了。 timestamp(3)
和timestamp
不匹配,这个比较有意思,文档里说了timestamp
是timestamp(3)
的别名:
#TIMESTAMP
TIMESTAMP
is an alias forTIMESTAMP(3)
(millisecond precision).
但UDF
里就是不能这么写,最后改为array(row(start timestamp(3),\"end\" timestamp(3)))
。
至此问题解决。
现在还在测试中,UDF
这些的文档有些欠缺了,自己摸索了一下发现还不如看源码来得直接,这部分的文档缺失的也厉害,写/改UDF
基本也是靠已有的例子摸索。
其他的部分都还不错,兼容性也很好,可见Trino
的社区支持还是很到位的,要感谢各位大佬的努力 。
希望之后替换可以顺利吧~
Written with StackEdit.
windows(wsl)下的trino编译和升级注意事项的更多相关文章
- windows 7下mingw+msys编译ffmpeg
windows 7下mingw+msys编译ffmpeg 1-->下载安装MingW,mingw-get-inst-20120426.exe http://sourceforge.ne ...
- 基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用)
目录 基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用) 背景 下载地址 仓库地址 安装部署 msys2 安装 配置环境变量 ...
- Windows环境下使用VS2005编译OpenSSL
如何Windows环境下,使用VS2005编译OpenSSL,虽然这个问题在Baidu.Google上一堆,但安装中还是遇到些问题,在这里 记录下来希望能帮助大家不要在走弯路.注:我是在WinXP S ...
- 在Windows环境下使用MinGW编译Qt 4.8.6
1.修改环境变量工具推荐:Rapid Environment Editor.官网:http://www.rapidee.com/ 修改前请先备份当前的环境变量.然后: (1)检查系统变量path,删除 ...
- OpenCV在Windows平台下的源代码编译
OpenCV库官方站点为http://opencv.org/. 在该站点能够下载最新的OpenCV for Windows,比如当前我下载的是opencv-2.4.9.exe ,双击该文件解压到某个文 ...
- windows平台下安装、编译、使用mongodb C++ driver
本博客将记录在Win8.1 ,VS2013环境下编译.配置mongodb C++ driver的流程. 1.下载预备 下载Boost:http://sourceforge.net/projects/b ...
- Windows 版本下 Oracle12.1.0.2 升级Oracle12.2.0.1的步骤
oracle12.1.0.1 2013年发布的产品 2014年左右发布12.1.0.2 2016年底发布了 oracle12.2.0.1 经常有人会安装了最早的oracle版本,然后需要升级到最新的o ...
- Windows 10 下使用 MinGW-w64 编译 OpenCV-4.1.1
1. 下载安装 CMake 2. 下载安装 MinGW-w64,假设安装于 X:\path\to\MinGW-w64 此处注意选择 POSIX 版本而非 Win32 版本,因为 OpenCV 调用了标 ...
- WINDOWS系统下MYSQL安装过程中的注意事项
1.首先MySQL的安装方式有两种:一种是MSI安装方式,很简单就像安装Windows软件一样.另外一种就是ZIP安装方式.这种相对而言比较麻烦.新手推荐MSI安装方式. 安装方式有以下两种: MSI ...
随机推荐
- kubernetes 身份与权限认证 (ServiceAccount && RBAC)
Kubernetes中提供了良好的多租户认证管理机制,如RBAC.ServiceAccount还有各种Policy等. ServiceAccount Service Account为Pod中的进程 ...
- Snapshots常用命令
HBase Snapshots允许你对一个表进行快照(即可用副本),它不会对Region Servers产生很大的影响,它进行复制和 恢复操作的时候不包括数据拷贝.导出快照到另外的集群也不会对Regi ...
- 2019 Multi-University Training Contest 1 Path(最短路+最小割)
题意:给你n个点 m条边 现在你能够堵住一些路 问怎样能让花费最少且让1~n走的路比最短路的长度要长 思路:先跑一边最短路 建一个最短路图 然后我们跑一边最大流求一下最小割即可 #include &l ...
- A. Little Pony and Expected Maximum
Twilight Sparkle was playing Ludo with her friends Rainbow Dash, Apple Jack and Flutter Shy. But she ...
- HDU-6290 奢侈的旅行 (Dijkstra+堆优化)
高玩小Q不仅喜欢玩寻宝游戏,还喜欢一款升级养成类游戏.在这个游戏的世界地图中一共有nn个城镇,编号依次为11到nn.这些城镇之间有mm条单向道路,第ii 条单项道路包含四个参数ui,vi,ai,biu ...
- K8S(05)核心插件-ingress(服务暴露)控制器-traefik
K8S核心插件-ingress(服务暴露)控制器-traefik 1 K8S两种服务暴露方法 前面通过coredns在k8s集群内部做了serviceNAME和serviceIP之间的自动映射,使得不 ...
- 如何实现批量上传----------Java解析excel
一.引子 在web平台开发中仅经常会遇到一下需要批量的问题,通常得做法是使用excel上传,下面主要介绍一下在实际开发中到的实例. 二.准备工作 1.需要导入的jar包(主要用到poi包) (1)po ...
- 【非原创】sg函数模板
学习博客:戳这里 解题模型: 1.把原游戏分解成多个独立的子游戏,则原游戏的SG函数值是它的所有子游戏的SG函数值的异或. 即sg(G)=sg(G1)^sg(G2)^...^sg(Gn) ...
- vector最最最基础用法(非原创)
在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<in ...
- MYSQL基础常见常用语句200条
数据库 # 查看所有的数据库 SHOW DATABASES ; # 创建一个数据库 CREATE DATABASE k; # 删除一个数据库 DROP DATABASE k; # 使用这个数据库 US ...