Disclaimer: В статье речь идет о личном мнении, которое может не совпадать с позицией компании, где трудоустроен автор :)
Apache Spark уже давно перестал быть просто технологией и превратился в своего рода стандарт для обработки больших данных. Этот фреймворк, сочетающий в себе скорость, надежность и масштабируемость, вышел далеко за пределы простого инструмента, превратившись в надежного партнера для огромного числа проектов. Поэтому, когда речь заходит о масштабных вычислениях и эффективной обработке данных, Spark - первое, что приходит на ум. Отсюда и большой интерес к нему, в том числе со стороны начинающих инженеров.
В мире Apache Spark начинающим точно не пропадешь: статьи, уроки, курсы - на любой вкус. Что хабр, что медиум, а также другие онлайн-платформы просто завалены статьями, где вам в 100500-ый раз говорят про SparkContext, Driver и Executor, приводят тривиальные примеры кода из официальной документации (ок-ок, поправлюсь - часто все же с небольшими изменениями), читают уже заезженный датасет с поездками такси в Нью-Йорке и делают какие-то тривиальные агрегации, рассуждают с умным видом про разницу coalesce и repartition и т.п. Не отстают и производители курсов класса "Войти в ИТ" - как известные онлайн-школы, так и "частники" на порталах типа Udemy, Pluralsight и т.п. Выбор курсов по Spark там очень велик.
Я ни в коем случае не хэйтю вышеупомянутых "ребят" - не поймите меня неправильно! Многие хорошие инженеры начинали свой путь с их помощью. Я и сам проходил когда-то курс на Udemy, а потом периодически обращался к Гуглу, который в свою очередь переадресовал меня на такой контент - если я 2 последних года не использовал какой-нить spark.sql.functions.explode, а тут вдруг понадобилось, то нет ничего плохого в просмотре верного синтаксиса (сейчас для этого уже проще использовать какой-нить ChatGPT ???? )
Но вот загвоздка: когда дело доходит до чего-то менее поверхностного, тут как будто вдруг пусто. Идет 2024 год, а статьи типа "RDD vs DataFrame vs DataSet" все еще в тренде... Опытным пользователям Spark приходится буквально искать иголку в стоге сена или читать обсуждения на stackoverflow и подобных. Отсутствие контента "не для чайников" в итоге приводит к тому, что "чайники", освоив базу, так и не могут вырасти и остаются по сути "чайниками", сами того не замечая. Вот и получаются мидлы по “погонам” (а то и синьоры), а пишут код как джуны…
Я это почувствовал еще несколько лет назад, когда вдруг осознал, что уже долго не могу найти какой-либо продвинутый контент не только по Spark, но и вообще для Data Engineer’ов. Даже 2-х дневный оффлайн курс для архитекторов Big Data от одного известного поставщика (на который меня послал мой тогдашний работодатель и, благо для моего кошелька, оплатил его) оказался невысокого качества в плане контента: 50% контента я бы мог сам рассказать без какой-либо подготовки, другие 50% - после дневной предварительной подготовки и освежения в памяти. Хорошее овервью базовых вещей и структуризация знаний, но ничего с претензией на глубину или продвинутость.
Еще более остро на меня накатило это чувство перед прошедшим новым годом. В нашей компании были открыто две вакансии для опытных Data Engineer’ов, и я помогал HR скринить CV, проверять assessments и проводить собеседования. Было немало кандидатов с неплохим CV, но вот уровень выполнения тестового задания... (ремарка: у нас тестовое, ИМХО, простое - могу судить, так как когда сам когда искал работу, решал не только его же, но еще 5-6 других; поэтому если кандидат настроен серьезно, то у него есть возможность показать свой уровень вниманием к мелочам). Большинство решений были написаны линейным кодом с использованием самых примитивных конструкций и подходов - прям как в курсах/статьях "Spark для чайников". Такое сойдет для быстрого ad hoc запроса в каком-нить ноутбуке, но не в assessment на позицию опытного инженера с первоначальной воронкой 100+ человек на место в крупную известную компанию. Хотя... Вполне возможно, кандидаты искренне думали, что такой код является вполне приемлемым - в конце концов же даже Databricks (очень уважаемый вендор!) всячески продвигает ноутбуки для написания Spark-джобов…
Еще больше проблем возникает при проведении технического собеседования. То, что я еще года два назад считал essential для junior+ позиций, сейчас знает не каждый кандидат с 7+ лет опыта. Вот какую оценку поставить ему, если он не знает, что такое pure function в Scala или в чем разница между coalesce и repartition? Это, к сожалению, реальные кейсы!
Виноваты ли инженеры в сложившейся ситуации? Ответ, как всегда, непростой - ИМХО, и да, и нет!
"Нет" - потому что они выросли как специалисты в таком "окружении" и "рынке", когда их знаний "Spark для чайников" полностью хватает для закрытия рабочих задач, работодателя это полностью устраивает, и он им дает очередные погоны "middle - senior - и т.п." за успешное закрытие бизнес-запросов и прокачку софт-скилов. А “технических долг” по хард-скилам между тем все копиться. Эффект Даннинга — Крюгера, только без видимых ошибок и серьезных последствий. Если ты получаешь положительную обратную связь о своей работе, зарабатываешь 100500 единиц денег в минуту и вдобавок эта сумма еще и регулярно повышается, откуда возьмется мотивация быть лучше? Ты УЖЕ считаешь, что ты ТОП! Да и вообще, в "интернетах" вон все CSV-файлик с Нью-Йоркским такси агрегируют, а у тебя parquet / iceberg / delta !
"Да" - потому что, ИМХО, любой хороший инженер должен быть профессионалом и стремиться развиваться. Работодатель в лице кого-нить менеджера часто не имеет достаточных компетенций (да и желания) для оценки качества кода - для этого у него есть мы. Именно опытные разработчики должны задавать стандарты разработки, определять архитектуру и т.п. В свое время я многому научился именно наблюдая, как работают более опытные коллеги, следуя “спущенным” ими стандартам разработки и ковыряясь в их коде, делая очередную доработку или исправляя какой-то баг (и порою удивляясь “Вау! А так тоже можно было?”). Так же хорошо бы регулярно обмениваться опытом с коллегами и самим шарить опыт. В конце концов, ведь джуны пишут статьи на тему "В чем разница между coalesce и repartition" (может даже уважаемый читатель написал подобную в прошлом), так почему нам, опытным, не написать то же что-нить, только менее тривиальное?
В общем, как эпилог. Давайте, мы, опытные инженеры, будем активнее делиться своим опытом, знаниями и подходами в сети и в оффлайне. Это же в конце концов в наших же интересах. Иначе нам же потом работать с коллегами, которые будут писать "выколи мне глаз"-код, нам же править за ними баги и рефакторить, нам же отучать их от "ноутбук"-стайл разработки и показывать, как правильно организовывать и структурировать приложение и т.п.
PS. Хм, сейчас перечитал еще раз и понял, что, пожалуй, написанное можно отнести к разработке вообще, а не только к дата инженерии. Там ситуация такая же?
PSS. Если у кого-то есть хорошие примеры ресурсов/статей по Spark'у хорошего уровня, то киньте плиз ссылки в комментариях.
Комментарии (12)
panzerfaust
16.01.2024 08:55+2Я это почувствовал еще несколько лет назад, когда вдруг осознал, что уже долго не могу найти какой-либо продвинутый контент не только по Spark, но и вообще для Data Engineer
Так поменяйте "spark" на что угодно и ситуация не изменится. На медиуме на серьезных щщах в 2023 году рассказывают, что такое стримы в джаве. Фича в 2014 вышла, на минуточку.
Почти весь контент по чему угодно - перепечатки мануалов. Хочется глубже - уже надо читать книги и смотреть конфы. Еще глубже - стараться попасть в коллективы, где задачи уровня hard. И по-другому вряд ли будет.
lingbizkit
16.01.2024 08:55Есть курс "Инженер данных" у одного крупного образовательного проекта, который ещё и ИТ компания. В курсе смешано много технологий и спарк там рассматривается в середине курса. В плане спарка там инфа была для меня самая интересная из многого, что я видел: много про оптимизацию джоб, чтобы они запускались на больших датасетах, а её игрушка. Это было похоже на подытожевания разрозненных фактов, которые я изучил на опыте.
akudiyar
16.01.2024 08:55+2Если есть желание - давайте организуем телеграм / дискорд чат для обсуждения более серьезных вещей и внутренней реализации. Я разрабатываю и поддерживаю коннектор Spark для Tarantool и мне тоже очень не хватает литературы и обмена мнениями. Фактически единственное, чем остаётся пользоваться - это документация Spark Internals (сильно устаревшая местами и неполна) и исходники.
Я попытался немного исправить ситуацию, и сделал доклад по внутренней части Spark по результатам своих раскопок (https://jpoint.ru/talks/84b0f81d9de64bf2a0ea2d20e1304bd1/) - надеюсь, этот материал можно будет улучшить и развить до новой версии Spark Internals.Пишите в личку или в другие контакты, буду рад.
PastorGL
16.01.2024 08:55+2https://t.me/hadoopusers — почти 5к участников. Уровень разный, есть очень опытные товарищи. Если хотите аудиторию, начните оттуда.
PastorGL
С учётом того факта, что для 97.78% пользователей Spark он ограничивается Spark SQL, очень странно к ним взывать.
Если хочется залезть поглубже — ну так берёшь и залазишь в исходники. Они открыты ведь. Но внутренний уровень Spark, кроме разработчиков чего-то кастомного на нижнем уровне API, никому не интересен. Мне вот нужен, так что можете мои статьи посмотреть, например. Но таких, как я, совсем мало.
Большинству же, работающему с SQL, это всё незачем. Потому они и не знают, что .reparttition это .coalece(shuffle = true).
Ninil Автор
Да, это печальный факт... На днях медиум на вкладке "в тренде" порекомендовал мне статью, где автор призывает как раз использовать со Спарком только SparkSQL...
Поглубже в исходники - о таком можно только мечтать. Я не вижу (по кандидатам в нашей воронке) даже банального - например намек на функциональный подход: надо переименовать 5-10 колонок, значит будет 5-10 раз withColumnRename вместо чего-нить типа renameMap.foldLeft... Примеров таких массу могу надергать из ассесментов..
exfizik
withColumnsRenamed
более читабельно.renameMap.foldLeft
какой-то выигрыш в производительности даёт?Ninil Автор
По производительности - нет. Вот по читабельности кода и удобству сопровождения - да. Если конечно код организован нормально. Например добавляем через имплисит класс новый метод renameColumns для DataFrame, который принимает на вход renameMap и под капотом через foldLeft переименовывает поля. И потом в коде вызываем что-то типа
df.renameColumns(renameMap)
Просто, читабельно, масштабируемо, да еще и красиво
exfizik
Есть же
withColumnsRenamed
- куда уж читабельнее? Точно так же передаёте тудаrenameMap
и не надо никаких своих методов добавлять. Правда, сравнительно новый спарк 3.4 нужен.Ninil Автор
О! спасибо за наводку. Не заметил в оригинальном вашем сообщении "лишнюю S")))
Спарк 3.4 не пробовал - у нас еще 3.2 по разным причинам(
Но кандидаты все равно массово используют каскады withColumnRenamed
NoGotnu
А причем тут Spark SQL? Если знать что под капотом творится, какая разница на чем писать? А если не знаешь, то и на Python/Scala хрень можно написать. Что за высокомерие?
Тем более что SQL более понятен аналитикам, бизнесу его дешевле поддерживать, поэтому я чаще всего на проектах слышу от бизнеса требование код писать на SQL. В 99% случаев можно спокойно им обойтись. А для остальных редких случаев можно почитать spark internals, либо в исходники залезть.
Что от статьи, что от первых комментариев несёт каким-то высокомерием и пижонством, особенно про собеседования. Все вокруг тупые, один вы Д'артаньян
PastorGL
Автор статьи сетует на то, что а) кроме spark internals ничего про нижний уровень толком не найти, и б) впрочем, даже и его всё равно никто не читает перед собеседованием.
Я же иронизирую над ситуацией (очевидно же, что проценты придуманы от балды), чего вы, по всей видимости, не выкупаете. Какое ещё высокомерие? Какое нафиг пижонство? Расслабьтесь, тут нет никакого наезда.