最近在实现presto+kylin功能时,编辑的kylin plugin一直执行有问题,presto server反馈的信息有限,所以就想通过presto源码看下具体问题在哪。因为官方源码运行示例是在linux环境中,所以在windows环境中运行presto有许多坑,且网上很多文章要么内容步骤不全,要么挂羊头卖狗肉(内容标题是windows版源码调试,实际还是基于linux)。所以这里准备详细记录下presto源码运行起来调试的流程,即是为了以后使用,也是为了加深印象减少其它框架源码调试运行时要踩的坑。下面进入正文:
1、挑选版本下载presto源码
这里版本挑选的方式是先用git拉取presto主分支代码,然后再切换到指定版本
git clone https://gitee.com/itxiaowu/presto.git
cd presto (只有进入工程根目录下才能切换分支)
git checkout 0.250
2、查看源码中的README.md文件,一般用IDEA软件打开,或者直接在github或者码云上打开对应版本源码的README.md文件也行。这个文件十分重要,不仅记录了源码编译运行所需要的环境,还记录了调试需要配置的信息。这里先展示0.250所需要的环境信息,idea需要配置的调试信息后面讲。
第一条操作系统指明Mac或者Linux,这个我一开始看到差点崩溃,这里先不管。
后面三条很简单,就是说本地要有jdk,maven,python环境,而且版本不能低于指定值。我本地安装的版本信息如下:
3、使用IDEA打开该presto源码项目
有时可能由于网络、maven仓库配置或其它情况导致包下载不下来,这里展示一下我电脑中maven镜像的配置(纯粹参考,如果自己的maven配置下载正常,就不要乱改动)
<mirrors>
<mirror>
<id>mirror</id>
<mirrorOf>*</mirrorOf>
<name>cmc-cd-mirror</name>
<url>http://cmc-cd-mirror.rnd.huawei.com/maven/</url>
</mirror>
<mirror>
<id>ali maven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
4、屏蔽windows启动下的报错提示
首先注释PrestoSystemRequirements类verifyOsArchitecture()方法中的下述代码:
failRequirement("Presto requires Linux or Mac OS X (found %s)", osName)
其次修改PrestoSystemRequirements类getMaxFileDescriptorCount()方法中的下述代码:
将
Object maxFileDescriptorCount = mbeanServer.getAttribute(ObjectName.getInstance(OPERATING_SYSTEM_MXBEAN_NAME), "MaxFileDescriptorCount");
修改为:
Object maxFileDescriptorCount = 10000;
5、取消presto默认加载plugin
这一步很重要,presto默认实现了一些plugin,但是这些插件有可能我们会用不到,而且启动presto server源码过程中遇到问题会扩大排查范围。所以这里首先屏蔽所有的plugin加载。待presto server启动正常后再按照自己的实际需求引入plugin。当然也可以一步到位直接调试自己的plugin,但是源码启动中如果出错可能就不太好排查。新手建议先起“纯净版server”,再适当增加需要的plugin。
首先注释PluginManager类loadPlugins()方法中如下代码:
for (File file : listFiles(installedPluginsDir)) { if (file.isDirectory()) { loadPlugin(file.getAbsolutePath()); } } for (String plugin : plugins) { loadPlugin(plugin); }
其次,将presto-main模块下面etc/catalog/目录下的所有文件加上 .bak 后缀。当然也可以直接删除,但是为了以后使用,这里建议更改文件名而不是直接删除。
最后,删除presto-main模块下面etc目录下的function-namespace文件夹(有的版本没有这个文件夹,可以直接忽略)。
6、IDEA配置application
具体的配置信息在README.md中有,这里再展示一遍,如下:
Main Class: com.facebook.presto.server.PrestoServer
VM Options: -ea -XX:+UseG1GC -XX:G1HeapRegionSize=32M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -Xmx2G -Dconfig=etc/config.properties -Dlog.levels-file=etc/log.properties
Working directory: $MODULE_DIR$
Use classpath of module: presto-main
7、debug运行
报错1: SqlBaseParser 找不到,解决方式:
项目根路径下运行maven命令(如遇报错参考下面其它报错):mvn antlr4:antlr4
并在File菜单中,找到Project Structure子菜单并设置编译后的antlr4文件夹为Sources类型,如下:
报错2:不能解析presto-server模块
通过mvn antlr4:antlr4 -e查看到主要是不能解析presto-server的pom文件中所有type为zip类型的依赖,于是删除presto-server模块pom.xml依赖中的<type>zip<type>声明
报错3:不能找到sun.misc程序包
这个是jdk版本的问题,jdk9更新为jdk8,主要修改两个地方:
报错小结:
首先是版本问题选择,一些报错有可能是版本的问题,比如报错2,我用0.240和0.207版本实验过,这两个版本没有遇到报错2信息,可以直接打包成功。
其次是maven镜像问题,有的镜像可能下载不了需要的包。
最后是网络问题,同样的源码和maven配置文件,我在家可以加载成功,在公司就不行。
8、至此,“纯presto服务端”源码运行成功
后续便是添加额外的plugin并运行,这一块又分为两种方式,一是编译好相关plugin的jar包,然后放到指定的文件夹,最后让presto服务端启动后去读。二是直接将自定义plugin模块的源码集成到presto源码中,运行源码的同时直接运行该plugin。因为第二种方式没有彻底走通,所以这里仅介绍第一种方式。
一、运行编译好的mysql plugin
1、下载presto对应版本编译好的tar包,并解压(https://repo1.maven.org/maven2/com/facebook/presto/presto-serve)
2、在任意位置创建plugins文件夹,这里我创建的路径是D:\plugins。然后将上一步解压后plugin文件夹中的mysql目录拷贝到新建的文件夹中
3、修改plugin-main模块etc/catalog目录下mysql的配置文件,注意这里要讲上面配置的后缀名去掉,如下:
4、代码中修改plugin加载的位置
首先是修改PluginManager类构造器方法中plugin目录所在的位置
其次是放开pluginManager类loadPlugins方法中在前面操作中注释掉的代码。
5、注释presto-main模块etc目录下config.properties文件中的plugin.bundles属性,如果不注释掉,在开启plugin加载时会加载该路径指定的模块。
6、运行并验证
运行后出现如下日志,即可初步判断mysql plugin添加成功
实际验证很简单,首先是下载presto对应版本客户端jar包(Central Repository: com/facebook/presto/presto-cli)
其次是通过命令运行java -jar .\presto-cli-0.250-executable.jar 进入presto命令行模式,再运行show catalogs命令即可查看到mysql信息