1. 程式人生 > 其它 >Hive 從 0 到 1 學習 —— 第三章 Hive 執行引擎 Tez

Hive 從 0 到 1 學習 —— 第三章 Hive 執行引擎 Tez

技術標籤:大資料hivehive

文章目錄


Tez 是一個 Hive 的執行引擎,效能優於 MR。為什麼呢?看下圖:
在這裡插入圖片描述

用 Hive 直接編寫 MR 程式,假設有四個有依賴關係的 MR 作業,上圖中,綠色是 Reduce Task,雲狀表示寫遮蔽,需要將中間結果持久化寫到 HDFS。

Tez 可以將多個有依賴的作業轉換為一個作業,這樣只需寫一次 HDFS,且中間節點較少,從而大大提升作業的計算效能。

1. Tez 安裝

1.1 安裝包準備

  1. 下載tez的依賴包

    http://tez.apache.org

  2. 拷貝 apache-tez-0.9.1-bin.tar.gz到 hadoop102 的 /opt/module目錄

    [[email protected] module]$ ls apache-tez-0.9.1-bin.tar.gz
    
  3. 解壓縮 apache-tez-0.9.1-bin.tar.gz

    [[email protected] module]$ tar -zxvf apache-tez-0.9.1-bin.tar.gz
    
  4. 修改名稱

    [[email protected] module]$ mv apache-tez-0.9.1-bin/ tez
    

2. 在 Hive 中配置 Tez

  1. 進入到Hive的配置目錄:/opt/module/hive/conf

    [[email protected] conf]$ cd /opt/module/hive/conf
    
  2. hive-env.sh檔案中新增 tez 環境變數配置和依賴包環境變數配置

    [[email protected] conf]$ vim hive-env.sh
    

    新增如下配置:

    export TEZ_HOME=/opt/module/tez    #是你的tez的解壓目錄
    export s=""
    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-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20.jar$TEZ_JARS
  3. hive-site.xml檔案中新增如下配置,更改 hive 計算引擎

    <property>
        <name>hive.execution.engine</name>
        <value>tez</value>
    </property>
    

3. 配置 Tez

在 Hive 的 /opt/module/hive/conf下面建立一個 tez-site.xml 檔案

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>tez.lib.uris</name>
        <value>${fs.defaultFS}/tez/tez,${fs.defaultFS}/tez/tez/lib</value>
    </property>
    <property>
        <name>tez.lib.uris.classpath</name>
        <value>${fs.defaultFS}/tez/tez,${fs.defaultFS}/tez/tez/lib</value>
    </property>
    <property>
        <name>tez.use.cluster.hadoop-libs</name>
        <value>true</value>
    </property>
    <property>
        <name>tez.history.logging.service.class</name>
        <value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value>
    </property>
</configuration>

4. 上傳 Tez 到叢集

1)將 /opt/module/tez上傳到HDFS的 /tez路徑

[[email protected] conf]$ hadoop fs -mkdir /tez
[[email protected] conf]$ hadoop fs -put /opt/module/tez/ /tez
[[email protected] conf]$ hadoop fs -ls /tez
/tez/tez

5. 測試

  1. 啟動 Hive

    [[email protected] hive]$ bin/hive
    
  2. 建立 LZO 表

    hive (default)> create table student(
    id int,
    name string);
    
  3. 向表中插入資料

    hive (default)> insert into student values(1,"張三");
    
  4. 如果沒有報錯就表示成功了

    hive (default)> select * from student;
    1    張三
    

6. 小結

  1. 執行Tez時檢查到用過多記憶體而被NodeManager殺死程序問題:

    Caused by: org.apache.tez.dag.api.SessionNotRunning: TezSession has already shutdown. Application application_1546781144082_0005 failed 2 times due to AM Container for appattempt_1546781144082_0005_000002 exited with  exitCode: -103
    For more detailed output, check application tracking page:http://hadoop103:8088/cluster/app/application_1546781144082_0005Then, click on links to logs of each attempt.
    Diagnostics: Container [pid=11116,containerID=container_1546781144082_0005_02_000001] is running beyond virtual memory limits. Current usage: 216.3 MB of 1 GB physical memory used; 2.6 GB of 2.1 GB virtual memory used. Killing container.
    

    這種問題是從機上執行的Container試圖使用過多的記憶體,而被NodeManager kill掉了。

    [摘錄] The NodeManager is killing your container. It sounds like you are trying to use hadoop streaming which is running as a child process of the map-reduce task. The NodeManager monitors the entire process tree of the task and if it eats up more memory than the maximum set in mapreduce.map.memory.mb or mapreduce.reduce.memory.mb respectively, we would expect the Nodemanager to kill the task, otherwise your task is stealing memory belonging to other containers, which you don't want.
    

    解決方法:

    方案一:關掉虛擬記憶體檢查。我們選這個,修改 yarn-site.xml

    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
    

    方案二:mapred-site.xml中設定 Map 和 Reduce 任務的記憶體配置如下:( value 中實際配置的記憶體需要根據自己機器記憶體大小及應用情況進行修改)

    <property>
        <name>mapreduce.map.memory.mb</name>
        <value>1536</value>
    </property>
    <property>
        <name>mapreduce.map.java.opts</name>
        <value>-Xmx1024M</value>
    </property>
    <property>
        <name>mapreduce.reduce.memory.mb</name>
        <value>3072</value>
    </property>
    <property>
        <name>mapreduce.reduce.java.opts</name>
        <value>-Xmx2560M</value>
    </property>