1. 程式人生 > 其它 >CDH6.3.2版本搭建Tez執行引擎過程

CDH6.3.2版本搭建Tez執行引擎過程

一、準備工作

hive本身支援hive on mr、hive on spark 和hive on tez三種執行引擎,CDH6.3.x及其以下版本都沒有支援tez執行引擎,需要使用的話需要單獨引入。由於CDH的hadoop版本進行了改造,因此tez的開源release版本不能直接使用,需要整合CDH的hadoop版本。

1、下載tez的原始碼進行編譯

http://www.apache.org/dyn/closer.lua/tez/0.9.2/

2、原始碼編譯過程中hadoop中需要使用protobuf,需要下載protobuf-2.5.0

https://github.com/protocolbuffers/protobuf/releases

其中window版本使用protoc-2.5.0-win32.zip,直接解壓,然後配置到環境變數中就可以了。

liunx版本使用protobuf-2.5.0.tar.gz

3、使用window編譯,需要下載git bash,然後使用git命令來編譯

二、編譯tez

1、將apache-tez-0.9.2-src.tar.gz解壓,然後使用idea修改pom配置,第一處為修改,其餘為新增

第一處:
<hadoop.version>3.0.0-cdh6.3.2</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>--> 注:將這兩個註釋掉,如果有需要可以不用註釋

2、修改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);
注:可以先進行編譯,如果報這個錯再進行修改這一步也行

3、使用git bash進入到原始碼目錄,然後執行如下maven命令編譯

mvn clean package -Dmaven.javadoc.skip=true -Dmaven.test.skip=true
注:這樣會跳過test編譯,很快就編譯完成

4、編譯完後的地址,cd tez-dist/target

三、整合到CDH6.3.2版本中

1、將tez的jar包上傳到hdfs中

1. 建立目錄
hadoop fs -mkdir /tez 2. 上傳到hdfs
hadoop fs -put tez-0.9.2.tar.gz /tez

2、將tez整合到hive中,叢集中的每臺伺服器都需要操作

1.進到cdh的lib包目錄
cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib 2.創景tez目錄
mkdir tez 3.建立tez配置檔案
vim tez
-site.xml
<configuration> <property> <name>tez.lib.uris</name> <value>${fs.defaultFS}/apps/tez-0.9.1/tez-0.9.1.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>

<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

4.1 cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hive/auxlib
4.2 mv hive-exec-2.1.1-cdh6.3.2-core.jar hive-exec-2.1.1-cdh6.3.2-core.jar.bck
4.3 mv hive-exec-core.jar hive-exec-core.jar.bck

4.4 從 /opt/cloudera/parcels/CDH-6.0.1-1.cdh6.0.1.p0.590678/jars中拷貝kryo-2.22.jar到tez資料夾下的lib資料夾下,防止出現以下異常:

java.lang.ClassNotFoundException: com.esotericsoftware.kryo.Serializer

4.5 tez/lib中包含slf4j的jar包,會列印較多日誌,可以在客戶端中去掉slf4j-api-1.7.10.jar、slf4j-log4j12-1.7.10.jar這兩個jar包,減少日誌列印,

5、配置hive的env配置檔案
5.1 新增:HADOOP_CLASSPATH=/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/tez/conf:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/tez/*:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/tez/lib/*
5.2 部署客戶端配置
5.3 重啟需要元件

內容如下:

HADOOP_CLASSPATH=/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.590678/lib/tez/conf:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.590678/lib/tez/*:/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.590678/lib/tez/lib/*
然後儲存並部署客戶端配置,這樣配置的環境變數才會生效。

6、測試

hive //進入hive cli

hive> set hive.tez.container.size=3020;

hive> set hive.execution.engine=tez;

執行left join的語句

SELECT
A.CalDate,
A.InnerCode,
A.SecuCode,
A.SecuAbbr,
A.SecuMarket,
A.RuleCode,
A.RuleDesc,
2 AS DataFlag
FROM TMP_DWD_PC_INT_ZM_StockPoolComponent A
JOIN DWD_PC_INT_ZM_StockPoolComponent B ON A.CalDate=B.CalDate AND A.RuleCode=B.RuleCode AND A.SecuCode=B.SecuCode AND NVL(A.SecuMarket,0)=NVL(B.SecuMarket,0)
AND B.DELDATE='99991231'
WHERE NVL(A.InnerCode,0)<>NVL(B.InnerCode,0)
OR NVL(A.SecuAbbr,'')<>NVL(B.SecuAbbr,'')
OR NVL(A.RuleDesc,'')<>NVL(B.RuleDesc,'');