Hadoop YARN中内存的设置

在hadoop 以yarn运行spark一个很简单的程序时,报错:
java.lang.IllegalStateException: Spark context stopped while waiting for backend 
    at org.apache.spark.scheduler.TaskSchedulerImpl.waitBackendReady(TaskSchedulerImpl.scala:614) 
    at org.apache.spark.scheduler.TaskSchedulerImpl.postStartHook(TaskSchedulerImpl.scala:169) 
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:567) 
    at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2313) 

然后百度了下,有人说是因为Java 8 与 Hadoop 2.7.3 的YARN存在某些不兼容造成内存溢出,导致程序的异常终止,其解决方案是修改Hadoop下的yarn-site.xml配置文件,增加以下属性:

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

然后重启YARN,然后再以--master yarn 模式运行Spark即可。
      按照上述操作对配置文件修改之后,发现Spark确实能够正常启动,而且前两天出现的执行分词程序Action异常退出的问题也不存在了,然后查了下yarn.nodemanager.pmem-check-enabled和yarn.nodemanager.vmem-check-enabled这两个配置项,发现这两个参数YARN的默认配置对于之前遇到的异常退出是有影响的。
      首先yarn.nodemanager.pmem-check-enabled表示是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true,也就是说如果我的分词操作action在执行时,如果使用的内存量大于系统默认的物理内存量,就会被Kill掉。yarn.nodemanager.vmem-check-enabled
表示是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true,也就是说如果我的分词操作action在执行时,如果使用的虚拟内存量大于系统默认的物理内存量,就会被Kill掉。
然后在YARN的默认配置中,有以下参数
yarn.nodemanager.vmem-pmem-ratio 即任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1;yarn.nodemanager.resource.memory-mb即该节点上YARN可使用的物理内存总量,默认是8192(MB);然而我的YARN所在服务器内存实际只有4G,由于没有修改可用物理内存总量参数值,所以在执行action的时候,导致内存被撑爆,从而使spark任务被Kill 掉。

所以在以 --master yarn模式 运行Spark的时候,一定要先调整YARN关于内存的相关参数设置,否则会有意想不到的后果。

猜你喜欢

转载自ananbb.iteye.com/blog/2372728