背景
Hadoop中mr计算太慢,故需更换tez引擎以提升速度。配置步骤如下记录。
前置插件准备:protobuf安装
注意:这里必须2.5.0版本,博主第一次装的是3.7.0版本,后续tez打包会报版本问题。
wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz # wget不到就手动下载
tar zxvf protobuf-2.5.0.tar.gz
yum install -y gcc-c++.x86_64 gcc-c++ make
cd protobuf-2.5.0/
./configure
make
make install
验证:
protoc --version # 显示libprotoc 2.5.0就表示安装成功了.**
tez源码编译
1、下载tez源码【本次使用的tez版本为0.9.2】。
wget https://dlcdn.apache.org/tez/0.9.2/apache-tez-0.9.2-src.tar.gz # 下载
tar -zxvf apache-tez-0.9.2-src.tar.gz # 解压
## 顺带找了0.9.1的,如有需要,自取。
wget https://archive.apache.org/dist/tez/0.9.1/apache-tez-0.9.1-src.tar.gz
2、修改apache-tez-0.9.2-src文件夹下的pom.xml配置项。【之后需要重新打包】
<!-- 第一处 -->
<hadoop.version>3.0.0-cdh6.3.1</hadoop.version>
<!-- 第二处 -->
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
<name>Cloudera Repositories</name>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<!-- 第三处 -->
<pluginRepository>
<id>cloudera</id>
<name>Cloudera Repositories</name>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</pluginRepository>
<!-- 第四处 -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
<!-- 第五处 -->
<!--<module>tez-ext-service-tests</module>
<module>tez-ui</module>-->
<!-- 注:将这两个注释掉,如果有需要可以不用注释 -->
3 、修改mapreduce的java文件。【网上看很多人都有这一步,博主这一步没报错,故没有修改,可忽略。】
# 报错:tez-mapreduce编译时,报ApplicationReport.newInstance() 89行异常,使用另一个方法newInstance()方法
vim tez-mapreduce/src/main/java/org/apache/tez/mapreduce/client/NotRunningJob.java
return ApplicationReport.newInstance(unknownAppId, unknownAttemptId, "N/A",
"N/A", "N/A", "N/A", 0, null, YarnApplicationState.NEW, "N/A", "N/A",
0, 0, 0, FinalApplicationStatus.UNDEFINED, null, "N/A", 0.0f, "TEZ_MRR", null);
#注:可以先进行编译,如果报这个错再进行修改这一步也行
4、maven编译【这里如果没有安装protoc,会有报错,具体安装步骤,见上文】
mvn clean package -Dmaven.javadoc.skip=true -Dmaven.test.skip=true
5、编译完成即可。
将tez集成到CDH
1、jar包上传到hdfs上
hadoop fs -mkdir /user/tez
hadoop fs -put tez-0.9.2.tar.gz /user/tez
2、创建tez-site.xml
cd /opt/cloudera/parcels/CDH/lib
mkdir -p tez/conf
cd tez/conf
vim tez-site.xml
tez-site.xml内容如下
<configuration>
<property>
<name>tez.lib.uris</name>
<value>${fs.defaultFS}/user/tez/tez-0.9.2.tar.gz</value>
</property>
<property>
<name>tez.use.cluster.hadoop-libs</name>
<value>false</value>
</property>
<property>
<name>tez.am.launch.env</name>
<value>LD_LIBRARY_PATH=${PARCELS_ROOT}/CDH/lib/hadoop/lib/native</value>
</property>
<property>
<name>tez.task.launch.env</name>
<value>LD_LIBRARY_PATH=${PARCELS_ROOT}/CDH/lib/hadoop/lib/native</value>
</property>
</configuration>
3、拷贝jar包
# 将tez-0.9.2-minimal文件夹下的jar及lib下的jar拷贝到上述创建的tez中
4、避免kryo的错误【网上看到的操作,不过博主没遇到,故可先忽略】
java.lang.NoClassDefFoundError: com/esotericsoftware/shaded/org/objenesis/strategy/InstantiatorStrategy
解决方法如下:
cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hive/auxlib
mv hive-exec-2.1.1-cdh6.3.2-core.jar hive-exec-2.1.1-cdh6.3.2-core.jar.bck
mv hive-exec-core.jar hive-exec-core.jar.bck
5、配置CDH配置env配置文件
操作如下:
# 配置项:HiveServer2 环境高级配置代码段(安全阀)
# 值:HADOOP_CLASSPATH=/opt/cloudera/parcels/CDH/lib/tez/conf:/opt/cloudera/parcels/CDH/lib/tez/*:/opt/cloudera/parcels/CDH/lib/tez/lib/*
注意配置项,这里如果配置项搞成【 Gateway 客户端环境高级配置代码段(安全阀)】,后面会出现找不到jar包的报错!!!
Error: Error running query: java.lang.NoClassDefFoundError: org/apache/tez/runtime/api/Event (state=,code=0)
6、tez分发
将我们上述我们创建的tez目录【/opt/cloudera/parcels/CDH/lib/tez】分发到集群的其他节点下。
7、重启hive及其相关组件的服务。
验证
set hive.execution.engine=tez;
至此,收工。
参考文章:
CDH6.2.0环境下安装Tez
安装protobuff后 protoc --version 显示 bash: protoc: command not found