将 Scala 的 K-means 应用于 rdd 的每个元素。
Posted
技术标签:
【中文标题】将 Scala 的 K-means 应用于 rdd 的每个元素。【英文标题】:Apply K-means for Scala to each element of rdd. 【发布时间】:2016-06-24 20:31:07 【问题描述】:我在 spark scala 中有一个很大的 rdd,其中每个元素都是数组中的数组。
val rdd = sc.parallelize[array1[array1_1[], array1_2[], ....array1_24]], .... , array240[array240_1[], array240_2[], ....array240_24]]
所有元素都是不同的,我应该对每个元素应用 k-means 算法。
但是,Spark 中的 k-means 仅适用于 RDD,而不适用于数组。
所以,我接下来做
for (i <= 0 to 240)
val rdd = sc.parallelize[array1[array1_1[], array1_2[], ....array1_24]]]
但是太慢了……
我有来自 5 个大节点的集群,它们可以做更多...
如何在没有 for 循环的情况下解决我的问题?
【问题讨论】:
【参考方案1】:您的设计似乎存在严重问题。
如果每个数组都足够小,可以在单个分区上进行本地有效处理,那么使用 Spark MLlib 将无济于事。只需使用您最喜欢的非分布式机器学习库来单独训练每个项目的 K-means。对于大型集群和小型数据,Spark 将花费大部分时间来传递消息。
如果不是这种情况,那么使用数组来存储这样的数据是没有意义的。每个样本都应该是一个单独的 RDD,或者这些可以组合但用标签展平。
根据您的描述,这是第一种情况。如果您出于所有原因想要使用 MLLib,那么请尝试显着降低每个 RDD 的并行度,并根据调度程序单独构建您的作业来完成其余的工作。
【讨论】:
我只能强调运行k-means是便宜,你根本不需要分布式计算; ELKI 等工具具有非常快速的 k-means 实现,并且可能会快得多只要数据适合主内存。以上是关于将 Scala 的 K-means 应用于 rdd 的每个元素。的主要内容,如果未能解决你的问题,请参考以下文章
如何将 RDD [ Vector ] 中的合成控制数据集转换为 K-Means 算法
将 Pyspark Python k-means 模型预测插入具有原始 RDD 项和特征的 DF
将每个 RDD 值与 Scala 中 RDD 中的所有其他值配对