因公司分析订单数据要求,全面装行大数据工程师,在自己摸索Hadoop+Hive+Tez on Hive上花费了不少时间也趟了不少坑。
该篇文章主要记录下较新版的Hadoop+Hive搭建遇到比较大的问题
在开始的时候并没有使用tez替换计算引擎,公司主要是离线数仓,但是在使用hadoop的MR执行的时候出现了查询数据跟预期结果不同的严重BUG,确认不是sql 的问题,公司的业务需求写了一条较多嵌套的sql,查询结果严重偏离预期,使用 with [table] as 问题依旧出现,只有把部分嵌套的语句的查询结果单独insert into 到一张表中,再使用原sql中对应的SQL替换成对应的表才能查询出正确的结果,使用explain语句未发现执行步骤有问题,该问题会导致后期写的sql无法排查结果的准确性,Google中了解到也有人出现过该问题,替换成TEZ计算引擎,问题解决,故采用TEZ作为Hadoop的计算引擎。
在网上的一些视频和文章中使用Hadoop+Hive+Tez on Hive都是使用的Hadoop3.2.0以下的版本 很多使用以上版本集成各框架的时候都会遇到一个异常问题,包括首次启动hive
java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
网上解决问题的办法都是直接吧hadoop中较高版本的Guava jar包拷贝到hive lib中 但是在我这边选择的版本中,并不能解决tez在运行任务时抛出该异常
后面自己尝试编译了Tez源码,替换了其中Maven中的Hadoop版本号,编辑后打包到服务器,修改hadoop hive相关配置,再尝试使用tez来执行hive中的sql,发现了一个更奇怪的问题,sql竟然部分会成功,其余的依旧失败。 Tez官方编译教程
后尝试自己编译hive,并想替换为spark计算引擎 Hive3.1.2源码编译兼容Spark3.1.2 Hive on Spark 中间遇到的坑:
the environment variable java_home is not correctly set.
博主使用的是mac 的intellij idea编译,解决问题的文章链接 解决方案为ThomasR的回答,设置环境变量后用命令行启动idea
最终本想使用spark引擎,结果编辑替换原hive后,tez任务竟然全部可以成功,且SQL不拆分的执行结果跟预期一致。23333,意外之喜。
结语 本文暂时只做记录分享,写完文章继续加班搭建数仓,撰写该博文以便遇到相同问题的小伙伴参考借鉴,如有错误之处,请谅解
|