CarbonData集成 Presto(Trino)(2)- 运行排错篇

如何Debug

代码编写后,我们需要进行Debug进行逻辑调错,因此我们并不是想象中的那么完美。而且这个功能模块是高度集成的模块,涉及代码高达7K行,所以在排查错误的时候困难重重,需要有更加仔细的排查错误能力和耐心

编译错误合集

下面给大家罗列一下我在开发过程中和调试过程中遇到的一些问题

Maven编译问题

代码规范

在开源社区中,代码质量和代码规范至关重要,拥有良好的代码质量和规范使得大家的代码风格能够更加好的保持一致。在国内我一般使用Alibaba Code检测工具安装在IDEA上,但是对于开源社区来说,一般使用CodeStyle和FindBugs工具进行检查

在Dev下面我们可以看到有这些文件,仔细观察其实就是一些代码模板,可以看到template结尾,据此推测应该是社区为了规范大家的编码格式,于是指定一个标准去格式化代码

CarbonData集成 Presto(Trino)(2)- 运行排错篇

我们通过IDEA把这个模板进行导入,并且调整命名为Schema为Carbondata,不影响我们其他代码使用

CarbonData集成 Presto(Trino)(2)- 运行排错篇

findbugs检查

由于我目前是进行代码测试,而不是说需要提交PR。所以不用严格进行代码检测或者FindBugs插件进行检查,所以我们可以先暂时跳过编译,当然也可以通过MVN命令跳过,我这里手动设置了一下Skip暂时跳过了,如下图。

CarbonData集成 Presto(Trino)(2)- 运行排错篇

Scala编译问题

由于目前Scala的版本支持已经到了Scala2.13了,但是原来PrestoSQL依赖的这个编译插件比较古老了,我们前往Maven仓库看看

CarbonData集成 Presto(Trino)(2)- 运行排错篇

可以看出这个插件在2011开始就没维护了,我就想是不是官方已经把这个插件移动到其他地方,于是找了一顿,我就找到了 net.alchim31.maven 这个插件作为替代,我就想通过替换此版本并且指定使用JDK11编译Scala代码。当然在选择编译插件这个也是有讲究的,首先要和你Scala的版本对应上,而不是说一昧的追求Maven仓库最新版本的依赖,像这个插件截止发稿前是4.5.3。这个最新版本支持的Scala2.13的,所以在我这里就不适合了,所以我们要观察包里面的依赖,如下图

CarbonData集成 Presto(Trino)(2)- 运行排错篇

通过一番对比后,我认为这个插件是比较适合的,编译时候同时要注意输出代码是JDK11,需要根据对应的Scala版本进行适配

CarbonData集成 Presto(Trino)(2)- 运行排错篇

刚刚开始我没有进行适配,所以插件在编译时候就提示了以下错误了,Scala Test 版本过低的问题

CarbonData集成 Presto(Trino)(2)- 运行排错篇

于是更改编译POM如下:

CarbonData集成 Presto(Trino)(2)- 运行排错篇

问题解决

JDK版本编译问题

因为我的机器默认是使用JDK8版本,而且CarbonData也是JDK8,但是Trino只支持JDK11.0.11+ 版本,所以在编译到最后的Trino模块时候使用JDK8版本编译就会出现以下错误

CarbonData集成 Presto(Trino)(2)- 运行排错篇

这个时候我们需要单独进入这个项目下面,选择JDK11进行编译

mvn clean install -pl :trino -am  -Djacoco.skip=true -Dfindbugs.skip=true -DskipTests=true -Dspark.version=2.4.5 -Dhadoop.version=2.7.7 -Dhive.version=3.1.0 -Dscala.version=2.11.12

这个步骤中,我还特意去询问了之前开发Presto老版本的一个社区作者,提了一个ISSUE,他很耐心的回答了我的问题,

CarbonData集成 Presto(Trino)(2)- 运行排错篇

详细问答过程可以查看这里:https://github.com/apache/carbondata/issues/4184

最后编译所需依赖的模块如下:

CarbonData集成 Presto(Trino)(2)- 运行排错篇

使用JDK11编译后无误,在目录下面我们可以看到已经编译好的JAR包。我们移动到Trino的plugin目录下,然后配置Trino Server相关的一些Server和Worker参数即可运行

