Дмитрий Кузьмин. Инженерия данных
926 subscribers
47 photos
4 videos
41 links
Путь Data engineer от junior до lead.

Делюсь мыслями, рабочими кейсами, обучением. Блог для junior - middle DE.

🌐 Репозиторий: https://github.com/dim4eg91/DataEngineering/tree/main
📱 Мой профиль: @dim4eg91
📚 Сайт: https://kuzmin-dmitry.ru
Download Telegram
#путь_de

🔥 2 недели учебы по программе Apache Spark позади! 🚀

За это время я узнал множество интересных и полезных вещей о Spark — мощном инструменте для работы с большими данными. Делюсь основными тезисами:

🔹 Spark — это больше, чем просто ETL-инструмент. Это полноценный фреймворк для обработки распределенных данных, который позволяет работать с огромными объемами информации и выполнять сложные вычислительные задачи.

🔹 Несмотря на частые упоминания Hadoop рядом со Spark, они не зависят друг от друга. Hadoop часто используется в качестве хранилища данных (HDFS), но Spark может работать с различными источниками данных и не требует Hadoop для своей работы.

🔹 HDFS не умеет выполнять операции объединения файлов (join и т.д.). Чтобы получить абстракции над файлами, такими как паркеты, и выполнять операции объединения, необходимо использовать Spark или другие инструменты.

🔹 Spark можно развернуть локально, в Kubernetes, YARN. Он также может работать с файловой системой обычного ПК, что делает его очень гибким и универсальным инструментом для обработки данных.

🔹 В Spark можно работать через DataFrames и Spark SQL. По сути, это два подхода к одной и той же задаче, и разницы в скорости выполнения между ними нет. Единственное отличие — при использовании Spark SQL сначала работает парсер, который разбивает SQL-запрос на составные части, а затем запрос обрабатывается так же, как и при использовании DataFrames.

🔹 Scala — язык программирования, используемый для интерпретации приложений Spark. Он позволяет получать исходный код и управлять работой Spark-приложений. Но стоит отметить, что Scala довольно сложен для понимания, особенно если это ваш первый язык программирования. Читается он сложнее Python, но писать на нем можно короче и компактнее!

Кроме того, мы провели лабораторную работу по считыванию данных из файла, их обработке и записи в JSON. Было довольно интересно погрузиться в практическое применение этих знаний! 🔍📊

Эти две недели дали мне отличное понимание того, как эффективно использовать Spark в проектах по обработке больших данных. Впереди еще много интересного!
🔥12👍3🤯2🤓1
📱 Друзья, я создал репозиторий на GitHub для быстрого доступа ко всем материалам, опубликованным на моем Telegram-канале. Упоминал об этом в посте.

Теперь вы сможете легко находить нужные посты без необходимости утомительно пролистывать ленту вверх.

Изначально я рассматривал вариант с Notion, но, учитывая слухи о возможной блокировке сервиса в России с 9 сентября, решил перейти на более надежный вариант. GitHub доступен и удобен для всех, кто хочет иметь под рукой всю информацию.

В репозитории я собрал все ссылки на посты, рассортировал их по категориям, так что вам будет проще ориентироваться. 📚

Репозиторий постепенно буду наполнять полезным контентом.

Переходите по ссылке, добавляйте в закладки и пользуйтесь: https://github.com/dim4eg91/DataEngineering/tree/main

Спасибо, что остаетесь со мной!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍4👏2
#база_знаний
#путь_de

🛤️ Хочу вам рассказать про несколько направлений работы Data engineer, каждое из которых требует специфических навыков и инструментов. В зависимости от задач и целей компании, обязанности инженера данных могут варьироваться.

Общая картина примерно такая:

1️⃣Проектирование и разработка ETL/ELT процессов

* Основные задачи:

Сбор данных из различных источников: базы данных, API, файлы, сторонние сервисы и т.д.
Трансформация данных в нужный формат для последующего анализа.
Загрузка данных в хранилища данных или аналитические системы.
Рабочие инструменты:

* ETL/ELT платформы:

Apache NiFi, Talend, Apache Airflow, AWS Glue.
Языки программирования: Python, SQL, Java.
Системы хранения данных: Amazon S3, Google Cloud Storage, Hadoop.

* Подготовка:

Знание SQL и одного из языков программирования (например, Python).
Опыт работы с базами данных и понимание принципов ETL/ELT процессов.
Курсы и тренинги по основам работы с данными и использованием ETL инструментов.

2️⃣Управление данными и их качеством

* Основные задачи:

Проверка качества данных: валидация и очистка данных от ошибок, дубликатов и некорректных значений.
Организация хранения данных: создание схем и моделей данных для эффективного хранения.
Мониторинг данных: настройка алертов и автоматизированных проверок для выявления проблем с качеством данных.
Рабочие инструменты:

* Системы мониторинга данных:

Great Expectations, dbt (data build tool), Apache Atlas.
Инструменты работы с базами данных: PostgreSQL, MySQL, Oracle, Microsoft SQL Server.

* Подготовка:

Понимание принципов нормализации данных и реляционных баз данных.
Опыт работы с SQL для написания сложных запросов и выполнения операций с данными.
Курсы по Data Governance и Data Quality Management.

3️⃣Работа с большими данными (Big Data)

* Основные задачи:

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

* Рабочие инструменты:

Big Data платформы: Apache Hadoop, Apache Spark, Google BigQuery.
Инструменты распределенного хранения данных: Apache HBase, Cassandra, Amazon Redshift.
Языки программирования: Scala, Java, Python.

* Подготовка:

Знание принципов распределенных вычислений и архитектуры Big Data.
Опыт работы с инструментами для обработки больших данных (например, Apache Spark).
Специализированные курсы по Big Data и Hadoop/Spark.

4️⃣Создание и управление хранилищами данных

* Основные задачи:

Проектирование архитектуры хранилища данных (Data Warehouse) для организации хранения данных из разных источников.
Интеграция данных из множества систем в единую модель данных.
Оптимизация запросов и поддержка аналитической нагрузки.
Рабочие инструменты:

* Платформы для хранилищ данных:

Snowflake, Amazon Redshift, Google BigQuery, Microsoft Azure Synapse, Greenplum
Языки запросов и скриптов: SQL, PL/SQL, T-SQL.

* Подготовка:

Понимание архитектуры хранилищ данных и методов их проектирования.
Опыт работы с системами управления базами данных (СУБД) и написания SQL запросов.
Курсы по Data Warehousing и Advanced SQL.

5️⃣Работа с потоками данных (Streaming Data)

* Основные задачи:

Организация и управление потоками данных в реальном времени.
Обработка событий в потоках данных с минимальными задержками.
Интеграция потоковых данных с различными аналитическими и операционными системами.

Рабочие инструменты:

* Платформы для потоковой обработки данных:
Apache Kafka, Apache Flink, Apache Pulsar, AWS Kinesis.
Языки программирования и фреймворки: Python, Java, Kafka Streams, Apache Beam.

* Подготовка:

Знание принципов потоковой обработки данных и работы с платформами, такими как Apache Kafka.
Опыт написания программ для обработки данных в реальном времени.
Курсы по Stream Processing и Data Engineering.

*️⃣"Что конкретно учить" зависит от того:
- что лично вам интересно
- что требуется на той вакансии, на которую вы хотите устроиться.

Дополняйте список в комметах 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4🤝321
Нас уже 200! Спасибо каждому за вашу поддержку и активность, впереди ещё больше интересного! 🎉

С пятницей и хороших выходных!
16🔥4🎉3👏2
#кейсы

🔀 На днях столкнулся с реальной необходимостью использовать cross join в одном из своих проектов. Иногда, когда нужно перемножить все возможные комбинации данных из двух таблиц, без этого не обойтись.

Хочу поделиться с вами полезной статьей на эту тему. Этот пример можно использовать и в Spark, и в БД, а также привести его как пример использования метода на собесе.

Если вам тоже приходилось решать такие задачи, напишите, как справились!
👍6🔥43
🎉 Коллеги, не могу не поздравить вас с днем программиста) поэтому с профессиональным праздником, даже если вы только начинаете этот путь!

