当在同一个RDD上执行多个操作时,Spark会重新触发映射操作

时间:2015-06-05 15:36:03

标签: python apache-spark

我在python中编写一个机器学习任务,然后用spark分发它。 我在ubuntu上使用spark 1.3.1和python 2.7(主机和一个有2个插槽的工人在同一台机器上)

我的(伪)代码:

p_params = sc.parallelize(small_index_collection,numSlices=4)
eval_grid = p_params.map(highly_computational_intensive_mapper)
# in eval_grid we will have a dictionary with some numbers,
# representing various performance metrics

p1 = eval_grid.map(lambda x: x['dict_entry_1']).collect()
#Spark is lazy so basically the p1 will trigger the compute intensive mapper
p2 = eval_grid.map(lambda x: x['dict_entry_2']).collect()
p3 = eval_grid.map(lambda x: x['dict_entry_3']).collect()
p4 = eval_grid.map(lambda x: x['dict_entry_4']).collect()
......

我正在计时每个操作,p1需要与p2,p3相同的时间。在日志中,我还看到每个highly_computational_intensive_mapper操作都会调用collect()

我做错了什么?每个eval_grid之后是否从工作人员中删除了collect() RDD?我必须指定一些标志吗?以某种方式标记RDD?在聚合映射器之前直接在eval_grid上执行某种操作,然后在生成的RDD上运行px = ...代码?我应该采取什么行动?

Thaks!

P.S。我还没有尝试任何枚举方法。

p.p.s。一个类似的问题Why the RDD is not persisted in memory for every iteration in spark?但对我来说,RDD是重新计算的,不是从磁盘加载的。当然,那里没有代码。

1 个答案:

答案 0 :(得分:1)

您需要在cache上调用eval_grid,以便在首次运行后将其存储在内存中。应该发生一些缓冲区缓存,但是如果你想要真正的存储,那么cache

所有eval_grid是显示如何计算数据的图表。每次你在它上面调用一个动作(collect),它就会运行该图形。 cache短路,DAG直接从内存中抓取数据堆。