Пишу системы обработки данных на Scala и Apache Spark и меряю результат двумя вопросами: верны ли цифры на выходе и доживёт ли расчёт до конца, когда объём вырастет на порядок. Мой хлеб — батч- и потоковые пайплайны, слои ETL и тяжёлые агрегации, которые сутками гоняют миллиарды записей и не разваливаются под нагрузкой. Код держу типизированным и функциональным: чистые преобразования, явно описанные схемы, никаких скрытых null в цепочке джойнов. Такой пайплайн через год открываешь и читаешь, а не разбираешь по частям в страхе что-нибудь сломать.
Начинаю не с красивого плана, а с ваших данных и того места, где всё упирается. Смотрю профилировкой, где утекают минуты и бюджет: перекос по ключам, дорогие shuffle-джойны, россыпь мелких файлов, поток, не успевающий за источником. Дальше переписываю горячий участок — партиционирование и бакетинг под фактические запросы, broadcast-джойны по месту, оконные агрегации с честными watermark, checkpointing, чтобы рестарт стоил минут, а не полного пересчёта. Собираю Spark-джобы, встраиваю в оркестрацию, навешиваю метрики и контроль качества данных и передаю код, который команда потянет сама. Скорость идёт от того, что раскладка данных подогнана под задачу, а не от лишних нод.
Начинаю не с красивого плана, а с ваших данных и того места, где всё упирается. Смотрю профилировкой, где утекают минуты и бюджет: перекос по ключам, дорогие shuffle-джойны, россыпь мелких файлов, поток, не успевающий за источником. Дальше переписываю горячий участок — партиционирование и бакетинг под фактические запросы, broadcast-джойны по месту, оконные агрегации с честными watermark, checkpointing, чтобы рестарт стоил минут, а не полного пересчёта. Собираю Spark-джобы, встраиваю в оркестрацию, навешиваю метрики и контроль качества данных и передаю код, который команда потянет сама. Скорость идёт от того, что раскладка данных подогнана под задачу, а не от лишних нод.