Hive On Tez報錯彙總

前言

  • Hive:2.3.0
  • Hadoop:2.7.7
  • JDK:1.8.0_221
  • Tez:0.9.1

報錯一

報錯內容:

在Hive下使用Tez引擎執行MR Job時報錯:Container killed on request. Exit code is 143

問題分析:

Container killed on request這幾個關鍵字就可以猜測,Container在非正常結束時被kill,很有可能就是Container使用的內存超出Container限制導致的。

查看Hive運行日誌:

Hive的默認日誌存放路徑爲${sys:java.io.tmpdir}/${sys:user.name},可以通過修改log4j日誌框架配置文件hive/conf/hive-log4j2.properties中的property.hive.log.dir參數,自定義Hive日誌文件輸出路徑。Hive日誌默認按天進行滾動,property.hive.log.dir下的hive.log文件代表當天運行日誌,帶有後綴的代表之前某天的Hive運行日誌文件。

通過日誌定位問題:

通過查看Hive運行日誌,發現了Application失敗的診斷信息(Diagnostics),並根據Hive日誌提供的app跟蹤鏈接(本次日誌中顯示的是http://hadoop102:8088/cluster/app/application_1591155550718_0012),查看到了具體的診斷信息:

Diagnostics: Container [pid=35306,containerID=container_1591155550718_0012_02_000001] is running beyond virtual memory limits. Current usage: 244.1 MB of 1 GB physical memory used; 2.3 GB of 2.1 GB virtual memory used. Killing container.

由診斷信息可以得知,Container運行時超過了虛擬內存限制,故非正常終結kill了Container,故接下來首個嘗試的優化方案就是調整Hadoop集羣的虛擬內存相關參數


解決方案:

方案一:

解除YARN的虛擬內存檢查,即不限制Container對於虛擬內存的使用,在yarn-site.xml配置文件的configuration標籤中增加以下配置參數:

    <!-- 是否限制Container對於虛擬內存的使用,即使超出預設的虛擬內存大小 -->
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
        <description>
            Whether virtual memory limits will be enforced for containers.
        </description>
    </property>

在yarn-site.xml配置文件中設置此參數,然後發往集羣中所有節點,然後重啓Hadoop集羣


方案二:

既然是Container導致虛擬內存不足,故嘗試增大虛擬內存,即增大虛擬內存與分配給Container的物理內存比例,在yarn-site.xml配置文件的configuration標籤中設置以下參數,適當增大此比例:

    <!-- 用於分配給Container的虛擬內存與物理內存的比例,
    當物理內存不夠用時,便會使用虛擬內存通過外部存儲設備,代替部分物理內存使用. -->
    <!-- 默認值:2.1 -->
    <property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>4</value>
        <description>
            Ratio between virtual memory to physical memory when
            setting memory limits for containers. Container allocations are
            expressed in terms of physical memory, and virtual memory usage
            is allowed to exceed this allocation by this ratio.
        </description>
    </property>

在yarn-site.xml配置文件中設置此參數,然後發往集羣中所有節點,然後重啓Hadoop集羣


方案三:

減少Tez Task的JVM堆內存分配,降低JVM堆內存與Container內存大小的比例,即在tez-size.xml文件中設置參數tez.container.max.java.heap.fraction的值,此參數默認值爲0.8,適當降低此值,然後重啓Hive。

    <property>
        <name>tez.container.max.java.heap.fraction</name>
        <value>0.2</value>
        <description>
            Double value. Tez automatically determines the Xmx for the JVMs used to run
            Tez tasks and app masters. This feature is enabled if the user has not
            specified Xmx or Xms values in the launch command opts. Doing automatic Xmx
            calculation is preferred because Tez can determine the best value based on
            actual allocation of memory to tasks the cluster. The value if used as a
            fraction that is applied to the memory allocated Factor to size Xmx based
            on container memory size. Value should be greater than 0 and less than 1.

            Set this value to -1 to allow Tez to use different default max heap fraction
            for different container memory size. Current policy is to use 0.7 for container
            smaller than 4GB and use 0.8 for larger container.
            如果沒有設置 tez.am.launch.cmd-opts 參數,則便會使用此功能.
            此參數設定Tez Job所能使用的JVM堆內存佔整個Container內存大小的比例
            如果YARN中的container內存資源較少,則將此值適當減小,反之則適當增大,默認值爲0.8.
        </description>
        <type>float</type>
    </property>

報錯二:

在配置Tez成功之後,使用默認的MR執行Job時報錯:

FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. DEFAULT_MR_AM_ADMIN_USER_ENV

報錯原因:

這是因爲在配置Tez時,添加了tez的jar包路徑到HADOOP_CLASSPATH中,其中由於tez-0.9.1/lib下存在幾個hadoop依賴,而這些依賴與當前hadoop集羣的版本不同,而導致版本衝突,故在Hive中使用MR引擎執行任務時,報出此錯誤

解決方案:

1)刪除tez-0.9.1/lib下的hadoop相關的jar包:

rm hadoop-mapreduce-client-core-2.7.0.jar
rm hadoop-mapreduce-client-common-2.7.0.jar

2)將集羣中hadoop中的對應jar包複製添加到tez-0.9.1/lib下(實測也可以不添加):

cp /opt/module/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.7.7.jar /opt/module/tez-0.9.1/lib
cp /opt/module/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.7.7.jar /opt/module/tez-0.9.1/lib

3)測試:

啓動Hive CLI,關閉Hive自動本地模式,並運行測試命令

set hive.execution.engine=mr;
set hive.exec.mode.local.auto=false;
use test;
SELECT deptno, avg(sal) as avg_sal FROM emp group by deptno;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章