🎙 Вчера был на конференции Arch.Meetup по архитектуре данных. Очень понравился доклад ребят из Сбера. Чуть позже поделюсь с вами тезисами темы их выступления.
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉10👍6👏3
▶️ В среду удалось очно побывать на конференции Сбера Arch.Meetup по архитектуре данных. Честно сказать, было очень круто и познавательно.

Запись эфира

Из того, чем интересно поделиться. Последние спикеры, ребята из Сбера, рассказывали о:
- возможности внедрения AI агентов для помощи DE
- улучшении качества данных для взаимодействия AI и DE

Сейчас 30% работы DE - это поиск необходимых бизнес смыслов среди множества таблиц, их склейка и получение истины.
Если в текущих реалиях попросить AI найти данные по клиенту, то скорее всего на выходе будешь чушь.


Внедрение AI для улучшения качества данных - то, над чем работают ребята.

🔹Какие роли и задачи может решать AI агент?

Виртуальный DE - подготовка данных:
- поиск данных
- генерация SQL или программного кода
- получение данных и конвертирование в нужный формат

Виртуальный DA - проверка гипотезы и подготовка отчета:
- прогнозирование
- построение визуализации
- получение инсайта
- возврат его клиенту в нужное время

🔹Какие проблемы встают перед Виртуальным DE?

- поиск нужной системы и места хранения нужной информации
- определение верного ключа клиента или договора
- определение способа выхода с клиента на договор

🔹Постановка задачи

1. Внедрение архитектурного фреймворка, позволяющего правильно инвентаризировать все данные.
2. Внедрение правил проектирования, позволяющие эффективно связывать данные между собой.

🔹Для выполнения этой задачи ребята используют идеи из предметно - ориентированного проектирования:

1. Выделяются предметные области (например, расчет ЗП, управление рабочим временем, кадровое администрирование)

2. Определяются сущности предметных областей
- границы контекста определяют границы модели
- моделируются все объекты, использующиеся на уровне процессов и продуктов
- разделяются сущности на "свой" и "чужой"

3. Формируется карта контекстов (для "чужих" обязательно указываются связи с источниками, т.е. сохраняются первичные ключи из других систем)

🔹Итог такого подхода

1. Все данные закреплены за своим объектом управления
2. Доступ к данным обеспечивается через контракты API\DataAPI
3. Требования доступов закладываются при проектировании систем
4. Сохранена автономность команд и масштабируемость ландшафта

Сейчас примерно на 100 команд в Сбере тиражирован новый подход. Он нативен, т.е. не отторгается командами. Происходит разделение предметных областей.


Весь подход про автоматизацию рутины Data engineer'а через доработку архитектуры.

В конечном счете LLM (языковая модель, как AI агент) сможет точечно находить нужные бизнес данные. Вот такие изменения могут быть уже в ближайшем будущем в контексте DE и AI.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3🤔2
#путь_de
#курсы

🚀 Завершились очередные 2 недели хардового обучения по Scala Spark. Честно говоря, я не был готов к такому темпу. (Пост_1, пост_2)

⚙️ Идет очень сложно, но вполне посильно — где-то 80% нового материала приходится осваивать на ходу.

📚 За это время успел выполнить 3 лабораторные из 10, и держусь на 3-м месте в потоке из 30 человек! 💪

💻 Самое крутое — собрал свой первый проект на Scala! Параллельно качаю навыки работы с терминалом.

Что уже сделал:

Лаба 1 — Расчет рейтингов фильмов. Первая встреча с реальной обработкой данных на этом языке!

Лаба 2 — Поиск сайтов, релевантных определенной группе пользователей. Много работы с фильтрацией и логикой обработки данных.

Лаба 3 — Создание витрины данных из различных источников (файлы, NoSQL, реляционные БД). Настоящий бой со множеством источников данных и их интеграцией.

📈 Постепенно двигаюсь вперед, каждый проект прокачивает скиллы работы с данными и инструментами Spark.

🔥 Впереди еще много работы, но мотивация на максимум!
🔥12👏3👍2
🔮 И с пятницей 13-м, коллеги!

