Python 在数字海洋2GB-2core上通过按键减少火花占用大量时间

Python 在数字海洋2GB-2core上通过按键减少火花占用大量时间,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我正在spark python上编写以下代码。其思想是将sortedData rdd中键的值列表连接起来。然而,在我的数字海洋系统上,这个简单的过程非常缓慢 rdd1 = lines.map(parsecsv) thanks = rdd1.filter(lambda (x,(y,z,a)):'Error' in a ).map(lambda (x,(y,z,a)) : (x,1)) def reduction(x,y): return x+y sortedData = thank

我正在spark python上编写以下代码。其思想是将sortedData rdd中键的值列表连接起来。然而,在我的数字海洋系统上,这个简单的过程非常缓慢

rdd1 = lines.map(parsecsv)

thanks  = rdd1.filter(lambda (x,(y,z,a)):'Error' in a ).map(lambda (x,(y,z,a)) : (x,1))

def reduction(x,y):
    return x+y

sortedData = thanks.join(rdd1).map(lambda x: [x[0],[x[1][1][0],x[1][1][1]]]).reduceByKey(reduction)
rdd1有300万条条目,文件大小为400mb

感谢rdd只有17000个条目

然而,reducebykey作业中的任务22现在运行52分钟,到目前为止只处理了140万个密钥。我怎样才能加快速度:(因为这样比python的速度要慢。而且我在本地主机单系统上运行这个

21  63  0   SUCCESS NODE_LOCAL  driver / localhost  2016/03/19 07:15:46 3 s     4.1 MB / 207    5 ms    190.5 KB / 2    
22  64  0   RUNNING NODE_LOCAL  driver / localhost  2016/03/19 07:15:47 52 min  0.3 s   5.0 MB / 206        0.0 B / 0
---------------------------编辑----------------------------

我让它工作得更快了。 然而,在分析我的rdd时,我发现它有一些重复的值,所以我添加了一行代码来删除rdd中的重复项

thanks  = rdd1.filter(lambda (x,(y,z,a)):'Home:Your order has been received' in a ).
map(lambda (x,(y,z,a)) : (x,1)).*reduceByKey(lambda x,y:x)*
添加reducebykey后,感谢rdd大小从17k减少到10k。
但奇怪的是,现在整个数据在10分钟内就得到了处理。有人能解释一下重复密钥是如何造成这么多麻烦的吗?

我同意其他人的建议,可能2GB的机器有点小,但肯定有一些方法可以加快加入速度。这就是所谓的广播加入。看看broadcast变量在。自从您的“谢谢”rdd足够小,可以放在内存中。您可以广播该rdd,这样每个节点在内存中都会有一个rdd的本地副本,连接速度会快得多。

首先,当您的意思是
groupByKey
时,不要使用
reuceByKey
。PySpark中没有任何好处,JVM中也有很多漏洞。如果您有可以使用的数据在一台微型机器上处理,需要速度不要使用Spark。它的设计并没有考虑到这样的情况,这样有限的资源仅足以处理Spark核心流程。这只是一天的示例文件。我需要处理这些数据1年。因此在一台机器上不可能。如果Spark要e这么长的时间来计算这个,我如何才能找出我应该使用多少个节点来处理这个。而且reducebykey现在仍在运行3个小时'22 64 0正在运行NODE_LOCAL driver/localhost 2016/03/19 07:15:47 3.1 h 1 s 5.0 MB/206 0.0 B/0'任何您正在映射、筛选然后再次映射的原因?为什么不使用单个映射,然后删除错误的元素?此外,如果您希望在本地处理数百万行,不要期望任何速度提高,Spark不适合这样使用。您最好手动操作。或者,在一个像样的集群上运行Spark,这样可以加快您的进程computations@YuvalItzchakov-我需要从文件中找到某些密钥,然后执行自连接仅获取这些键的详细信息。这就是为什么我加入了映射筛选器,然后再次映射。最后一个映射是在加入之前从rdd中删除冗余数据。但感谢您的响应:)。广播变量对单个节点有帮助吗?抱歉,我忘了这一点。也许不是。但使用2GB机器仍然没有多少可以优化的地方。您应该放大(更大的机器)或缩小(更多的机器),我建议您尝试分区,而不是将所有内容都保留为单个分区和广播变量。如果这不起作用,你也无能为力。