Примените K-средства для Scala к каждому элементу rdd.

У меня есть большой RDD в Spark Spark, где каждый элемент является массивом из массивов.

val rdd = sc.parallelize[array1[array1_1[], array1_2[], ....array1_24]], .... , array240[array240_1[], array240_2[], ....array240_24]]

Все элементы разные, и я должен применить алгоритм k-средних к каждому из них.

Но k-means в Spark работает только с RDD, а не с массивами.

Итак, я делаю дальше

for (i <= 0 to 240) {

    val rdd = sc.parallelize[array1[array1_1[], array1_2[], ....array1_24]]]

Но это слишком медленно...

У меня есть кластер из 5 больших узлов, и они могут сделать больше...

Как я могу решить мою проблему без цикла?

1 ответ

Похоже, у вас здесь серьезная проблема с дизайном.

  • если каждый массив достаточно мал для эффективной локальной обработки на одном разделе, то использовать Spark MLlib нечего. Просто используйте вашу любимую нераспределенную библиотеку машинного обучения, чтобы обучать K-средства каждому предмету индивидуально. С большим кластером и небольшими данными Spark будет проводить большую часть времени, просто передавая сообщения.

  • если это не так, то использование массивов для хранения таких данных не имеет смысла. Либо каждый образец должен быть отдельным СДР, либо они могут быть объединены, но сплющены с помощью меток.

Исходя из вашего описания, похоже, что это первый случай. Если, несмотря ни на что, вы хотите использовать MLLib, попробуйте значительно уменьшить параллелизм для каждого RDD и постарайтесь строить свои задания отдельно, в зависимости от планировщика, который сделает все остальное.

Другие вопросы по тегам