Не бойтесь ни сайнтистов, ни страшных багов и уж точно не бойтесь сложных курсов — ведь каждый из них учит чему-то новому!
🔥9🎃4👻3😱2👍1
#база_знаний

🟢 Greenplum: платформа для больших данных

Друзья, привет! В последнее время я часто вижу требование знания MPP Greenplum в вакансиях инженеров данных, и мне хочется чуть подробнее осветить эту СУБД. Она используется в проектах с большими данными, и на нее точно стоит обратить внимание. Вот краткое описание ее возможностей.

🌟 Чем Greenplum хорош?

* Масштабируемость: Greenplum легко растет вместе с вами. Если вы хотите обрабатывать данные на нескольких серверах, она без проблем с этим справится! От небольших кластеров до сотен узлов.

* Параллельная обработка: Greenplum использует MPP (massively parallel processing), что позволяет одновременно обрабатывать множество задач. Это заметно ускоряет работу с большими наборами данных.

* Знакомый SQL: вам не придется учить новый язык для работы с Greenplum. Он поддерживает стандартный SQL, что облегчает интеграцию с уже существующими системами.

* Интеграция с Hadoop: если данные хранятся в Hadoop, Greenplum легко интегрируется с этой экосистемой и расширяет возможности аналитики.

* Аналитика в реальном времени: можно анализировать данные на лету, Greenplum легко с этим справляется.

🔧 Где используется Greenplum?

* Хранение и обработка исторических данных
* Построение систем бизнес-аналитики (BI)
* Работа с моделями машинного обучения
* Интеграция с потоками данных, например, из Kafka

🎯 Вакансии и востребованность Greenplum

* Greenplum часто упоминается в вакансиях для инженеров данных, аналитиков и разработчиков, особенно когда речь идет о работе с системами на базе MPP.

* Компании ищут специалистов, которые умеют работать с большими объемами данных и распределенными системами.

* Знание Greenplum может стать вашим большим преимуществом на рынке труда.

🛠 Кому подойдет Greenplum?

* Инженерам данных, работающим с большими наборами данных
* Специалистам BI, которые создают отчеты и проводят аналитику
* Разработчикам, желающим ускорить сложные аналитические запросы

📐 Архитектура Greenplum: как это работает?

* Master Node – главный узел, который управляет запросами и распределяет их по сегментам для обработки.

* Segment Nodes – это узлы, которые хранят и обрабатывают часть данных. За счет этого достигается параллельная обработка и высокая производительность.

* Interconnect – это сеть, которая связывает мастер-узел и сегментные узлы, обеспечивая быструю передачу данных между ними.

Благодаря такой архитектуре Greenplum довольно легко справляется с большими объемами данных, обрабатывая их быстрее, чем традиционные СУБД.

Пара ссылок:

1) Более развернуто про Greenplum здесь.

2) Официальные Greenplum Tutorials на английской, но в целом все понятно, рекомендую к прослушиванию.
🔥11👍6🤔1
#путь_de

Интересно, у кого-нибудь есть опыт разработки аналитического хранилища с нуля, в виде пет-проектов? От архитектуры до инструментов.

Возможные компоненты:
* оркестратор для джобов
* БД или озеро для хранения таргетов
* витрины, как лицо dwh
* BI для визуализации

Разворачивание в облаке / на отдельном сервере.
Загрузка таргетов может быть сразу в витрины или бд / озеро.

Объем данных небольшой - возможно, инкрементальная загрузка с сайтов или иное.

▶️ Поделитесь пожалуйста опытом, думаю, многим будет интересно.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤔3🤝32
#путь_de
#курсы

🎉 Завершена 6-я неделя обучения!

Подвожу итоги:

Лабораторная 4 завершена — научился читать данные из Kafka и записывать их в формат JSON на HDFS. Но с Kafka еще нужно углубленно поразбираться.

🔄 Работа над Лабораторной 5 в разгаре — продолжаю то, что начал в Лабе 4: читаю JSON, строю матрицу "клиенты — действия", провожу агрегацию данных и записываю их в Parquet с возможностью дозаписи. Очень круто видеть, как все данные связываются воедино. В этом ребята из Newprolab молодцы - делают сквозные проекты.

