配置 hive on tez
公司的 Hadoop 集群是 CDH 5.12.0 ,它的 Hive 的版本是 1.1.0 。我用的 tez 版本是 0.9.0 。
让 hive 使用 Apache Tez 不难,参考tez官方文档编译即可。
注意的点有以下几个:
- Tez 依赖 protobuf ,编译的机器上要先安装这个。我用的是 protobuf-2.5.0 。
- Tez 需要用 maven3 来编译,版本最低也要 3.1.1 。
- 修改 tez 源代码目录下的全局 pom.xml ,改
hadoop.version
的值,和目标 cdh 的 hadoop version 相同。 - 修改 tez 源代码目录下的全局 pom.xml ,添加如下内容:
<profile>
<id>cdh5.12.0</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<hadoop.version>2.6.0-cdh5.12.0</hadoop.version>
</properties>
<pluginRepositories>
<pluginRepository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</pluginRepository>
<pluginRepository>
<id>nexus public</id>
<url>http://central.maven.org/maven2/</url>
</pluginRepository>
</pluginRepositories>
<repositories>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
<repository>
<id>nexus public</id>
<url>http://central.maven.org/maven2/</url>
</repository>
</repositories>
</profile>
- 修改 tez 目录下
tez-mapreduce/src/main/java/org/apache/tez/mapreduce/hadoop/mapreduce/JobContextImpl.java
,添加如下内容:
@Override
public boolean userClassesTakesPrecedence() {
return getJobConf().getBoolean(MRJobConfig.MAPREDUCE_JOB_USER_CLASSPATH_FIRST, false);
}
- 在 HDFS 上直接放
tez-0.9.0.minial.tar.gz
也可以。但我是将它解压后再放到 HDFS 上。
让 beeline 也支持 hive on tez
这里主要参考了这个文档,因为我这里的集群 HDFS 的 namenode 开了 HA ,所以在 tez-site.xml
里设置 tez.lib.uris 时,变量是用的 ${fs.defaultFS} ,如果没有 HA ,应该用 ${fs.default.name} 。
注意在设置 HiveServer2 的环境变量时, HADOOP_CLASSPATH
是要包含 tez-site.xml 所在目录的。
设置好重启 HiveServer2 服务后,就可以在 beeline 里,通过
SET hive.execution.engine=tez;
来使用 hive on tez 了。
如果在执行查询语句时,出现了 Caused by: java.lang.ClassNotFoundException: com.esotericsoftware.kryo.Serializer
这样的错误时,可将 /opt/cloudera/parcels/CDH/jars/kryo-2.22.jar
我这里是 parcel 方式安装的 CDH 集群,习惯放到 /opt 目录下。放到 HiveServer2 节点本地及 HDFS 上的 tez 的 lib 目录下。
Comments