加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – YARN因超出内存限制而杀死容器

发布时间:2020-12-16 18:28:50 所属栏目:安全 来源:网络整理
导读:我遇到了一个问题,YARN因超出内存限制而杀死我的容器: Container killed by YARN for exceeding memory limits. physical memory used. Consider boosting spark.yarn.executor.memoryOverhead. 我有20个m3.2xlarge节点,因此他们有: cores: 8memory: 30sto
我遇到了一个问题,YARN因超出内存限制而杀死我的容器:

Container killed by YARN for exceeding memory limits. physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.

我有20个m3.2xlarge节点,因此他们有:

cores: 8
memory: 30
storage: 200 gb ebs

我的应用程序的要点是,我有几个10万资产,我有去年每小时生成的历史数据,总数据集大小为2TB未压缩.我需要使用此历史数据为每个资产生成预测.我的设置是我首先使用s3distcp将存储为索引的lzo文件的数据移动到hdfs.然后我将数据拉入并传递给sparkSql来处理json:

val files = sc.newAPIHadoopFile("hdfs:///local/*",classOf[com.hadoop.mapreduce.LzoTextInputFormat],classOf[org.apache.hadoop.io.LongWritable],classOf[org.apache.hadoop.io.Text],conf)
val lzoRDD = files.map(_._2.toString)
val data = sqlContext.read.json(lzoRDD)

然后我使用groupBy按资产对历史数据进行分组,创建一个元组(assetId,timestamp,sparkSqlRow).我认为这种数据结构可以在生成每个资产的预测时更好地进行内存操作.

val p = data.map(asset =>  (asset.getAs[String]("assetId"),asset.getAs[Long]("timestamp"),asset)).groupBy(_._1)

然后我使用foreach迭代每一行,计算预测,最后将预测作为json文件写回到s3.

p.foreach{ asset =>
  (1 to dateTimeRange.toStandardHours.getHours).foreach { hour =>
    // determine the hour from the previous year
    val hourFromPreviousYear = (currentHour + hour.hour) - timeRange
    // convert to seconds
    val timeToCompare = hourFromPreviousYear.getMillis
    val al = asset._2.toList

    println(s"Working on asset ${asset._1} for hour $hour with time-to-compare: $timeToCompare")
    // calculate the year over year average for the asset
    val yoy = calculateYOYforAsset2(al,currentHour,asset._1)
    // get the historical data for the asset from the previous year
    val pa = asset._2.filter(_._2 == timeToCompare)
      .map(row => calculateForecast(yoy,row._3,asset._1,(currentHour + hour.hour).getMillis))
      .foreach(json => writeToS3(json,(currentHour + hour.hour).getMillis))
  }
}

>有没有更好的方法来实现这一点,以便我不会遇到YARN的内存问题?
>有没有办法将资产分块,以便foreach每次仅运行大约10k,而不是所有20万资产?

任何建议/帮助表示赞赏!

解决方法

它不是你的代码.并且不要担心foreach不会同时运行所有这些lambdas.问题是Spark的默认值spark.yarn.executor.memoryOverhead(或最近在2.3中重命名为spark.executor.memoryOverhead)过于保守,导致执行者在加载时被杀死.

解决方案是(如错误消息所示)增加该值.如果要为每个执行程序请求大量内存,我会先将其设置为1GB(设置为1024)或更高.目标是在没有执行器被杀的情况下运行作业.

或者,如果您控制群集,则可以通过在yarn-site.xml中将configs yarn.nodemanager.pmem-check-enabled和yarn.nodemanager.vmem-check-enabled设置为false来禁用YARN内存强制执行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读