💻 Навигация и управление в terminal на HDFS стали намного легче — теперь увереннее перемещаюсь по файловой системе, запускаю bash-скрипты и управляю процессами. Обилие практики действительно помогает!

⚙️ Упаковка Scala проектов и работа с jar-файлами — освоил, как правильно упаковывать Scala-код, собирать jar-файлы и запускать их на кластере. Теперь мне становится понятна эта магия.

Две недели были очень продуктивными. С пятницей, друзья, и предстоящей еженедельной перезагрузкой!
👍6🔥3🤓3
Media is too big
VIEW IN TELEGRAM
Сегодня у меня небольшой личный праздник — ровно полгода в роли Data Engineer! 🎉

За это время я осознал, что наконец-то нашел то, чем действительно горю, что приносит мне не только профессиональный рост, но и настоящее удовольствие.

Если и есть что-то важное, чему я научился за этот период, так это слушать свое сердце. Оно всегда знает, где вы можете раскрыться на 100% и чем стоит заниматься, чтобы быть в гармонии с собой.

Не бойтесь перемен и не держитесь за то, что делает вас несчастными — будь то текущее положение дел, обстоятельства или даже начальство. Если чувствуете, что ситуация не приносит вам радости или роста, делайте шаг вперед, к своей мечте.

Ваш путь — только ваш. Идите по нему с уверенностью, даже если сейчас он кажется неясным или сложным.

Верьте в себя и двигайтесь вперед! 🚀
🎉22👍5👏3
У инженеров все в огне)) у BI - все красиво, а data scientists просто ждут пока модель переобучится на данных. Очень жизненный мем)
😁15🤣4🔥2
#база_знаний

Когда я только начинал изучать базы данных, слово "партиции" настораживало меня. Этот термин звучал сложно, но со временем я понял, что это ключ к оптимизации работы с данными, особенно в больших системах.

✔️ Партиции в SQL

Партиции в SQL — это не что иное, как разбиение большой таблицы на более мелкие части. В крупных таблицах, где миллионы строк, запросы могут выполняться очень долго. Партиции помогают это исправить: они позволяют системе работать только с нужной частью данных, что значительно ускоряет запросы.

Например, можно разбить таблицу заказов по месяцам или по регионам.

CREATE TABLE orders (
order_id INT,
order_date DATE,
customer_id INT
) PARTITION BY RANGE(order_date);


Так, система будет обрабатывать только данные за нужный период, а не всю таблицу целиком.

✔️ Партиции в Apache Spark

В мире больших данных, когда я стал работать с Apache Spark, понятие партиций приобрело для меня ещё больший смысл.
Spark — это распределённая система, и партиции здесь играют ключевую роль. Spark разбивает данные на части, чтобы обрабатывать их параллельно на разных узлах кластера, что позволяет справляться с огромными объёмами данных очень быстро.

Один из ключевых моментов работы в Spark — это запись данных в формате Parquet. При этом указание полей партиционирования является критичным для оптимальной работы с данными. Например, вы можете партиционировать данные по году и месяцу, чтобы ускорить последующую выборку.

Пример 1: Партиционирование при записи данных в Parquet

df = spark.read.csv("sales_data.csv")

# Запись в Parquet с партиционированием по году и месяцу

df
.write
.partitionBy("year", "month")
.parquet("s3://bucket/sales_data")
Теперь, когда мы будем запрашивать данные только за определённый год и месяц, Spark будет обрабатывать только соответствующие партиции, что значительно уменьшит время выполнения запросов.


Пример 2: Оптимизация числа партиций для обработки

Когда данные загружаются в Spark DataFrame, они автоматически разбиваются на партиции. Однако для более эффективной работы с большими данными иногда требуется вручную настроить количество партиций. Например, при работе с большими ETL-пайплайнами на кластере Spark с большим количеством узлов можно настроить более тонкую балансировку нагрузки.

df = spark.read.parquet("s3://bucket/sales_data").repartition(200)

