Как выполнять большие вычисления на Spark - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть две таблицы в Hive: user и item, и я пытаюсь вычислить косинусное сходство между двумя характеристиками каждой таблицы для декартового произведения между двумя таблицами, т.е. перекрестное соединение.

Есть около 20000 users и 5000 items, что приводит к 100 million строкам расчета.Я запускаю вычисления с использованием Scala Spark на кластере Hive с 12 ядрами.

Код выглядит примерно так:

val pairs = userDf.crossJoin(itemDf).repartition(100)
val results = pairs.mapPartitions(computeScore)  // computeScore is a function to compute the similarity scores I need

Задание Spark всегда будет сбоить из-за проблем с памятью (GC Allocation Failure) в кластере Hadoop.Если я уменьшу количество вычислений примерно до 10 миллионов, оно точно будет работать - до 15 минут.

Как рассчитать весь набор без увеличения аппаратных характеристик?У меня все хорошо, если работа длится дольше и не выходит из строя на полпути.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Для этого есть несколько шагов: 1. Проверьте ожидаемый объем данных после перекрестного соединения и разделите его на 200, так как spark.sql.shuffle.partitions по умолчанию имеет значение 200. Он должен быть больше 1 ГБ необработанных данных.к каждому разделу.2. Рассчитайте каждый размер строки и умножьте на другое количество строк таблицы, вы сможете оценить приблизительный объем.Процесс будет работать намного лучше в Parquet по сравнению с CSV-файлом 3. Необходимо установить spark.sql.shuffle.partitions на основе общего объема данных / 500 МБ. 4. Необходимо установить spark.shuffle.minNumPartitionsToHighlyCompress чуть меньше, чем раздел Shuffle.5. Создайте данные исходного паркета на основе столбца объединения для обоих файлов / таблиц. 6. Обеспечьте память High Spark Executor и управляйте памятью Java Heap, учитывая пространство кучи

0 голосов
/ 21 февраля 2019

Если вы загляните в документацию Spark, вы увидите, что в spark используются разные стратегии управления данными.Эти политики активируются пользователем через конфигурации в файлах конфигурации spark или непосредственно в коде или сценарии.

Ниже приведена документация по политикам управления данными: data management policies

Политика "MEMORY_AND_DISK" была бы полезна для вас, потому что, если данные (RDD) не помещаются в оперативную память, оставшиеся разделы будут сохранены на жестком диске.Но эта стратегия может быть медленной, если вам часто приходится обращаться к жесткому диску.

...