Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark群集中的任务是如何分布的?_Apache Spark_Machine Learning_Parallel Processing_Scikit Learn_Cluster Computing_Spark - Fatal编程技术网

Apache spark Spark群集中的任务是如何分布的?

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)和没有完成什么 这是我的设想: 我需要训练许多不同的决策树模型(尽可能多的组合所有可能的参数),许多不同的随机森林模型,等等 在我

因此,我有一个输入,它包含在一个数据集和几个使用scikit learn的ML算法(带参数调优)中。我已经尝试了很多尝试,试图尽可能有效地执行这项工作,但目前我仍然没有适当的基础设施来评估我的结果。然而,我在这方面缺乏一些背景知识,我需要帮助把事情弄清楚

基本上,我想知道任务是如何以一种尽可能利用所有可用资源的方式分布的,以及实际上隐式地完成了什么(例如Spark)和没有完成什么

这是我的设想:

我需要训练许多不同的决策树模型(尽可能多的组合所有可能的参数),许多不同的随机森林模型,等等

在我的一种方法中,我有一个列表,它的每个元素对应一个ML算法及其参数列表

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由计算机工作。如果我是你,我会尝试两种方法!;)