繁体   English   中英

检查RDD中是否存在值

[英]Check if value exists in a RDD

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

PS:我没有在内存中缓存任何内容。 我的火花上下文如下所示:

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

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

sc.stop()

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

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

接下来,查看执行程序需要大量内存的操作。 您可以使用reduceByKey ,也许您可​​以增加分区数以使它们的使用内存更小。 查看numPartitions参数: http : numPartitions

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM