钥匙的Spark Reduce由数字海洋2GB消耗大量时间 - 2核

时间:2016-03-19 12:24:01

标签: 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 = 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分钟,到目前为止仅处理了.4,000万个键。我怎样才能加快这个速度:(这比python的速度要慢。而且我在localhost单一系统上运行它。

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分钟内得到处理。有人可以解释一下重复键怎么会造成那么多麻烦?

1 个答案:

答案 0 :(得分:0)

我同意其他人的建议,可能2GB机器有点小,但你肯定可以采取一些措施来加速你的加入。它被称为广播连接。在http://spark.apache.org/docs/latest/programming-guide.html#broadcast-variables查看广播变量。由于你的“谢谢”rdd足够小以适应内存,你可以广播该rdd,这样每个节点都会在内存中有一个本地副本,连接速度会快得多。