oozie下使用hive UDF的惨痛教训
来源:互联网 发布:免费收款收据打印软件 编辑:程序博客网 时间:2024/06/08 13:52
问题现象:
oozie中跑的一个workflow,hql脚本的导出结果和预期不一致,出错。
漫长的DUBUG之路:
1.首先想到的是通过在Hue中来跑同一个hql脚本,查找问题。通过在oozie的log中找到解析完的hql,跑了下,结果发现和预期一致,头有点儿大。。。
2.经过分析hql,推测可能是和脚本中用到自己之前写的一个UDF有关。于是单独用这个UDF写了一个和问题中涉及业务相同的简单hql,分别在Hue和oozie中运行,发现结果不一致,初步定为到问题所在。
3.针对Hue和oozie,分别用这个UDF调用的HDFS中的jar,新建两个全新名字的UDF,保证Hue和oozie调用的为同一个名字的jar包,试验之后发现结果依然不一样,头更大了。。。
4.重新分析Hue和oozie的日志,发现在hql执行之前,系统add了两个相同名字的jar,就是这个UDF对应的jar。一个存在于集群中hive实例所在linux机器的/usr/lib/hive/aux/lib/目录下,一个存在于HDFS的目录下。之前在建UDF的时候,关联的都是HDFS中的jar包地址,但执行的时候,会把这两个jar都预先加载进来,jar中的包和类的结构完全一致,导致实际调用的时用的不是一个jar。至此,完全定位到问题的原因。
5.将这两个jar下载到本地,反编后发现HDFS中的版本较新,但还有BUG,而linux本地的版本较老,但BUG已经被改掉了。最终确定oozie调用hql的时候找的是UDF关联的jar包,而通过Hue执行的hql,默认优先找的是hive自己lib中的jar包,最终导致了这个问题。
6.追溯根源时发现,一开始UDF的jar包是直接放到hive自己的lib中的,后来觉得丢到HDFS中针对每个库来新建UDF更加灵活,就重新在HDFS中上传了一个,原有hive自己的lib那个jar却忘记删除了;另外,上传HDFS的那位同事本地git客户端那两天的问题,导致上传的版本漏了重要的BUG修改的一版,然后jar包又是在本地打包上传的,最终导致了这个问题。真是各种no zuo no die啊。。。
解决问题:
将所有地方的jar包再linux和HDFS上都删除,重新上传最新的jar到HDFS,DROP所有涉及的UDF并重新CREATE,最后重启hive和Hue,问题解决
经验和教训:
1.所有的jar和war都必须从jenkins服务器上获取
2.UDF涉及的jar包必须统一放在同一个地方,若实在需要改动,一定要彻底删除之前相关所有的jar包并重启hive
- oozie下使用hive UDF的惨痛教训
- 编写hive udf和使用hive udf:hue的hive界面中使用hive udf函数、oozie使用hive udf函数、hive命令行使用udf函数
- 编写hive udf和使用hive udf:hue的hive界面中使用hive udf函数、oozie使用hive udf函数、hive命令行使用udf函数
- 使用ConcurrentLinkedQueue惨痛的教训
- 使用ConcurrentLinkedQueue惨痛的教训
- Linux下的惨痛教训=>LTS
- hive下UDF函数的使用
- hive下UDF函数的使用
- [原]使用ConcurrentLinkedQueue惨痛的教训
- jQuery的惨痛教训
- 惨痛的教训
- poj3672 Long Distance Racing留念下,惨痛的教训
- Hive中UDF的使用
- 惨痛的教训改用SVN
- 代码编写的惨痛教训
- flask 404 惨痛的教训
- 惨痛的wordpress调试教训
- 惨痛教训
- IPv6 初始
- 谈C#中的Delegate
- HTML 5 Web 存储
- 遍历文件夹下特定的文件
- Spring通过c3p0或者dbcp连接数据库获得DataSource配置
- oozie下使用hive UDF的惨痛教训
- Unity_NGUI原理机制
- js综合练习(原生js的拖拽)
- Github代码管理,多人协作
- 常用技术类网站链接
- emmet:HTML/CSS代码快速编写神器
- 解决每次打开Office 2013都提示配置进度
- 解决pip 安装失败
- Spring3中定时器的配置使用之Quartz