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

How are tasks distributed within a Spark cluster?

所以我有一个输入,它包含一个数据集和几个使用 scikit-learn 的 ML 算法(带参数调整)。我已经尝试了很多关于如何尽可能高效地执行此操作的尝试,但此时此刻我仍然没有适当的基础设施来评估我的结果。但是,我缺乏这方面的一些背景知识,需要帮助才能弄清楚。

基本上我想知道任务是如何以尽可能多地利用所有可用资源的方式分配的,以及什么是隐式完成的(例如通过 Spark),什么不是。

这是我的场景:

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

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

spark.parallelize(algorithms).map(lambda algorihtm: run_experiment(dataframe, algorithm))

在这个函数 run_experiment 中,我为相应的 ML 算法及其参数网格创建了一个 GridSearchCV。我还设置了 n_jobs=-1 以(尝试)实现最大并行度。

在这种情况下,在我的具有几个节点的 Spark 集群上,执行看起来有点像这样有意义吗?

或者同一个节点可以有一个决策树模型和一个随机森林模型运行?这是我第一次使用集群环境,所以我对如何工作感到有点困惑。

另一方面,如果我使用 for 循环顺序遍历我的算法列表并创建GridSearchCV 使用 databricks 的 spark-sklearn Spark 和 scikit-learn 之间的集成?它在文档中的说明方式似乎是这样的:

最后,关于第二种方法,使用相同的 ML 算法,但使用 Spark MLlib 而不是 scikit-learn,是否会处理整个 parallelization/distribution?

抱歉,如果其中的大部分内容有点幼稚,但我真的很感谢对此的任何回答或见解。我想在集群中实际测试和使用任务调度参数之前了解基础知识。


我不确定这个问题是在这里更合适还是在CS stackexchange上更合适。

spark.parallelize(algorithms).map(...)

来自 ref,"The elements of the collection are copied to form a distributed dataset that can be operated on in parallel." 这意味着您的算法将分散在您的节点中。从那里开始,每个算法都会执行。

如果算法及其各自的参数以这种方式分散,那么您的方案可能是有效的,我认为您就是这种情况。

关于使用你所有的资源,非常擅长这一点。但是,您需要检查您的任务之间的工作负载是否平衡(每个任务执行相同数量的工作),以获得良好的性能。


What changes if instead of the first approach with parallelize, I use a for loop?

一切。您的数据集(在您的案例中是算法)不是 RDD,因此不会发生并行执行。

.. and also using databricks's spark-sklearn integration between Spark and scikit-learn?

article 描述了如何在那里实施随机森林:

"The scikit-learn package for Spark provides an alternative implementation of the cross-validation algorithm that distributes the workload on a Spark cluster. Each node runs the training algorithm using a local copy of the scikit-learn library, and reports the best model back to the master."

我们可以将此推广到您的所有算法,这使您的方案合理。


Spark MLlib instead of scikit-learn, would the whole parallelization/distribution be taken care of?

是的,会的。他们对这个图书馆的想法是为我们打理事情,让我们的生活更轻松。


我建议你一次问一个大问题,因为现在的答案太宽泛了,但我会尽量简洁。