将Scala的K-means应用于rdd的每个元素。

时间:2016-03-10 06:16:16

标签: scala apache-spark k-means apache-spark-mllib

我在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 个答案:

答案 0 :(得分:3)

看起来你在这里遇到了严重的设计问题。

  • 如果每个阵列都小到足以在单个分区上本地有效处理,那么使用Spark MLlib就无法获得任何好处。只需使用您最喜欢的未分发的机器学习库,就可以单独训练每个项目的K-means。对于大型集群和小型数据,Spark将花费大部分时间来传递消息。

  • 如果不是这种情况,那么使用数组来存储这样的数据并不合理。每个样本都应该是一个单独的RDD,或者这些样本可以组合在一起但是用标签展平。

根据您的描述,这似乎是第一种情况。如果出于所有原因你想要使用MLLib,那么尝试显着降低每个RDD的并行性,并根据调度程序单独构建你的工作来完成剩下的工作。