Apache spark Spark群集中的任务是如何分布的?
因此,我有一个输入,它包含在一个数据集和几个使用scikit learn的ML算法(带参数调优)中。我已经尝试了很多尝试,试图尽可能有效地执行这项工作,但目前我仍然没有适当的基础设施来评估我的结果。然而,我在这方面缺乏一些背景知识,我需要帮助把事情弄清楚 基本上,我想知道任务是如何以一种尽可能利用所有可用资源的方式分布的,以及实际上隐式地完成了什么(例如Spark)和没有完成什么 这是我的设想: 我需要训练许多不同的决策树模型(尽可能多的组合所有可能的参数),许多不同的随机森林模型,等等 在我的一种方法中,我有一个列表,它的每个元素对应一个ML算法及其参数列表Apache spark Spark群集中的任务是如何分布的?,apache-spark,machine-learning,parallel-processing,scikit-learn,cluster-computing,spark,Apache Spark,Machine Learning,Parallel Processing,Scikit Learn,Cluster Computing,Spark,因此,我有一个输入,它包含在一个数据集和几个使用scikit learn的ML算法(带参数调优)中。我已经尝试了很多尝试,试图尽可能有效地执行这项工作,但目前我仍然没有适当的基础设施来评估我的结果。然而,我在这方面缺乏一些背景知识,我需要帮助把事情弄清楚 基本上,我想知道任务是如何以一种尽可能利用所有可用资源的方式分布的,以及实际上隐式地完成了什么(例如Spark)和没有完成什么 这是我的设想: 我需要训练许多不同的决策树模型(尽可能多的组合所有可能的参数),许多不同的随机森林模型,等等 在我
spark.parallelize(algorithms).map(lambda algorihtm:run_实验(数据帧,算法))
在这个函数中,run\u experiment
I为相应的ML算法及其参数网格创建一个GridSearchCV
。我还设置了n_jobs=-1
,以便(尝试)实现最大的并行性
在这种情况下,在我的带有几个节点的Spark集群上,执行看起来像这样有意义吗
或者在同一个节点上可以运行一个决策树模型和一个随机林模型?这是我第一次使用集群环境,所以我对如何让事情正常工作感到有点困惑
另一方面,如果我使用for
循环来顺序迭代我的算法列表,并使用databricks在Spark和scikit learn之间的集成来创建GridSearchCV
,而不是使用parallelize
的第一种方法,那么在执行方面会发生什么变化?文档中的说明方式似乎是这样的:
最后,关于第二种方法,使用相同的ML算法,但使用Spark MLlib而不是scikit learn,整个并行化/分布会得到解决吗
很抱歉,如果这是一个有点天真,但我真的很感谢任何答案或见解在这方面。在集群中进行实际测试和使用任务调度参数之前,我想了解一些基本知识
我不确定这个问题在这里还是在CS stackexchange上更合适。spark.parallelize(algorithms).map(…) 从中,“复制集合的元素以形成可并行操作的分布式数据集。”这意味着您的算法将分散在节点中。从那以后,每个算法都将执行 如果算法和它们各自的参数以这种方式分散,那么你的方案可能是有效的,我认为你就是这样 关于使用你所有的资源,我非常擅长这一点。但是,为了获得良好的性能,您需要检查工作负载在任务之间是否平衡(每个任务都要做相同的工作量)
如果使用for循环,而不是使用
parallelize
的第一种方法,会有什么变化
一切。您的数据集(本例中的算法)不是RDD,因此不会发生并行执行
。。还可以使用databricks的spark sklearn在spark和scikit learn之间进行集成
这描述了如何在那里实现随机林:
用于Spark的scikit学习包提供交叉验证算法的替代实现,该算法在Spark群集上分配工作负载。每个节点使用scikit学习库的本地副本运行训练算法,并将最佳模型报告给主节点
我们可以把它推广到你所有的算法,这使得你的方案合理
Spark MLlib而不是scikit learn,整个并行化/分布会得到处理吗 是的,会的。他们认为这两个图书馆都是为了替我们照顾好东西,让我们的生活更轻松
我建议你每次问一个大问题,因为现在的答案太宽泛了,但我会尽量简洁。非常感谢你的回答。与此相关,“这意味着您的算法将分散在您的节点中。从那里开始,每个算法都将执行。”您是指我在第二幅图中所示的内容(节点1表示决策树,节点2表示随机林)?这是正确的看法吗?@Larissalite,这取决于你的代码是如何构造的,或者/或者scikit是如何工作的。例如,如果您的算法是[DT、RF、NB]列表,并且您有3个节点,那么理想情况下,您可以认为每个节点都只有一个算法,然后算法将在其节点上发展(例如,DT将开始构建DT1、DT2等)。但是,这取决于许多因素、空间、群集配置等。例如,如果有2个节点,则DT和RF将位于第一个节点(例如),NB位于第二个节点。希望有帮助!=)是的,非常有帮助,谢谢!我只意识到一件事:如果不是有一个由3个元素组成的列表,而是直接有一个带有[DT1,DT2,…,RF1,RF2,…,RFN,NB1,…]的列表不是更好吗?当然,在这种设置下,我需要“手动”实现网格搜索,但这似乎是并行化所有内容的最有效方法?@larissalite您可以在这里看到一个直接的权衡;由你工作vs由计算机工作。如果我是你,我会尝试两种方法!;)