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,'');






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM