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

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

如何Debug

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

编译错误合集

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

Maven编译问题

代码规范

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

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

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

findbugs检查

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

Scala编译问题

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

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

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

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

于是更改编译POM如下:

问题解决

JDK版本编译问题

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

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

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

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

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

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

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

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

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

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

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

运行成功

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

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

相关文章
|
4月前
|
移动开发 监控 安全
mPaaS常见问题之Android集成dexPatch热修复运行时候无法正常进行热更新如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
|
4月前
|
前端开发 关系型数据库 MySQL
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
|
2月前
|
监控 Python
系统工程是一个广泛的领域,它涵盖了多个学科和技术的集成,以实现复杂系统的开发、运行和维护。
系统工程是一个广泛的领域,它涵盖了多个学科和技术的集成,以实现复杂系统的开发、运行和维护。
|
4月前
|
XML 测试技术 持续交付
python运行集成测试
【4月更文挑战第21天】
41 2
|
4月前
|
测试技术 Python
python运行集成测试
【4月更文挑战第22天】
26 1
|
4月前
|
PHP
【ripro美化】设计子主题sheji-child素材资源下载站模板(集成后台+无授权+独立运行)
安装教程 第一步:首先对应单个上传替换包里面的文件到ripro原主题里面(单个文件覆盖不是替换整个文件包) 第二步:将下载的sheji-child压缩包上传到/wp-content/themes/直接解压,完成后到后台-外观-启用子主题 后台新建页面 1:页面-新建页面-选择VIP介绍模板,链接填vip 2:页面-新建页面-选择自助申请友链模板,链接填links
37 0
【ripro美化】设计子主题sheji-child素材资源下载站模板(集成后台+无授权+独立运行)
|
4月前
|
监控 Apache 开发工具
Apache Flink 1.12.2集成Hudi 0.9.0运行指南
Apache Flink 1.12.2集成Hudi 0.9.0运行指南
102 0
|
10月前
|
机器学习/深度学习
大气臭氧浓度预测:基于集成学习 袋装决策树 额外决策树 随机梯度提升 随机森林的时间序列 大气臭氧浓度预测 完整代码+数据 可直接运行
大气臭氧浓度预测:基于集成学习 袋装决策树 额外决策树 随机梯度提升 随机森林的时间序列 大气臭氧浓度预测 完整代码+数据 可直接运行
53 0
|
运维 算法 调度
(文章复现)建筑集成光储系统规划运行综合优化方法matlab代码
参考文献: [1]陈柯蒙,肖曦,田培根等.一种建筑集成光储系统规划运行综合优化方法[J].中国电机工程学报,2023,43(13):5001-5012.
|
Java 数据库 微服务
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) (mini-cloud) SEATA分布式事务篇(上) 运行原理以及AT模式源码启动版集成
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) (mini-cloud) SEATA分布式事务篇(上) 运行原理以及AT模式源码启动版集成
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) (mini-cloud) SEATA分布式事务篇(上) 运行原理以及AT模式源码启动版集成