我用python编写了一个正常工作的Spark程序。
但是,从内存消耗的角度来看,它是低效的,我正在尝试优化它。我在AWS EMR上运行它,EMR因为消耗太多内存而终止了工作。
Lost executor 11 on ip-*****: Container killed by YARN for exceeding memory limits. 11.4 GB of 10.4 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
我认为这个内存问题是由于我在几个实例中收集我的RDD(即使用.collect())造成的,因为在后面的阶段,我需要测试这些RDD组成的列表中是否存在某些值。
所以,目前我的代码如下所示:
myrdd = data.map(lambda word: (word,1)) \
.reduceByKey(lambda a,b: a+b) \
.filter(lambda (a, b): b >= 5) \
.map(lambda (a,b) : a) \
.collect()
稍后在代码中
if word in myrdd:
mylist.append(word)
myrdd2 = data2.map(lambda word: (word,1)) \
.reduceByKey(lambda a,b: a+b) \
.filter(lambda (a, b): b >= 5) \
.map(lambda (a,b) : a) \
.collect()
if word in myrdd2:
mylist2.append(word)
然后我重复这个模式多次。
有办法做手术吗
if word in myrdd:
do something
不先收集rdd?
是否有类似rdd.contains()的函数?
注:我没有在内存中缓存任何东西。我的spark上下文如下:
jobName = "wordcount"
sc = SparkContext(appName = jobName)
......
......
sc.stop()
目前没有回答
相关问题 更多 >
编程相关推荐