天天看點

ERROR YarnClientSchedulerBackend:Yarn application has already ended! It might have been killed

文章目錄

  • ​​1 錯誤重制​​
  • ​​2 原因​​
  • ​​3 解決方法​​

1 錯誤重制

在使用Hudi Admin CLI進行compaction的MOR資料集時,報錯如下:

ERROR YarnClientSchedulerBackend: YARN application has exited unexpectedly with state FAILED! Check the YARN application logs for more details.

is running beyond virtual memory limits. Current usage: 342.7 MB of 1 GB physical memory used; 2.4 GB of 2.1 GB virtual memory used. Killing container.
Dump of the process-tree for container_1627008673186_0079_02_000001      
ERROR YarnClientSchedulerBackend:Yarn application has already ended! It might have been killed

2 原因

yarn模式下的spark運作的任務的記憶體容量不夠,導緻容器被kill。

3 解決方法

更改​

​hadoop-2.10.1/etc/hadoop/yarn-site.xml​

​的配置,修改内容如下:

<configuration>
    <property>
        <!--配置 NodeManager 上運作的附屬服務。需要配置成 mapreduce_shuffle 後才可以在 Yarn 上運作 MapReduce 程式。-->
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <!--resourcemanager 的主機名-->
        <name>yarn.resourcemanager.hostname</name>
        <value>hdp-jk-1</value>
    </property>
   <property>
        <!--nodemanager最大可用記憶體-->
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>10240</value>
    </property>
    <property>
        <!--單個Container最大可用記憶體-->
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>10240</value>
    </property>
   <property>
        <!--單個Container最小可用記憶體-->
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>1024</value>
    </property>
    <property>
        <!--單個Container最小可用核心-->
        <name>yarn.scheduler.minimum-allocation-vcores</name>
        <value>1</value>
    </property>
    <property>
        <!--單個Container最大可用核心數-->
        <name>yarn.scheduler.maximum-allocation-vcores</name>
        <value>24</value>
    </property>
    <property>
        <!--實體記憶體和虛拟記憶體比率-->
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>3</value>
  </property>
</configuration>      

裡面最有用的就是下面這句(任務每使用1MB實體記憶體,最多可使用虛拟記憶體量,預設是2.1,預設比例2.1):

<property>
        <!--實體記憶體和虛拟記憶體比率-->
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>3</value>
  </property>      

類似的方法還有下面的:

  • 作用為:是否檢查每個任務正使用的實體記憶體量,如果超過預設值則将其殺死,預設是true()。
  • 不太推薦yarn.nodemanager.pmem-check-enabled設定為false,因為往往會使用虛拟記憶體導緻任務變慢。你可以單純的增大map和reduce的記憶體,這樣就會間接增大虛拟記憶體,因為他們之際有比例關系2.1。
<property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
   </property>      
<configuration>
    <property>
        <!--指定 mapreduce 作業運作在 yarn 上-->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
      <name>mapreduce.map.memory.mb</name>
      <value>56624</value>
    </property>
    <property>
     <name>mapreduce.map.java.opts</name>
     <value>-Xmx5024M</value>
   </property>
   <property>
     <name>mapreduce.reduce.memory.mb</name>
     <value>56624</value>
   </property>
   <property>
      <name>mapreduce.reduce.java.opts</name>
      <value>-Xmx5560M</value>
    </property>
</configuration>      

繼續閱讀