Какой задачей больше всего гордишься?

Ответ

Больше всего горжусь задачей по разработке и оптимизации ETL-пайплайна для обработки ежедневных логов пользовательских событий объемом более 10 ТБ.

Проблемы и решения:

  1. Парсинг сложных JSON: Исходные логи содержали глубоко вложенные структуры. Я реализовал кастомные схемы в PySpark, что ускорило парсинг на 30% по сравнению с автоматическим выводом схемы.
    from pyspark.sql.types import StructType, StructField, StringType, ArrayType, LongType
    custom_schema = StructType([
        StructField("userId", StringType()),
        StructField("events", ArrayType(StructType([...])))
    ])
  2. Гарантия Exactly-Once: Чтобы избежать дублей и потерь, использовал комбинацию формата Delta Lake для транзакционности и тщательного управления checkpoint'ами в Spark Structured Streaming.
  3. Оптимизация хранения и стоимости: Внедрил стратегическое партиционирование по дате и типу события, что вместе с компрессией ZSTD сократило расходы на хранение на 40%.

Результат: Время от получения сырых данных до их доступности для аналитиков сократилось с 5 до 2 часов при значительном снижении инфраструктурных затрат.

Ответ 18+ 🔞

А, ну это та самая история, где я чуть не поседел, но зато теперь могу хвастаться. Горжусь, как слон хоботом, этим ебушки-воробушки ETL-пайплайном для логов. Представь: каждый день на тебя сваливается овердохуища данных — больше 10 терабайт пользовательских событий. Не просто файлики, а настоящая свалка.

Где мы ломались и как чинили:

  1. JSON, который сам себя не понимает. Исходники — это пиздопроебибна структура, JSONы вложенные, как матрёшки. Автоматический парсинг в Spark накрывался медным тазом по времени. Что сделал? Взял и вручную прописал кастомные схемы. Spark перестал гадать, что к чему, и просто работал. Выиграли 30% скорости на одном этом.

    from pyspark.sql.types import StructType, StructField, StringType, ArrayType, LongType
    custom_schema = StructType([
        StructField("userId", StringType()),
        StructField("events", ArrayType(StructType([...])))
    ])

    Без этого — терпения ноль ебать, он бы думал дольше, чем обрабатывал.

  2. Танцы с гарантиями. Ну, классика: чтобы ни одна запись не потерялась и не продублировалась — доверия ебать ноль к стандартным подходам. Скомбинировал Delta Lake (чтоб всё транзакционно было) и хитрое управление checkpoint'ами в стриминге. Теперь Exactly-Once — не просто слово из презентации, а реальность. Спать спокойно можно.

  3. Хранить — не мешки ворочать. Изначально данные лежали, как попало, и деньги за хранение текли рекой. Надо было э, бошка, думай. Внедрил партиционирование по дате и типу события, плюс компрессию ZSTD поджал. В итоге срезал расходы на хранение на 40%. Бухгалтерия до сих пор не верит.

Итог, чувак: Раньше аналитики ждали эти логи по 5 часов, а теперь — максимум 2. И инфраструктура стала ядрёна вошь дешевле. В общем, вышло охуенно, хоть и попотеть пришлось знатно.