检查RDD中是否存在值

时间:2016-11-25 04:46:23

标签: python apache-spark pyspark

我在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()的函数?

P.S:我没有在内存中缓存任何东西。我的火花背景如下:

jobName = "wordcount"
sc = SparkContext(appName = jobName)

......
......

sc.stop()

1 个答案:

答案 0 :(得分:3)

来自YARN的错误消息说collect不是问题,因为执行者(而不是驱动程序)有内存问题。

首先,尝试按照错误消息建议并提升spark.yarn.executor.memoryOverhead - 在YARN上运行pyspark时,您可以告诉YARN为python worker进程内存分配更大的容器。

接下来,查看执行程序需要大量内存的操作。您使用reduceByKey,也许您可​​以增加分区数量,使其在使用的内存方面更小。查看numPartitions参数:http://spark.apache.org/docs/latest/api/python/pyspark.html#pyspark.RDD.reduceByKey

最后,如果你想检查rdd是否包含某个值,那么只需按此值过滤并使用countfirst进行检查,例如:

looking_for = "....."
contains = rdd.filter(lambda a: a == looking_for).count() > 0