Повышение производительности обработки данных в миллиардах строк в Spark SQL - PullRequest
0 голосов
/ 08 января 2020

В моем корпоративном проекте мне нужно перекрестно соединить набор данных из более чем миллиарда строк с другим из примерно миллиона строк, используя Spark SQL. Поскольку использовалось перекрестное объединение, я решил разделить первый набор данных на несколько частей (каждая из которых имеет около 250 миллионов строк) и перекрестно соединить каждую часть с миллионной строкой. Затем я использовал «объединение всех».

Теперь мне нужно улучшить производительность процессов объединения. Я слышал, что это можно сделать, разделив данные и распределив работу среди работников Spark. Мои вопросы, как эффективная производительность может быть достигнута с разделением? и Каковы другие способы сделать это без использования разбиения?

Редактировать: фильтрация уже включена.

Ответы [ 2 ]

1 голос
/ 09 января 2020

Ну, во всех сценариях ios, вы получите тонны данных. Будьте осторожны, старайтесь по возможности избегать декартовых объединений больших наборов данных, поскольку они обычно заканчиваются исключениями OOM.

Да, разбиение может быть способом, который вам поможет, потому что вам нужно распределять свою рабочую нагрузку от одного узел на большее количество узлов или даже на весь кластер. Механизм разделения по умолчанию - это га sh ключа или исходного ключа разделения из источника (Spark берет его из источника напрямую). Вы должны сначала оценить, какой у вас ключ разделения, а затем вы можете найти, возможно, лучший разделительный ключ / механизм и данные перераспределения, поэтому распределите нагрузку. Но, в любом случае, соединение должно быть сделано, но это будет сделано с более параллельными источниками.

0 голосов
/ 08 января 2020

В вашем запросе на присоединение должно быть несколько фильтров. Вы можете использовать атрибуты фильтра в качестве ключа для разделения данных, а затем присоединиться на основе разделенных.

...