【问题标题】:Apply K-means for Scala to each element of rdd.将 Scala 的 K-means 应用于 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 循环的情况下解决我的问题?

【问题讨论】:

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


    【解决方案1】:

    您的设计似乎存在严重问题。

    • 如果每个数组都足够小,可以在单个分区上进行本地有效处理,那么使用 Spark MLlib 将无济于事。只需使用您最喜欢的非分布式机器学习库来单独训练每个项目的 K-means。对于大型集群和小型数据,Spark 将花费大部分时间来传递消息。

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

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

    【讨论】:

    • 我只能强调运行k-means是便宜,你根本不需要分布式计算; ELKI 等工具具有非常快速的 k-means 实现,并且可能会快得多只要数据适合主内存
    猜你喜欢
    • 2017-07-28
    • 2014-12-31
    • 1970-01-01
    • 2017-08-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多