apache-spark - 在集群模式下随机运行Spark作业时,应用程序主进程被 yarn 杀死

标签 apache-spark hadoop yarn cloudera oozie

错误日志如下:

20/05/10 18:40:47 ERROR yarn.Client: Application diagnostics message: Application application_1588683044535_1067 failed 2 times due to AM Container for appattempt_1588683044535_1067_000002 exited with  exitCode: -104
Failing this attempt.Diagnostics: [2020-05-10 18:40:47.661]Container [pid=209264,containerID=container_e142_1588683044535_1067_02_000001] is running 3313664B beyond the 'PHYSICAL' memory limit. Current usage: 1.5 GB of 1.5 GB physical memory used; 3.6 GB of 3.1 GB virtual memory used. Killing container.
Dump of the process-tree for container_e142_1588683044535_1067_02_000001 :
    |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
    |- 209264 209262 209264 209264 (bash) 0 0 22626304 372 /bin/bash -c LD_LIBRARY_PATH="/cdhparcels/CDH-6.1.1-1.cdh6.1.1.p0.875250/lib/hadoop/../../../CDH-6.1.1-1.cdh6.1.1.p0.875250/lib/hadoop/lib/native:" /usr/java/jdk1.8.0_181-cloudera/bin/java -server -Xmx1024m -Djava.io.tmpdir=/hdfs4/yarn/nm/usercache/aiuat/appcache/application_1588683044535_1067/container_e142_1588683044535_1067_02_000001/tmp -Dspark.yarn.app.container.log.dir=/hdfs16/yarn/container-logs/application_1588683044535_1067/container_e142_1588683044535_1067_02_000001 org.apache.spark.deploy.yarn.ApplicationMaster --class 'com.airtel.spark.execution.driver.SparkDriver' --jar hdfs:///user/aiuat/lib/platform/di-platform-main-1.0.jar --arg 'hdfs://nameservice1/user/aiuat/conf/FMS/irrule/irsparkbatchjobconf.json,hdfs://nameservice1/user/aiuat/conf/FMS/irrule/irruleexecution.json' --properties-file /hdfs4/yarn/nm/usercache/aiuat/appcache/application_1588683044535_1067/container_e142_1588683044535_1067_02_000001/__spark_conf__/__spark_conf__.properties 1> /hdfs16/yarn/container-logs/application_1588683044535_1067/container_e142_1588683044535_1067_02_000001/stdout 2> /hdfs16/yarn/container-logs/application_1588683044535_1067/container_e142_1588683044535_1067_02_000001/stderr
    |- 209280 209264 209264 209264 (java) 34135 2437 3845763072 393653 /usr/java/jdk1.8.0_181-cloudera/bin/java -server -Xmx1024m -Djava.io.tmpdir=/hdfs4/yarn/nm/usercache/aiuat/appcache/application_1588683044535_1067/container_e142_1588683044535_1067_02_000001/tmp -Dspark.yarn.app.container.log.dir=/hdfs16/yarn/container-logs/application_1588683044535_1067/container_e142_1588683044535_1067_02_000001 org.apache.spark.deploy.yarn.ApplicationMaster --class com.airtel.spark.execution.driver.SparkDriver --jar hdfs:///user/aiuat/lib/platform/di-platform-main-1.0.jar --arg hdfs://nameservice1/user/aiuat/conf/FMS/irrule/irsparkbatchjobconf.json,hdfs://nameservice1/user/aiuat/conf/FMS/irrule/irruleexecution.json --properties-file /hdfs4/yarn/nm/usercache/aiuat/appcache/application_1588683044535_1067/container_e142_1588683044535_1067_02_000001/__spark_conf__/__spark_conf__.properties

一些观察是:
  • 应用程序主程序已被杀死。内存错误出现在应用程序主机本身的容器中,而不是在执行者容器中。
  • 通过oozie调度了此作业,该作业的某些实例成功完成,而某些实例随机失败,没有任何模式。在每种情况下,输入数据量都是相同的。
  • 我尝试了互联网上建议的大多数解决方案。
    yarn.mapareduce.map.mb和yarn.mapareduce.reduce.mb已设置为8gb。
  • 我也尝试将驱动程序内存,执行程序内存和开销内存都增加到非常高的值,很低的值,并通过这些配置进行调整,但是在某些情况下仍然有些实例失败。
  • yarn.nodemanager.vmem-pmem-ratio设置为2.1 vnem检查已禁用,而pnem检查已启用。不幸的是,这些配置是生产集群,因此无法更改。
  • yarn.app.mapreduce.am.resource.mb已设置为5GB。 yarn.scheduler.maximum-allocation-mb设置为26GB

  • 我的其他一些困惑是:
  • 如果将yarn.app.mapreduce.am.resource.mb设置为5GB,为什么如日志所示,应用程序主容器的可用内存仅为1.5GB?
  • 由于此错误来自应用程序主服务器本身的容器,根据我的理解,应用程序主服务器和spark驱动程序在同一jvm中运行。我认为该错误是由于 Spark 驱动程序内存或应用程序主内存不足而引起的。我的结论看似正确吗?
  • 最佳答案

    我已修复此错误。所以,我想我会在这里回答。

    在集群模式下,由于已经启动了应用程序主控并且驱动程序在yarn应用程序主控容器内运行,因此创建了Sparksession之后,无法在运行时给出驱动程序内存配置。我试图做的是在创建sparksession之后通过“spark.driver.memory”传递驱动程序内存conf。对于这种情况,Spark不会给出任何错误,甚至不会将驱动程序内存显示为与通过ui ui页面上的“环境”选项卡中的该conf所提供的内容完全相同,这使得识别问题更加困难。应用程序主内存被视为默认值1GB,而不是我提供的内存,因此出现此错误。

    关于apache-spark - 在集群模式下随机运行Spark作业时,应用程序主进程被 yarn 杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61713254/

    相关文章:

    java - 在 map reduce spark 的设置键值对中插入一个 if 循环

    docker - Sqoop - 导入作业失败

    pandas - Spark 与 Scala 和 Pandas

    java - 使用BigInteger longValue()将15个字符长度的字符串转换为唯一的长数字

    hadoop - Hadoop 如何决定有多少节点将执行 Map 和 Reduce 任务?

    java - 如何正确理解 yarn 容器?

    apache-spark - 在YARN上运行的作业的应用程序级别优先级

    hadoop - 什么会消耗Hadoop YARN中的计算机内存?

    apache-spark - 将后缀附加到 PySpark 行

    apache-spark - Spark MlLib (Java) 中的分类和数值特征