为什么RDD不会在spark的每次迭代中都保留在内存中?

时间:2014-07-24 03:28:18

标签: scala apache-spark

我将火花用于机器学习应用程序。 spark和hadoop与任何资源管理器(如纱线)共享相同的计算机集群。我们可以在运行spark任务时运行hadoop作业。

但是机器学习应用程序的运行速度很慢。我发现,对于每一次交互,一些工作者需要将一些rdd添加到内存中。就像这样:

243413 14/07/23 13:30:07 INFO BlockManagerMasterActor$BlockManagerInfo: Added rdd_2_17 in memory on XXX:48238 (size: 118.3 MB, free: 16.2 GB)
243414 14/07/23 13:30:07 INFO BlockManagerMasterActor$BlockManagerInfo: Added rdd_2_17 in memory on XXX:48238 (size: 118.3 MB, free: 16.2 GB)
243415 14/07/23 13:30:08 INFO BlockManagerMasterActor$BlockManagerInfo: Added rdd_2_19 in memory on TS-XXX:48238 (size: 119.0 MB, free: 16.1 GB)

所以,我认为重新加载rdd的重新计算会使应用程序变得如此缓慢。

然后,我的问题是为什么当有足够的可用内存时rdd没有持久存储在内存中?因为hadoop的工作?


我添加了以下jvm参数:-Xmx10g -Xms10g

我发现rdd添加动作比以前少,任务运行时间比以前短。但是一个阶段的总时间也太大了。从webUI,我发现:

对于每个阶段,所有工人都不是同时开始的。例如,当worker_1完成10个任务时,worker_2将出现在webUI上并启动任务。而这需要很长一段时间。


我们的Spark群集在独立模型中运行。

1 个答案:

答案 0 :(得分:3)

很难说你的工作有什么问题,但这里有一些提示。

首先,您可以尝试在中间persist()上调用RDD来标记您希望它们被缓存。 其次,Spark会在每个节点的RDD s上自动存储在磁盘上的混洗操作结果,因此问题根本不在于缓存。

您可以在此处找到一些其他信息: