火花容器被YARN杀死超过内存限制

时间:2016-11-17 13:35:42

标签: apache-spark

我在AWS EMR中运行火花。 这是一个简单的PageRank计算,数据集是8GB

我为我的群集使用6 m3.xlarge,每个16GB内存

这是配置

spark.executor.instances   4
spark.executor.cores       8
spark.driver.memory    10473M
spark.executor.memory   9658M

我是Spark的新手,所以我真的没有关于如何消耗内存的常识......我的集群是否太小了?记忆是一个硬限制吗?或者,小内存是可以的,但只是计算慢......

这是我的代码(在我们的作业中我们不允许使用GraphX,所以我只使用普通函数)

import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.rdd.RDD;

object PageRank {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("pageRank")

    val sc = new SparkContext(conf)

    val iterNum = 10
    val file = sc.textFile("hdfs:///input")


    val all = file.flatMap { line => line.split("\t") }.distinct()
    val contributor = file.map ( line => line.split("\t")(0)).distinct()
    val dangling = all.subtract(contributor)

    val graphDangling = dangling.cartesian(all).groupByKey()

    val graph0 = file.map(line => { val temp = line.split("\t"); (temp(0), temp(1)) }).distinct().groupByKey()
    val graph = graph0.union(graphDangling)
    graph.cache()

    var ranks = graph.mapValues { x => 1.0 }

    var i = 0

    for (i <- 0 to iterNum) {
      val contriReceive = graph.join(ranks).values.flatMap {
        case (followees, rank) =>
          {
            val size = followees.size;
            followees.map(followee => (followee, rank / size))
          }
      }
      ranks = contriReceive.reduceByKey(_ + _).mapValues { x => 0.15 + 0.85 * x }
    }

    val result = ranks.map{case(user,rank)=>user+"\t"+rank}

    ranks.saveAsTextFile("hdfs:///pagerank-output")

    sc.stop()
  }

}

我不太确定RDD和内存管理。有很多中间RDD,我是否必须明确释放它们以释放资源?如果是这样,如何....只是分配给null和gc将处理它?<​​/ p>

0 个答案:

没有答案