Проблемы с длинными линиями (DAG) в искре - PullRequest
0 голосов
/ 25 октября 2019

Обычно мы используем Spark для обработки данных, хранящихся на S3 или HDFS. Мы используем Databricks и платформы EMR. Одна из проблем, с которой я часто сталкиваюсь, заключается в том, что когда размер задачи растет, производительность работы сильно снижается. Например, предположим, что я читаю данные из пяти таблиц с различными уровнями преобразования, такими как (фильтрация, разнесение, объединения и т. Д.), Объединение подмножества данных из этих преобразований, затем выполняю дальнейшую обработку (например, удаляю некоторые строки на основе критерия, которыйтребуются функции управления окнами и т. д.), а затем некоторые другие этапы обработки и, наконец, сохранение окончательного вывода в путь назначения s3. Если мы запустим эту работу без нее, потребуется очень много времени. Однако если мы сохраним (создаем) временные промежуточные кадры данных на S3 и используем этот сохраненный (на S3) кадр данных для следующих шагов запросов, задание завершается быстрее. У кого-нибудь есть подобный опыт? Есть ли лучший способ для обработки такого рода длинных задач, кроме контрольных точек?

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

1 Ответ

0 голосов
/ 27 октября 2019

Запись промежуточных данных путем сохранения кадра данных или использования контрольной точки - единственный способ исправить это. Вы, вероятно, столкнулись с проблемой, когда оптимизатору требуется очень много времени для составления плана. Самый быстрый / эффективный способ исправить это - использовать localCheckpoint. Это материализует контрольно-пропускной пункт на местном уровне.

val df = df.localCheckpoint()
...