Обложка известной серии книг.
Обложка известной серии книг.

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)


  1. PastorGL
    16.01.2024 08:55
    +4

    С учётом того факта, что для 97.78% пользователей Spark он ограничивается Spark SQL, очень странно к ним взывать.

    Если хочется залезть поглубже — ну так берёшь и залазишь в исходники. Они открыты ведь. Но внутренний уровень Spark, кроме разработчиков чего-то кастомного на нижнем уровне API, никому не интересен. Мне вот нужен, так что можете мои статьи посмотреть, например. Но таких, как я, совсем мало.

    Большинству же, работающему с SQL, это всё незачем. Потому они и не знают, что .reparttition это .coalece(shuffle = true).


    1. Ninil Автор
      16.01.2024 08:55
      +2

      Да, это печальный факт... На днях медиум на вкладке "в тренде" порекомендовал мне статью, где автор призывает как раз использовать со Спарком только SparkSQL...

      Поглубже в исходники - о таком можно только мечтать. Я не вижу (по кандидатам в нашей воронке) даже банального - например намек на функциональный подход: надо переименовать 5-10 колонок, значит будет 5-10 раз withColumnRename вместо чего-нить типа renameMap.foldLeft... Примеров таких массу могу надергать из ассесментов..


      1. exfizik
        16.01.2024 08:55
        +1

        withColumnsRenamed более читабельно. renameMap.foldLeft какой-то выигрыш в производительности даёт?


        1. Ninil Автор
          16.01.2024 08:55
          -1

          По производительности - нет. Вот по читабельности кода и удобству сопровождения - да. Если конечно код организован нормально. Например добавляем через имплисит класс новый метод renameColumns для DataFrame, который принимает на вход renameMap и под капотом через foldLeft переименовывает поля. И потом в коде вызываем что-то типа

          df.renameColumns(renameMap)

          Просто, читабельно, масштабируемо, да еще и красиво


          1. exfizik
            16.01.2024 08:55
            +2

            Есть же withColumnsRenamed - куда уж читабельнее? Точно так же передаёте туда renameMap и не надо никаких своих методов добавлять. Правда, сравнительно новый спарк 3.4 нужен.


            1. Ninil Автор
              16.01.2024 08:55
              -1

              О! спасибо за наводку. Не заметил в оригинальном вашем сообщении "лишнюю S")))
              Спарк 3.4 не пробовал - у нас еще 3.2 по разным причинам(
              Но кандидаты все равно массово используют каскады withColumnRenamed


    1. NoGotnu
      16.01.2024 08:55

      А причем тут Spark SQL? Если знать что под капотом творится, какая разница на чем писать? А если не знаешь, то и на Python/Scala хрень можно написать. Что за высокомерие?

      Тем более что SQL более понятен аналитикам, бизнесу его дешевле поддерживать, поэтому я чаще всего на проектах слышу от бизнеса требование код писать на SQL. В 99% случаев можно спокойно им обойтись. А для остальных редких случаев можно почитать spark internals, либо в исходники залезть.

      Что от статьи, что от первых комментариев несёт каким-то высокомерием и пижонством, особенно про собеседования. Все вокруг тупые, один вы Д'артаньян


      1. PastorGL
        16.01.2024 08:55
        +1

        Автор статьи сетует на то, что а) кроме spark internals ничего про нижний уровень толком не найти, и б) впрочем, даже и его всё равно никто не читает перед собеседованием.

        Я же иронизирую над ситуацией (очевидно же, что проценты придуманы от балды), чего вы, по всей видимости, не выкупаете. Какое ещё высокомерие? Какое нафиг пижонство? Расслабьтесь, тут нет никакого наезда.


  1. panzerfaust
    16.01.2024 08:55
    +2

    Я это почувствовал еще несколько лет назад, когда вдруг осознал, что уже долго не могу найти какой-либо продвинутый контент не только по Spark, но и вообще для Data Engineer

    Так поменяйте "spark" на что угодно и ситуация не изменится. На медиуме на серьезных щщах в 2023 году рассказывают, что такое стримы в джаве. Фича в 2014 вышла, на минуточку.

    Почти весь контент по чему угодно - перепечатки мануалов. Хочется глубже - уже надо читать книги и смотреть конфы. Еще глубже - стараться попасть в коллективы, где задачи уровня hard. И по-другому вряд ли будет.


  1. lingbizkit
    16.01.2024 08:55

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


  1. akudiyar
    16.01.2024 08:55
    +2

    Если есть желание - давайте организуем телеграм / дискорд чат для обсуждения более серьезных вещей и внутренней реализации. Я разрабатываю и поддерживаю коннектор Spark для Tarantool и мне тоже очень не хватает литературы и обмена мнениями. Фактически единственное, чем остаётся пользоваться - это документация Spark Internals (сильно устаревшая местами и неполна) и исходники.
    Я попытался немного исправить ситуацию, и сделал доклад по внутренней части Spark по результатам своих раскопок (https://jpoint.ru/talks/84b0f81d9de64bf2a0ea2d20e1304bd1/) - надеюсь, этот материал можно будет улучшить и развить до новой версии Spark Internals.

    Пишите в личку или в другие контакты, буду рад.


    1. PastorGL
      16.01.2024 08:55
      +2

      https://t.me/hadoopusers — почти 5к участников. Уровень разный, есть очень опытные товарищи. Если хотите аудиторию, начните оттуда.