如何在Spark集群中分配任务?

我有一个由数据集和多个机器学习算法(使用scikit-learn进行参数调整)组成的输入。我已经尝试了多种方法,以尽可能高效地执行这些任务,但在目前,我仍然没有适当的基础设施来评估我的结果。然而,我在这方面的背景知识不足,我需要帮助来澄清一些问题。

基本上,我想知道任务是如何分配的,以便尽可能充分利用所有可用资源,以及哪些是Spark隐式完成的,哪些不是。

这是我的场景:enter image description here

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

在我的一个方法中,我有一个列表,其中的每个元素对应一个机器学习算法及其参数列表。

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

在这个run_experiment函数中,我为相应的机器学习算法创建了一个GridSearchCV,并设置了其参数网格。我还设置了n_jobs=-1,以试图实现最大并行性。

在这种情况下,在我的Spark集群中只有几个节点的情况下,执行过程看起来会像这样吗?

enter image description here

还是可以在一个节点上同时运行一个决策树模型和一个随机森林模型?这是我第一次使用集群环境,所以我对如何期望事情运作感到有些困惑。

另一方面,如果我不是使用parallelize的第一种方法,而是使用for循环顺序遍历我的算法列表,并使用databricks的spark-sklearn集成来创建GridSearchCV,那么在执行方面会有什么变化?文档中展示的方式看起来像这样:

enter image description here

最后,关于第二种方法,使用相同的机器学习算法,但使用Spark MLlib而不是scikit-learn,整个并行化/分布会得到处理吗?

如果这些问题中的大部分显得有些幼稚,我很抱歉,但我非常感谢任何回答或见解。我想在实际在集群中测试并玩弄任务调度参数之前,先了解基础知识。


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


回答:

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

根据参考,“集合的元素被复制以形成一个可以并行操作的分布式数据集。”这意味着你的算法将被分散到你的节点中。从那里,每个算法都会执行。

如果算法及其各自的参数以这种方式分散,那么你的方案可能是有效的,我认为这对你来说是适用的。

关于充分利用你的资源,在这方面做得很好。然而,你需要检查工作负载在你的任务之间是否平衡(每个任务做相同的工作量),以获得良好的性能。


如果不是使用parallelize的第一种方法,而是使用for循环,会有什么变化?

一切都会改变。你的数据集(在你的例子中是算法)不是RDD,因此不会发生并行执行。

… 并且还使用databricks的spark-sklearn集成Spark和scikit-learn?

这篇文章描述了随机森林是如何在那里实现的:

“Spark的scikit-learn包提供了一种交叉验证算法的替代实现,该实现将工作负载分布在Spark集群上。每个节点使用scikit-learn库的本地副本运行训练算法,并将最佳模型报告回主节点。”

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


使用Spark MLlib而不是scikit-learn,整个并行化/分布会得到处理吗?

是的,会的。这两个库的理念都是为我们处理这些事情,以便我们更轻松地生活。


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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注