我在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是重新计算的,不是从磁盘加载的。当然,那里没有代码。
答案 0 :(得分:1)
您需要在cache
上调用eval_grid
,以便在首次运行后将其存储在内存中。应该发生一些缓冲区缓存,但是如果你想要真正的存储,那么cache
所有eval_grid
是显示如何计算数据的图表。每次你在它上面调用一个动作(collect
),它就会运行该图形。 cache
短路,DAG直接从内存中抓取数据堆。