大家好!我是明哥!
近日我司有个大数据业务系统在某客户现场实时部署时,遇到了一个Hive udf的使用问题,这个问题比较难排查,因为涉及到对Hive的架构原理以及hive sql 解析优化和执行的细节的理解。在此跟大家分享总结下,希望对大家以后使用hive sql 尤其是udf 的编写能有所帮助。
一。问题现象
该客户使用的是 cdh6.2,对 hive 开启了 kerberos 安全认证也使用了sentry插件来进行 hive 表的权限管理,出于安全考量他们禁止在 udf 中直接访问hive 底层 hdfs 上的数据,所以我们的大数据业务系统将要获取的配置信息,即“交易日数据“定义为了 hive 表,然后在 udf 代码中通过建立到 hiveserver2 的 jdbc 连接然后执行 Statement.executeQuery("select close_date from ods_closedate") 的方式来获取交易日数据。
在测试时,通过 beeline 连接到 hiveserver2 然后通过 select hiveudf.lastexchangeday(20200102) 调用 udf 获取上一个交易日,但是实际执行时发现以上 udf 调用并不能成功获取到上一个交易日 20200101,观察发现客户端卡死且没有任何报错信息也没有结果,同时留意到链接同一个 hiveserver2实例的其它客户端能够正常连接到 hiveserver2 也能提交 sql,但是提交的sql 即使是最简单的 “show databases” ,客户端也是处于长时间卡死的状态且没有任何报错信息也没有任何结果。只有重启后 hiveserver2 才能正常对外提供服务。