CarbonData集成 Presto(Trino)(2)- 运行排错篇-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

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

简介: 本文详细介绍了如何集成最新Trino时候的一些排错思路以及代码正确思路,欢迎指点

如何Debug

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

编译错误合集

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

Maven编译问题

代码规范

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

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

image

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

image

findbugs检查

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

image

Scala编译问题

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

image

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

image

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

image

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

image

于是更改编译POM如下:

image

问题解决

JDK版本编译问题

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

image

这个时候我们需要单独进入这个项目下面,选择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,他很耐心的回答了我的问题,

image

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

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

image

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

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

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

image

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

image

image

启动时候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的格式

image

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

image

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

image

image

运行成功

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

image

到此为止 集成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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章
最新文章
相关文章