我将火花用于机器学习应用程序。 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群集在独立模型中运行。
答案 0 :(得分:3)
很难说你的工作有什么问题,但这里有一些提示。
首先,您可以尝试在中间persist()
上调用RDD
来标记您希望它们被缓存。
其次,Spark会在每个节点的RDD
s上自动存储在磁盘上的混洗操作结果,因此问题根本不在于缓存。
您可以在此处找到一些其他信息: