资讯详情

资讯详情

【Hive 运维】JDBC使用Hive UDF:Hive UDF打通hiveserver2

文章目录一. 问题描述与方案分析1. 问题描述2. 方案分析3. 方案优化3.1. 通过文件系统来保证jar包的节点一致性3.2. hiveserver2 session的更新优化二. 实现与操作一. 问题描述与方案分析1. 问题描述用户需要创建永久的Hive UDF供JDBC连接使用一开始先通过hive client的方式注册输入hive进入hive交互界面发现udf存在但是通过jdbc连接的时候无法找到此函数。如下相关操作-- 1. 上传包到文件系统中hadoop fs-put/home/hadoop/lib/hive-1.0-SNAPSHOT.jar/lib/-- 创建永久函数-- a.进入hive终端hive-- b. 注册hive永久函数-- 注意函数是绑定到某个库下的此时是绑定到default库下。CREATEFUNCTIONsayhelloAScom.gao.bigdata.HelloUDFUSINGJARhdfs://hadoop002:9000/lib/hive-1.0-SNAPSHOT.jar;-- 查看函数列表showfunctionslike*sayhello*;2. 方案分析通过重启hiveserver2之后通过jdbc连接找到了此函数。相关参考见 [cloudera] Error executing a hive UDF through jbdc从上截图可以知道有两个要点要将所有的jar都放到各个节点的hiveserver2下重启所有的hiveserver通过操作之后发现方案可行3. 方案优化上面的解决方案虽然可行但运维成本较高现进行优化。3.1. 通过文件系统来保证jar包的节点一致性首先将所有的jar都放到各个hiveserver2节点下的原因是add jar使用了本地路径导致每个jdbc连接hiveserver2的时候都是从本地找jar。我们可以把jar放到hdfs上这样add jar每个hiveserver2都能够从远端拉去jar这就是文件的状态一致性。3.2. hiveserver2 session的更新优化其次要重启所有的hiveserver2这也造成一定的运维问题甚至会影响正在运行任务的jdbc连接。先看下hive架构图如果我们通过hive终端添加UDF函数那Hiveserver2中的session就不会同步到需要你重启才能加载最新的Hive session。如上架构图我们通过beeline或者jdbc的方式注册添加的UDF函数就直接会存在于HiveServer2中这样就不用重启。但另外需要注意的是JDBC连接不同的Hiveserver2这里我们称之为H2时因为只在H1上注册了UDF所以H2需要重启或需要再通过JDBC连接测试一遍。到这里我们就得到了较为简化后的执行方案具体操作见下节。二. 实现与操作通过beeline方式登录hivebeeline-u jdbc:hive2://hiveserver2-hostname:10000 -n user -p passwordudf绑定到某个库下usedatabaseA添加udfADDJAR hdfs:///xxx/hive-demo-1.0-SNAPSHOT.jar;CREATEFUNCTIONto_upper_xxxAScom.gao.udf.UpperCaseUDFUSINGJARhdfs:///xxx/hive-demo-1.0-SNAPSHOT.jar;测试上述创建的udf是绑定到databaseA库下。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →