Hive3.1.2+大數據引擎Tez0.9.2安裝部署到使用測試(踩坑詳情)

寫在前面的話:本篇博客爲原創,如果安裝版本號和我一樣的可以直接在我公衆號下載我編譯好的,回覆tez即可,歡迎討論
歡迎關注公衆號:後來X

安裝tez的過程可謂是坑有點多,編譯還是相對簡單的。現在覆盤一下,以下是我的版本號

框架 版本號
Hadoop 3.1.3
Hive 3.1.2
Tez 0.10.1

能看到這篇文章的,說明各位也能知道tez是幹啥的,這裏就不介紹了,直接開始安裝

我們可以在官網看到,Hadoop3.X版本要使用Tez引擎是需要自己編譯的(對於0.8.3和更高版本的Tez,Tez需要Apache Hadoop的版本爲2.6.0或更高。對於0.9.0及更高版本的Tez,Tez需要Apache Hadoop爲2.7.0或更高版本。)

如果大家在編譯過程中遇到一些問題,也可以直接聯繫我(l970306love),說不定你的這個問題我正好遇到過,可以節省很多沒必要的時間,哈哈。

1、編譯Tez0.10.1過程:遵循官網流程(我這裏以Tez0.9.2舉例,版本號和我一樣的可以直接下載我編譯好的,下面貼鏈接)

鏈接:https://pan.baidu.com/s/1FQQh_bPrq0pu6CUe12nSxQ
提取碼:hi3j

  1. 下載tez的src.tar.gz源碼包,附官方下載鏈接(http://tez.apache.org/releases/index.html),下載之後上傳到linux系統中,並且解壓出來,我以下載的是 0.9.2舉例,新版的tez0.10.1需要在github下載,附鏈接(https://github.com/apache/tez)在這裏插入圖片描述
    在這裏插入圖片描述
  2. 需要在pom.xml中更改hadoop.version屬性的值,以匹配所使用的hadoop分支的版本。我這裏是Apache Hadoop 3.1.3
    在這裏插入圖片描述
    在這裏插入圖片描述
  3. ,還有就是guava的版本,這個插件的版本也是至關重要,希望大家提前修改,把這個問題扼殺在搖籃裏,我們可以看到hadoop 3.1.3使用的guava版本是27.0-jre,而tez默認的是11.0.2,所以一定要修改,否則後期在裝好tez也會不能用。
[later@bigdata101 lib]# cd /opt/module/hadoop-3.1.3/share/hadoop/common/lib/
[later@bigdata101 lib]# ls |grep guava
guava-27.0-jre.jar
listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar

在這裏插入圖片描述
在這裏插入圖片描述

  1. 還有就是在tez編譯時,tez-ui這個模塊是耗時耗力不討好,而且沒啥用,所以我們可以直接跳過
    在這裏插入圖片描述
  2. 這一步結束後就是開始編譯了,首先要有編譯環境是必須的,所以要安裝maven,安裝git,這兩塊參考我之前的文章(https://blog.csdn.net/weixin_38586230/article/details/105725346),最後安裝編譯工具
### 安裝編譯工具
yum -y install autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++
  1. 先安裝protobuf(官網讓安裝2.5.0版本的),下載鏈接(https://github.com/protocolbuffers/protobuf/tags)下好源碼包後,解壓,並且編譯protobuf 2.5.0
./configure
make install
  1. 開始編譯Tez(這個過程的時間就因人而異了)
mvn clean package -DskipTests=true -Dmaven.javadoc.skip=true`
  1. 編譯成功後,包會在apache-tez-0.9.2-src/tez-dist/target/目錄下,我們需要的是這連兩個,我截圖的是0.10.1,不過除了版本號其餘的是一樣的
    在這裏插入圖片描述

2、爲Hive配置Tez了

  1. 將tez安裝包拷貝到集羣,並解壓tar包,注意解壓的是minimal
 mkdir /opt/module/tez
 tar -zxvf /opt/software/tez-0.10.1-SNAPSHOT-minimal.tar.gz -C /opt/module/tez
  1. 上傳tez依賴到HDFS(上傳的是不帶minimal的那個)
hadoop fs -mkdir /tez(集羣創建/tez路徑,然後再上傳,注意路徑)
hadoop fs -put /opt/software/tez-0.10.1-SNAPSHOT.tar.gz /tez
  1. 新建tez-site.xml在$HADOOP_HOME/etc/hadoop/路徑下(注意,不要放在hive/conf/目錄下,不生效),記得把tez-site.xml同步到集羣其他機器。
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 注意你的路徑以及文件名是否和我的一樣 -->
<property>
        <name>tez.lib.uris</name>
    <value>${fs.defaultFS}/tez/tez-0.10.1-SNAPSHOT.tar.gz</value>
</property>
<property>
     <name>tez.use.cluster.hadoop-libs</name>
     <value>true</value>
</property>
<property>
     <name>tez.am.resource.memory.mb</name>
     <value>1024</value>
</property>
<property>
     <name>tez.am.resource.cpu.vcores</name>
     <value>1</value>
</property>
<property>
     <name>tez.container.max.java.heap.fraction</name>
     <value>0.4</value>
</property>
<property>
     <name>tez.task.resource.memory.mb</name>
     <value>1024</value>
</property>
<property>
     <name>tez.task.resource.cpu.vcores</name>
     <value>1</value>
</property>
</configuration>

  1. 修改Hadoop環境變量,添加以下內容
    在這裏插入圖片描述
hadoop_add_profile tez
function _tez_hadoop_classpath
{
    hadoop_add_classpath "$HADOOP_HOME/etc/hadoop" after
    hadoop_add_classpath "/opt/module/tez/*" after
    hadoop_add_classpath "/opt/module/tez/lib/*" after
}

效果如圖
在這裏插入圖片描述

  1. 修改hive的計算引擎,vim $HIVE_HOME/conf/hive-site.xml
    添加以下內容
<property>
    <name>hive.execution.engine</name>
    <value>tez</value>
</property>
<property>
    <name>hive.tez.container.size</name>
    <value>1024</value>
</property>
  1. 在hive-env.sh中添加tez的路徑
    在這裏插入圖片描述
export TEZ_HOME=/opt/module/tez    #是你的tez的解壓目錄
export TEZ_JARS=""
for jar in `ls $TEZ_HOME |grep jar`; do
    export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/$jar
done
for jar in `ls $TEZ_HOME/lib`; do
    export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/lib/$jar
done

export HIVE_AUX_JARS_PATH=/opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar$TEZ_JARS

注意你的jar包路徑是不是和我的一樣,需要編譯lzo的看我另一篇博客安裝編譯lzo,附鏈接(https://blog.csdn.net/weixin_38586230/article/details/106035660)

  1. 解決日誌Jar包衝突
rm /opt/module/tez/lib/slf4j-log4j12-1.7.10.jar
  1. 到此爲止,hive的配置算是搞定了,我們先來跑一下官方給的測試案例,需要大家在本地先隨便寫個文件,然後上傳到hdfs上,我這裏寫了個word.txt,上傳到了hdfs上
    在這裏插入圖片描述
    在這裏插入圖片描述
## 把這個文件上傳到hdfs
hadoop fs -put word.txt /tez/

在這裏插入圖片描述

## 開始測試wordcount,注意你的jar包路徑
/opt/module/hadoop-3.1.3/bin/yarn jar /opt/module/tez/tez-examples-0.10.1-SNAPSHOT.jar orderedwordcount /tez/word.txt /tez/output/

跑完的結果如下
在這裏插入圖片描述
在yarn上也能看到這個任務
在這裏插入圖片描述

  1. 到這裏就再開始測試hive中能不能使用tez引擎
1)啓動Hive
[later@bigdata101 hive]$ hive
2)創建表
hive (default)> create table student(
id int,
name string);
3)向表中插入數據
hive (default)> insert into student values(1,"zhangsan");
4)如果沒有報錯就表示成功了
hive (default)> select * from student;
1       zhangsan

**

這裏記得設置一下 set mapreduce.framework.name = yarn;

**

踩坑1

在這裏插入圖片描述

Application application_1589119407952_0003 failed 2 times due to AM Container for appattempt_1589119407952_0003_000002 exited with exitCode: -103
Failing this attempt.Diagnostics: [2020-05-10 22:06:09.140]Container [pid=57149,containerID=container_e14_1589119407952_0003_02_000001] is running 759679488B beyond the 'VIRTUAL' memory limit. Current usage: 140.9 MB of 1 GB physical memory used; 2.8 GB of 2.1 GB virtual memory used. Killing container.
Dump of the process-tree for container_e14_1589119407952_0003_02_000001 :
|- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
|- 57149 57147 57149 57149 (bash) 0 2 118079488 368 /bin/bash -c /opt/module/jdk1.8.0_211/bin/java -Djava.io.tmpdir=/opt/module/hadoop-3.1.3/tmp/nm-local-dir/usercache/later/appcache/application_1589119407952_0003/container_e14_1589119407952_0003_02_000001/tmp -server -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx1024m -Dlog4j.configuratorClass=org.apache.tez.common.TezLog4jConfigurator -Dlog4j.configuration=tez-container-log4j.properties -Dyarn.app.container.log.dir=/opt/module/hadoop-3.1.3/logs/userlogs/application_1589119407952_0003/container_e14_1589119407952_0003_02_000001 -Dtez.root.logger=INFO,CLA -Dsun.nio.ch.bugLevel='' org.apache.tez.dag.app.DAGAppMaster --session 1>/opt/module/hadoop-3.1.3/logs/userlogs/application_1589119407952_0003/container_e14_1589119407952_0003_02_000001/stdout 2>/opt/module/hadoop-3.1.3/logs/userlogs/application_1589119407952_0003/container_e14_1589119407952_0003_02_000001/stderr
|- 57201 57149 57149 57149 (java) 871 158 2896457728 35706 /opt/module/jdk1.8.0_211/bin/java -Djava.io.tmpdir=/opt/module/hadoop-3.1.3/tmp/nm-local-dir/usercache/later/appcache/application_1589119407952_0003/container_e14_1589119407952_0003_02_000001/tmp -server -Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx1024m -Dlog4j.configuratorClass=org.apache.tez.common.TezLog4jConfigurator -Dlog4j.configuration=tez-container-log4j.properties -Dyarn.app.container.log.dir=/opt/module/hadoop-3.1.3/logs/userlogs/application_1589119407952_0003/container_e14_1589119407952_0003_02_000001 -Dtez.root.logger=INFO,CLA -Dsun.nio.ch.bugLevel= org.apache.tez.dag.app.DAGAppMaster --session
[2020-05-10 22:06:09.222]Container killed on request. Exit code is 143
[2020-05-10 22:06:09.229]Container exited with a non-zero exit code 143.
For more detailed output, check the application tracking page: http://bigdata101:8088/cluster/app/application_1589119407952_0003 Then click on links to logs of each attempt.
. Failing the application.

這個錯誤還是比較 明細的,就是說tez檢查內存不夠了,這個解決辦法兩個,

  • 關閉虛擬內存檢查
    (1)關掉虛擬內存檢查,修改yarn-site.xml

    yarn.nodemanager.vmem-check-enabled
    false

    (2)修改後一定要分發,並重新啓動hadoop集羣。

  • 把內存調大(hive-site.xml)如下圖
    在這裏插入圖片描述

踩坑2

tez跑任務報錯:
java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2570)
at java.lang.Class.getMethod0(Class.java:2813)
at java.lang.Class.getMethod(Class.java:1663)
at org.apache.hadoop.util.ProgramDriver$ProgramDescription.(ProgramDriver.java:59)
at org.apache.hadoop.util.ProgramDriver.addClass(ProgramDriver.java:103)
at org.apache.tez.examples.ExampleDriver.main(ExampleDriver.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.lang.ClassNotFoundException: org.apache.tez.dag.api.TezConfiguration

看起來是告訴我配置什麼的找不到,那不就是相當於意味着我的tez配置有問題啊,所以我把tez-site.xml放到了$HADOOP_HOME/etc/hadoop/下,以前是放在hive/conf/目錄下不生效

踩坑3

在這裏插入圖片描述

Status: Failed
Vertex failed, vertexName=Map 1, vertexId=vertex_1589119407952_0008_1_00, diagnostics=[Vertex vertex_1589119407952_0008_1_00 [Map 1] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: _dummy_table initializer failed, vertex=vertex_1589119407952_0008_1_00 [Map 1], org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/tmp/later/5649ae4c-2ca8-4c7a-82fe-c3003a953682/hive_2020-05-10_22-19-58_227_6887259009104125247-1/dummy_path
	at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:332)
	at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:274)
	at org.apache.hadoop.hive.shims.Hadoop23Shims$1.listStatus(Hadoop23Shims.java:134)
	at org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat.getSplits(CombineFileInputFormat.java:217)
	at org.apache.hadoop.mapred.lib.CombineFileInputFormat.getSplits(CombineFileInputFormat.java:76)
	at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileInputFormatShim.getSplits(HadoopShimsSecure.java:321)
	at org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getCombineSplits(CombineHiveInputFormat.java:444)
	at org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getSplits(CombineHiveInputFormat.java:564)
	at org.apache.tez.mapreduce.hadoop.MRInputHelpers.generateOldSplits(MRInputHelpers.java:489)
	at org.apache.tez.mapreduce.hadoop.MRInputHelpers.generateInputSplitsToMem(MRInputHelpers.java:338)
	at org.apache.tez.mapreduce.common.MRInputAMSplitGenerator.initialize(MRInputAMSplitGenerator.java:122)
	at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:280)
	at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:271)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1729)
	at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:271)
	at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:255)
	at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125)
	at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:57)
	at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:78)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
]

在hive中執行插入語句時,報錯,看起來時某某路徑不存在,但實際上分析是由於“ mapreduce.framework.name = local”(Hadoop 3.2.1中的默認設置)引起的。通過“ set mapreduce.framework.name = yarn”解決。
在這裏插入圖片描述

踩坑4

在這裏插入圖片描述

Application application_1589119407952_0002 failed 2 times due to AM Container for appattempt_1589119407952_0002_000002 exited with exitCode: 1
Failing this attempt.Diagnostics: [2020-05-10 22:05:49.552]Exception from container-launch.
Container id: container_e14_1589119407952_0002_02_000001
Exit code: 1
[2020-05-10 22:05:49.652]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/module/hadoop-3.1.3/tmp/nm-local-dir/filecache/10/tez-0.10.1-SNAPSHOT.tar.gz/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/module/hadoop-3.1.3/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
[2020-05-10 22:05:49.652]Container exited with a non-zero exit code 1. Error file: prelaunch.err.
Last 4096 bytes of prelaunch.err :
Last 4096 bytes of stderr :
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/module/hadoop-3.1.3/tmp/nm-local-dir/filecache/10/tez-0.10.1-SNAPSHOT.tar.gz/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/module/hadoop-3.1.3/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
For more detailed output, check the application tracking page: http://bigdata101:8088/cluster/app/application_1589119407952_0002 Then click on links to logs of each attempt.
. Failing the application.

這個問題是這裏面最頭疼的問題了,看不出來任何bug,只知道tez session不能訪問AM,遇到這個情況,我們在啓動hive的時候我們就使用
hive --hiveconf hive.root.logger=DEBUG,console
來讓它打印出所有的日誌信息,方便找到問題在哪裏,我遇到的這個在打印日誌的時候一直打印 dest目標路徑不存在,雖然是INFO日誌,最後輸出一會兒就卡住不動了,是這麼個頁面
在這裏插入圖片描述
那麼這個時候你如果你不管它空不空白,直接再寫sql查詢的時候,它就會正常進入到hive的shell命令行,但就是執行插入語句,使用到tez的時候會報錯,但這個報錯會給你詳細的日誌,我的日誌就是上面 踩坑3 中遇到的問題。

如果大家在編譯過程中遇到一些問題,也可以直接聯繫我(l970306love),說不定你的這個問題我正好遇到過,可以節省很多沒必要的時間,哈哈。

編譯要有一顆平常心,按照一個帖子的方法裝就好,不然最後裝的亂七八糟的。加油。

下載我編譯好的tez jar包,關注我的公衆號“後來X”,回覆tez

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章