通常,在使用第三方扩展或者UDF的时候,我们都需要将这个jar包在执行SQL前添加到Hive中去,目前我维护的HiveSQL中主要是有两种方式:
- set hive.aux.jars.path
- add jar
之前我个人一直使用的是add jar
的方式,于是很好奇这两种有什么不一样的,经过一番搜索也没发现有什么主要的区别,这两种方式都是针对一次session
生效的,据我搜索的统计(样本很少,请忽略),大部分开发者也都比较喜欢使用add jar
来添加第三方的jar。
这里就主要说一下用法吧。
hive.aux.jars.path的用法
set hive.aux.jars.path=/tmp/elasticsearch-hadoop-5.2.2.jar;
这里的jar包必须上传到HDFS上的/tmp路径下才可以。如果你要添加本地的jar包,则需要写成如下形式:
set hive.aux.jars.path=file:///tmp/elasticsearch-hadoop-5.2.2.jar;
add jar的用法
add jar /tmp/elasticsearch-hadoop-5.2.2.jar;
这里的jar包读取的是本地的jar包。如果要添加HDFS上的jar包,则需要写成如下形式:
add jar hdfs:///tmp/elasticsearch-hadoop-5.2.2.jar;
hive-site.xml配置
如果你要在hive shell使其生效,也可以将这个jar包放在hive-site.xml的配置文件中,仅支持本地的文件系统,多个jar包可用,分隔:
<property> <name>hive.aux.jars.path</name> <value>file:///tmp/elasticsearch-hadoop-5.2.2.jar</value> </property>
对hiveserver有效的配置
正常的数据计算应该都是通过hiveserver2来实现hive任务的执行,那么针对hive-site.xml
的配置是对hiveserver2是无效的,可以通过如下方式实现对hiveserver2
的添加jar包,并且永久有效。
在根目录${HIVE_HOME}
下创建文件夹auxlib
,将elasticsearch-hadoop-5.2.2.jar
放入这个目录中即可,对于hive shell
,无需重启即可生效,对于hiveserver2
来说,需要重启服务生效。
简单粗暴的配置
针对上面的4种情况,都相对比较麻烦,那么比较简单粗暴的做法就是直接将elasticsearch-hadoop-5.2.2.jar
放入${HIVE_HOME}/lib/
目录下,重启hiveserver2
和hive shell
即可生效。
说明一下,为什么第一种和第二种说的是session,后面说的是hive shell和hiveserver呢?
因为第一种和第二种不管是hiveshell还是hiveserver,都是只生效一次。后面的hive shell则表示只对hive shell生效,hiveserver则表示都生效。
至于为什么我要使用add jar
,主要是为了容错性吧,万一个别hive环境没有配置呢,找错误也很麻烦。
一直都看不懂JAVA!