通常,在使用第三方扩展或者UDF的时候,我们都需要将这个jar包在执行SQL前添加到Hive中去,目前我维护的HiveSQL中主要是有两种方式:

  • set hive.aux.jars.path
  • add jar

之前我个人一直使用的是add jar的方式,于是很好奇这两种有什么不一样的,经过一番搜索也没发现有什么主要的区别,这两种方式都是针对一次session生效的,据我搜索的统计(样本很少,请忽略),大部分开发者也都比较喜欢使用add jar来添加第三方的jar。
这里就主要说一下用法吧。

hive.aux.jars.path的用法

1
set hive.aux.jars.path=/tmp/elasticsearch-hadoop-5.2.2.jar;

这里的jar包必须上传到HDFS上的/tmp路径下才可以。如果你要添加本地的jar包,则需要写成如下形式:

1
set hive.aux.jars.path=file:///tmp/elasticsearch-hadoop-5.2.2.jar;

add jar的用法

1
add jar /tmp/elasticsearch-hadoop-5.2.2.jar;

这里的jar包读取的是本地的jar包。如果要添加HDFS上的jar包,则需要写成如下形式:

1
add jar hdfs:///tmp/elasticsearch-hadoop-5.2.2.jar;

hive-site.xml配置

如果你要在hive shell使其生效,也可以将这个jar包放在hive-site.xml的配置文件中,仅支持本地的文件系统,多个jar包可用,分隔:

1
2
3
4
<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/目录下,重启hiveserver2hive shell即可生效。

说明一下,为什么第一种和第二种说的是session,后面说的是hive shell和hiveserver呢?
因为第一种和第二种不管是hiveshell还是hiveserver,都是只生效一次。后面的hive shell则表示只对hive shell生效,hiveserver则表示都生效。

至于为什么我要使用add jar,主要是为了容错性吧,万一个别hive环境没有配置呢,找错误也很麻烦。