欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hadoop YARN中内存的设置 博客分类: 大数据 hadoop 

程序员文章站 2024-03-05 21:56:25
...
在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关于内存的相关参数设置,否则会有意想不到的后果。
相关标签: hadoop