我正在编写关于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分钟内得到处理。有人可以解释一下重复键怎么会造成那么多麻烦?
答案 0 :(得分:0)
我同意其他人的建议,可能2GB机器有点小,但你肯定可以采取一些措施来加速你的加入。它被称为广播连接。在http://spark.apache.org/docs/latest/programming-guide.html#broadcast-variables查看广播变量。由于你的“谢谢”rdd足够小以适应内存,你可以广播该rdd,这样每个节点都会在内存中有一个本地副本,连接速度会快得多。