presto(一)源码在IDEA上 运行调试(windows版)

最近在实现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信息

参考文献:
https://www.cnblogs.com/ginponson/p/9500663.html

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值