我在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>