最终编译成功,编译后我们去到target目录下找到相关依赖复制过去Trino,具体步骤可以看我第一篇文章

https://www.yuque.com/hongjingzhuanjia/sgf5fd/km4rlr

CarbonData集成 Presto(Trino)(2)- 运行排错篇

编译的模块和编译信息如下:

CarbonData集成 Presto(Trino)(2)- 运行排错篇

CarbonData集成 Presto(Trino)(2)- 运行排错篇

启动时候JDK版本错误

启动Trino 358 报错,由于默认JDK使用的是1.8版本导致无法启动,在presto330版本里已经提到,jdk8只支持到3月的版本。详细可以查看下面这个链接:https://trino.io/docs/current/release/release-330.html ,于是我在本机安装了JDK11。这里还需要注意一下,JDK版本是有要求的,官方要求是JDK11.0.11+的版本,所以低版本的JDK还不支持,当使用JDK低版本时候会抛出以下的错误

java.lang.UnsupportedClassVersionError: PR/Sort :

Unsupported major.minor version 52.0

需要修改Trino目录下bin的启动脚本,强制指定JDK启动版本,修改内容如下:

PATH=/Library/Java/JavaVirtualMachines/jdk-11.0.11.jdk/Contents/Home/bin/:$PATH

java -version

 

exec "$(dirname "$0")/launcher.py" "$@"

Trino部署参考文档可以参考下面的文档

https://trino.io/docs/current/installation/deployment.html

部署成功后,启动无问题

运行时错误

编译后,我们心欢意喜的想启动项目,却发现各种报错。于是只能慢慢从一些报错信息中找到关键问题

使用谷歌IOC框架时候多绑定了Module错误

Google依赖注入框架Guice,Trino是通过这个框架注入一些实体和参数的,在绑定的时候由于我多绑定了参数,于是报错提示如下:

Exception in thread "main" com.google.inject.ConfigurationException: Guice configuration errors:


1) No implementation for stat.domain.Processor<java.lang.String, java.lang.String> annotated with @com.google.inject.name.Named(value=JMeter) was bound.

后面通过详细学习Started文档了解如何使用后,删除绑定了多的错误后正常运行

https://github.com/google/guice/wiki/GettingStarted

https://baijiahao.baidu.com/s?id=1695099251394966117&wfr=spider&for=pc

缺乏serialization.lib

serialization.lib 这个参数是在后续添加的,这个参数主要是用于标记我们的数据格式需要序列化哪种格式,在我们这边是需要序列化成CarbonData的格式

CarbonData集成 Presto(Trino)(2)- 运行排错篇

在刚刚开始的时候忘记添加,导致运行时候报NPE错误,通过排查追踪HiveSplit可以发现需要用到deserializerClassName

CarbonData集成 Presto(Trino)(2)- 运行排错篇

通过源码追踪可以发现其实是来自Hive下面一些自己定义常量,故我们补充即可

CarbonData集成 Presto(Trino)(2)- 运行排错篇

CarbonData集成 Presto(Trino)(2)- 运行排错篇

运行成功

经过这么多磨难,我们终于成功启动了,然后我们来测试一下基本的查询功能和元数据查询功能。我们还是以之前的方式一样启动Trino-Cli连接本地的Trino,然后执行我们的查询,可以看到在显示元数据、基本查询已经没有问题了

CarbonData集成 Presto(Trino)(2)- 运行排错篇

到此为止 集成Trino的基本功能已经完成了

总结

经过这番折腾,Trino成功支持了CarbonData的集成与查询。通过集成Trino简单查询的复杂步骤大大的提高了我对代码的Debug和工程能力,让我之后在后续的性能测试中能够更加方便和深入的解决问题。目前此代码已经提交PR,具体可以关注下面链接给个Start或者小火箭。后续还会根据导师指导提高测试的数据量和编写业务模拟数据脚本去测试性能所带来的提升,并且完善使用文档和交付

TrinoPR代码库分支:https://github.com/apache/carbondata/pull/4198

Github-Trino-358-alpha:https://github.com/czy006/carbondata/tree/trino-358-alpha

上一篇:Windows live writer publish Test


下一篇:极速理解设计模式系列【目录索引】