# Теперь данные будут разбиты на 200 партиций для параллельной обработки


Пример 3: Партиционирование для агрегаций

Допустим, вы работаете с большими наборами данных о продажах, которые вам нужно агрегировать по нескольким измерениям, таким как год, месяц и регион. Для ускорения таких операций можно использовать партиционирование:
sales_df = spark.read.parquet("s3://bucket/sales_data")

aggregated_df = sales_df
.groupBy("year", "month", "region")
.agg({"sales_amount": "sum"})
.repartition("year", "month")


⚠️ Сейчас, при работе в Spark, практически ни одна запись в Parquet не обходится без указания поля партиционирования.

Партиции позволяют уменьшить объём данных, которые необходимо читать и обрабатывать, что особенно важно при работе с огромными объёмами информации в ETL-процессах. К слову, есть задачи, в которых данных на несколько десятков млрд!

Партиционирование в Spark стало для меня понятным и обязательным инструментом, когда я начал решать задачи ETL на практике.

Если вам не знаком термин, обязательно с ним познакомьтесь!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥6🤝4
#кейсы

⚙️ Друзья, хочу поделиться с вами обзором моего первого ETL пет проекта. Делал его из собственного интереса и практической необходимости.

✉️ Кейс описывает подключение к почтовому серверу, поиск и извлечение данных от магазинов, преобразование данных и их загрузку в БД для хранения и визуализации.

P.S. Анимация под заголовком статьи погружается не сразу.

Навигация по другим материалам группы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👏6👍5
🔥Задача по формированию матрицы feature x date

Предположим, есть таблица в Hive (~300 МБ, справочник).
root
|— feature
|— col1
|— col2
|— date


Данные есть за 2024 год, но не для всех дат 2024:
feature col1 col2 date
feature1 1 1 2024-01-04
feature2 2 1 2024-01-06


Данные обогащены в Spark и записаны в формате Parquet. Затем они читаются через DBeaver external table, на основе которых создается view как слой абстракции для дальнейшего использования в BI-инструменте, например, в Qlik Sense для построения дашборда.

Задача — построить матрицу feature x date, где для каждого значения поля feature отображается соответствующее значение поля date и значения остальных полей. Если данные для сочетания отсутствуют, соответствующая ячейка заполняется null.

🤔 Вопросы для размышления:

1️⃣Как можно реализовать такую матрицу? Какие инструменты и подходы стоит использовать?

2️⃣Имеет ли значение, где именно производить преобразования: в Spark, Greenplum или BI-инструменте? Какие плюсы и минусы у каждого варианта?

3️⃣Если объем справочника значительно возрастет, как можно реализовать инкрементальную загрузку данных вместо пересчета всей таблицы?

Интересно услышать ваши идеи и мнения! 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍4🤔2👀2
#курсы
#путь_de

Завершена 8-я неделя обучения по Apache Spark! 🚀

Лаба 5 выполнена: Обрабатывал данные из JSON на HDFS и создавал матрицу клиентов и их действий в вебе с агрегатами. Важно было аккуратно работать с данными, чтобы всё правильно склеилось и дало корректные результаты.

Лаба 6 сдана почти впритык: Это был настоящий вызов! Задача состояла в продолжении сквозного проекта: подготовка признаков по клиентским логам. Тут было очень сложно, но рубеж для получения сертификата о прохождении пройден!

📊 Осталось 2 недели: Следующие 7 и 8 лабы — продолжение единого проекта. Будет особенно интересно коснуться обучения моделей и получения предсказаний по данным, поскольку тема не выдернута из контекста, а к ней плавно подводили на протяжении всего курса. Мы разворачивали большой pipeline, и теперь предстоит сделать следующий шаг — обучение моделей и получение предсказаний по данным. Это логическое завершение большого проекта, и я с нетерпением жду, что получится.

💥Очень надеюсь пройти еще две лабы и получить сертификат с отличием — курс оказался серьезным испытанием!

🔸Intro
🔸Итог 2 недель
🔸Итог 4 недель
🔸Итог 6 недель
🔥8👏4👍22🤡1