本文重点解决hudi在同步到hive1.x后,RT表无法查询的问题,阅读本文存在门槛,小白请先参考下面的文章进行部署
Flink CDC + Hudi + Hive + Presto构建实时数据湖最佳实践
部署完成之后需要使用hive,相信您已经将hudi-hadoop-mr-bundle-0.10.0-rc2.jar放到hive的auxlib下,并且已经给hive增加如下配置后重启hive
然后我们登录shell,查看同步过来的hive表
如果你已经得到ro,rt结尾的表,那么可以进行后续步骤,首先测试ro表
正常
再测试rt表,失败,异常可能如下
一般在hadoop换下遇到ClassNotFoundException,绝大多数就是单纯的缺少包,不用往其他方面思考,于是我们把这个类所在的parquet-hadoop包放到auxlib下
随后再进行尝试查询,再次报异常,我们再将parquet-cloumn,parquet-common放进去
再次执行
这时候您的异常,可能已经发生改变,不再是ClassNotFoundException,而是NoSuchMethodError,具体异常,这时候需要去找到这个包所在的类,然后在hadoop的总目录jars里面排除调这些包
大部分是parquet下的,这种排除法比较暴力,但是在hive无法升级的情况下,只能出此下策;这些包的影响有待考察
再parquet的异常排完之后,NoSuchMethodError还在继续,这时候可能会觉得这是一个无底洞,
随后又爆了,TProtocol这个类的getScheme方法找不到;关于NoSuchMethodError这个方法本质是程序优先去加载了hadoop classpath下或者hive/lib里边的包,而这些包里面缺少这个方法;很关键的一点是,那种体积比较大的包,往往隐藏猫腻!已知存在这个类的包如下:
很明显,如果您还想使用hive,hive-exec这个包是不能动的;因此,我们根据类加载的原则,在同一个目录下,加载顺序从上往下
这样,咱们先把正确的包改个名丢到顶层,然后这个包需要在hive的lib里面创建软连接,如图
重新执行
问题解决,博主只是在执行hql的机器解决的,如需在hue使用请调整hive部署节点机器
——————————————————————————————
PS:关于parquet包被注释调的所造成的影响,博主会持续更新
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)