Обмани меня… Разрушаем мифы о Spark-аккумуляторахBigData и машинное обучение
Любит технологии и простые решения непростых задач.
Около 10 лет пытается дружить с данными, иногда получается, а иногда — не очень.
В прошлой жизни разработал несколько DMP/CDP (Data Management / Customer Data Platform).
На сегодняшний день техники оптимизации обработки данных весьма хорошо известны и понятны. Вот некоторые из них:
1) Вертикальное или горизонтальное масштабирование инфраструктуры путем добавления большего количества серверов, RAM, CPU, GPU, увеличение пропускной способности сети – другими словами, оптимизация методом грубой силы.
2) Чтение только тех данных, которые необходимо прочитать, минимизируя дисковый IO, например:
- путем организации данных в соответствии с паттерном доступа к ним, например, используя шардинг, партиционирование, бакетирование и т.д. или
- путем использования колоночных форматов хранения данных, таких как Parquet и ORC.
3) Минимизация сетевого IO
- путем партиционирования нескольких наборов данных заранее и одинаковым образом (co-partitioning).
В условиях недостаточного количества вычислительных ресурсов различные хитрости по оптимизации процессов обработки данных могут стать особенно актуальны.
Например, Spark-аккумуляторы, которые зачастую используются при построении конвейеров обработки данных как самим Spark'ом, так и его пользователями, могут стать неплохим подспорьем в сборе и подсчете метрик обработки ваших данных, однако, гарантии, обеспечиваемые этими аккумуляторами, весьма слабы, ведь официальная документация утверждает, что лишь изменения аккумуляторов, выполненные в Spark action'ах будут применены единожды, в то время как изменения аккумуляторов в трансформациях могут применяться более одного раза, тем самым побуждая пользователя обрабатывать один и тот же набор данных минимум дважды, в случае необходимости получения гарантированно точных показателей.
Мы с вами попробуем разобраться, можно ли использовать Spark-аккумуляторы для подсчета и сбора метрик гарантированно единожды, в качестве side-effect'а основного процесса обработки данных (немного заглянув во внутренности Spark'а), тем самым сократив объемы обрабатываемых данных и время выполнения задач в некоторых случаях более чем в 2 раза, а также с тем, действительно ли верны утверждения документации Spark и, если нет, то в каких случаях.