Использовал базовую VM в Я.Облаке (это совсем недорого).
— Download the latest runner package
— Extract the installer
— Create the runner and start the configuration experience
— Last step, run it!
— Все тулы нужно поставить на VM самостоятельно (либо взять boot disk за основу): Docker, git, curl, etc.
— Права. Нужно выдать права на чтение, запись и запуск (rwx), ловил ошибки, пока не выдал необходимые права
buildx failed with: ERROR: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied
— После завершения SSH-сессии, runner становится недоступен. Процесс нужно запустить как сервис через systemd. Configuring the self-hosted runner application as a service
— Имеем всю мощь Github Actions и набор поддерживаемых фичей
— Богатство решений и автоматизаций в Marketplace
— С замечательной документацией
— В качестве отличной замены динозаврам automation server типа Jenkins (и прочим подобным тулам)
— По цене базовой виртуалки
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍4🍓2🤩1
Скоро будет открыта сочная вакансия ко мне в команду в Wheely
— Двигаемся в сторону Near real time data sync: Debezium + Kafka
Источники: MongoDB, PostgreSQL, CockroachDB, Snowplow, Braze, etc.
— Tuning Snowflake + dbt - доводим до совершенства трансформации данных и DAG
— Semantic Layer + BI (Looker + Metabase) – метрики и показатели как код, в планах Cube
— DataOps + MLOps – управление Data Services, Code Quality, CI/CD, Observability
Поиск аномалий и отклонений в метриках и данных
Помогаем DS выводить модельки и управлять их ЖЦ
— Работать непосредственно со мной, буду обучать и отвечать на все вопросы
— Напрямую влияем на бизнес и показатели, общаемся с C-level guys
— Возможность предлагать новые подходы, тулы и сервисы
— По salary обид не будет точно
— Возможность поехать на Кипр (relocation support package!)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍8😱2
Доклады на Апрельском бигдатнике sql-ninja (Москва, 27.04)
Я готовлю practice-oriented доклад🔺 SQL + dbt = God Mode Data Modeling
☕️ Буду доступен для живого общения и нетворкинга:
— Мнения насчет Snowflake, dbt, Looker, Cube и других
— Консалтинг в сфере Data
— Обучающий цикл DMDA
🛡 Сам заинтересован в следующих докладах:
— Что правда из того, что говорят про Clickhouse
— Как отбалансировать десятки брокеров с миллионом rps с помощью Cruise-Control
— Airflow dbt integration
— Как мы расширяем возможности open-source решений на примере Arenadata DB
Регистрируйтесь: https://sql-ninja.ru/ticket/
До встречи!
🌐 @data_apps | Навигация по каналу
Я готовлю practice-oriented доклад
— Мнения насчет Snowflake, dbt, Looker, Cube и других
— Консалтинг в сфере Data
— Обучающий цикл DMDA
— Что правда из того, что говорят про Clickhouse
— Как отбалансировать десятки брокеров с миллионом rps с помощью Cruise-Control
— Airflow dbt integration
— Как мы расширяем возможности open-source решений на примере Arenadata DB
Регистрируйтесь: https://sql-ninja.ru/ticket/
До встречи!
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Data Apps Design
Помните пост 🚀 Ключевые метрики компании на дашборде - путь от hardcoded cube к live calculated measures?
Задача трансформировалась и для нее давно найдено красивое решение.
Планирую выступить на Апрельском бигдатнике sql-ninja (Москва, 27.04)
🔺 SQL +…
Задача трансформировалась и для нее давно найдено красивое решение.
Планирую выступить на Апрельском бигдатнике sql-ninja (Москва, 27.04)
🔺 SQL +…
🔥8❤3👍2
Data Apps Design
Ссылка на вакансию: Data Infrastructure Engineer
Стек, технические навыки и особенности описал в прошлом посте.
Локация: Кипр / Москва.
Дополнительно обращаю внимание на то, что нужен хороший английский язык.
We are looking for a Data Infrastructure Engineer to strengthen our Data Team at Wheely, proactively seeking and providing Business Users and Data Scientists with best-in-class and seamless experience.
Responsibilities
— Enhance Data team with architectural best practices and low-level optimizations
— Help refactor and improve codebase (dbt for data transformations, LookML for semantic layer)
— Support on evolving Data Integration pipelines (Airbyte, Debezium, Kafka), Database engines (Snowflake), BI tools (Looker, Metabase), reverse ETL syncs (Census)
— Cover up business units with feature requests / bugfixes / data quality issues
— Enforce code quality, automated testing and code style
Please open Telegram to view this post
VIEW IN TELEGRAM
Wheely
Working at Wheely
We’re looking for extraordinary people who can solve complex problems and thrive as part of an ambitious, talented team. Learn more about what it's like to work at Wheely.
⚡6🔥6
Everything you could ever know about dbt, all in one canvas.
Некоторое время назад получил письмо от Sales rep Count на тему демо их продукта. Стал изучать сайт и наткнулся на вполне приличный гайд в формате canvas по dbt и связанному с ним toolset, чем считаю необходимым поделиться.
Рекомендую тем кто изучает dbt, структурирует информацию, любит красивые визуализации а-ля mindmaps.
Из интересного, что я отметил:
— dbt core ecosystem
dev tools / data observability / documentation
— deployment
Environments / CI-CD / orchestration / testing
— suggested packages
useful dbt packages
— command syntax
commands, CLI flags, selection syntax
— dimensional modeling guide
design process, data modeling flow, normalization - denormalization
— dbt alternatives
К сожалению, потыкать на ссылки вам придется самим из canvas map / table of contents
Итого: неплохой ресурс, чтобы достаточно быстро войти в курс дела и при желании углубляться в конкретные темы.
Но считать, что вы знаете о dbt всё, просто посмотрев эти картинки я бы не стал 😄
Кое-что из этих материалов буду рассматривать на ближайшем запуске DMDA
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡9❤6🔥3👍1
— Бизнес-задача: Дашборд для Weekly Business Review (WBR)
— Решение «Hardcore Cube» 🗿
— Решение «Direct Runtime» 🦅
— Aggregate awareness (Looker) как оптимизация производительности
— Решение «Godlike modeling» 👑
— Как отразилась смена СУБД с Amazon Redshift на Snowflake на решении?
— Находите повторяющиеся паттерны и переиспользуйте код (DRY)
— Пишите универсальный код с dbt
— Не изобретайте велосипед - используйте packages
— Ищите баланс между материализацией и runtime queries
— Чем меньше кода, тем лучше
Слайды доклада: https://drive.google.com/file/d/1_KGuLGWksWBHz0SKUEOW1MO4Acxea0s3/view?usp=sharing
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
SQL + dbt = God Mode Data Modeling / Подходы к созданию витрины корпоративных метрик
На кейсе создания витрины корпоративных метрик рассмотрим:
— Элементы functional programming c dbt macros
— Интерактивный UX с dbt Power User + CLI
— Импорт и переиспользование кода с dbt packages
— Универсальный код и окружения с dbt adapters
Бизнес-задача:…
— Элементы functional programming c dbt macros
— Интерактивный UX с dbt Power User + CLI
— Импорт и переиспользование кода с dbt packages
— Универсальный код и окружения с dbt adapters
Бизнес-задача:…
👍9🔥6⚡2
Последнее время начал глубже погружаться в Superset – тул класса Business Intelligence для визуализации и дашбординга.
git clone --depth=1 https://github.com/apache/superset.git
export TAG=3.1.1
docker compose -f docker-compose-image-tag.yml up
Есть варианты с Kubernetes, PyPI
Выполняется как добавление русского языка в список доступных:
LANGUAGES = {
"ru": {"flag": "ru", "name": "Русский"},
"en": {"flag": "us", "name": "English"}
}Из коробки в Superset нет возможности подключиться к Clickhouse.
В моем случае, я выполнил скрипт установки в одном из контейнеров:
pip install clickhouse-connect
Возможно собирать готовые образы с предустановленными драйверами и пользовательскими конфигурациями.
Всё работает замечательно.
Cube показывает Postgres-подобный SQL API, который можно использовать в Superset из коробки.
.2% - доля в процентах до двух знаков после запятой), то вам придется задать METRICS (формула + название) и в Superset, т.е. по сути выполнить задать метрику дважды, что не очень хорошо.Почему Apache ECharts? Коротко:
— large library of visualization types
— high performance, ideally supporting canvas rendering
— powerful declarative API for customizing and theming charts
— internationalization support
— an active and growing community
Итак, порой у пользователей дашбордов возникают странные и на первый взгляд неосуществимые требования
— Применение особенного форматирования - stacked bar chart values alignment (center)
— Добавление строк, колонок в визуализацию (пустые строки-разделители Excel-like) - попробуем Custom CSS
— Новые (недоступные из коробки) визуализации - обратимся к библиотеке Apache ECharts
— Расширенное редактирование имеющихся графиков
Мне еще многое предстоит выяcнить в этих моментах, но учитывая наличие материалов, думаю, что это будет осуществимо.
— Многие вопросы находятся в поиске по ключевым словам
— Ранее не обсуждавшийся вопрос можно сформулировать и задать коллективному разуму
Не всё получается сделать сразу, быстро и просто. Но пока впечатления положительные.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍5🔥2👾1
Как устроен процесс разработки? Какие среды в наличии? Насколько быстро можно задеплоить изменения в прод?
Часто общаюсь с людьми на эти темы. От многих слышу о белых пятнах и несовершенствах в установленных процессах.
DEV: Изолированная среда для каждого члена команды с правами владельца
— Каждый пользователь - владелец своей среды (CREATE, INSERT, UPDATE, DELETE, DROP)
— Интерактивная разработка - написал код, создал объекты в БД, проверил, сделал коммит, повторил
— Люди не мешают друг другу - среды изолированы и независимы
— Тот же набор данных, только в масштабе (1:100)
TEST: независимые и беспристрастные автоматизированные проверки
— Осуществляется запуск для законченного объема работы (Pull Request)
— Sanity check: код работает и расчеты завершаются без ошибок
— Advanced testing: data quality, unique, not null, reference, etc.
— Без успешного завершения тестов код нельзя выводить в PROD
PROD: основная среда, которую используют company wide: DWH, Semantic layer, BI dashboards, Pipelines
— SLA - есть обязательства и ответственность перед пользователями и потребителями
— Любые изменения прошли все этапы проверки
— Важна производительность вычислений
— Покрытие тестами и ожиданиями позволит обнаружить отклонения и ошибки
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2⚡1🔥1
Data Apps Design
— Проще всего использовать единую СУБД и разделить ее на набор databases / schemas
— Среда - это лишь совокупность connection details + role + target schema
— В dbt это называется targets и задается в файле profiles.yml
— В зависимости от используемой среды вы хотите модифицировать тот или иной код
Вместо деталей для подключения используются переменные среды, которые задаются:
— Локально на компьютере пользователя в DEV
— В CI-инструменте (Github Actions) для TEST
— В Orchestration tool (dbtCloud) для PROD
Полностью по ссылке: https://gist.github.com/kzzzr/02d4f1f86d19df9c90210b177a561406
{#- prepare expression to limit rows depending on target.name and flags provided -#}
{%- if target.name in ['prod'] and history_depth_days > 0 -%}
{%- set watermark = 'DATEADD(days, ' ~ -1 * history_depth_days ~ ', CURRENT_TIMESTAMP::DATE)' -%}
{%- set history_depth_expression = timestamp_column ~ ' >= ' ~ watermark -%}
{%- elif target.name not in ['prod'] and limit_data_for_dev == true -%}
{%- set watermark = 'DATEADD(days, ' ~ -1 * var('data_tests_depth_days') ~ ', CURRENT_TIMESTAMP::DATE)' -%}
{%- set history_depth_expression = timestamp_column ~ ' >= ' ~ watermark -%}
{%- else -%}
{%- set history_depth_expression = '1 = 1' -%}
{%- endif -%}
{#- prepare final filter expression -#}
where 1 = 1
and {{ deleted_rows_expression }}
and {{ history_depth_expression }}- name: timezone
tests:
- dbt_utils.not_null_proportion:
at_least: 0.95
severity: "{{ 'error' if target.name in ('prod') else 'warn' }}"
{{
config(
materialized='table',
snowflake_warehouse='WH_LARGE' if target.name == 'prod' else target.warehouse
)
}}on-run-end:
- "{% if target.name == 'prod' %}{{ dbt_artifacts.upload_results(results) }}{% endif %}"
— Все пользуются одними и теми же исходными наборами данных (data sources) - исключены расхождения и несогласованность
— Zero effort - не нужно создавать среды как отдельные инстансы, разворачивать ПО, копировать датасеты и следить за актуальностью
— Один проект = один репозиторий с кодом
— Разница поведения и конфигураций для разных сред легко поддерживается с помощью шаблонизации Jinja SQL
— Это экономически выгодно и целесообразно. Используя Snowflake вообще perfect, т.к. у вас decoupled storage & compute, при этом compute unlimited
— Это быстро и безболезненно с точки зрения поставки кода и Time2Market
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥5👏1
Привет! Последние пару недель плотно работаю над настройкой Data Pipelines через Debezium + Kafka Connect.
— Sources: MongoDB, Postgres
— Source connectors: Kafka Connect + Debezium (CDC)
— Kafka as intermediate storage
— Sink connector: Snowflake connector for Kafka (Snowpipe streaming)
— Snowflake as destination
Упражнения, которые я проделываю:
Вообще, готовые образы есть от: Confluent / Debezium / Strimzi.
Я пока использую образы от Debezium + Strimzi. Модифицирую, добавляя нужные мне коннекторы указанных версий (JAR-файлы).
У Strimzi есть операторы для K8s, которые я планирую использовать.
А вот K8s deployment от Confluent входит в Enterprise plan и подлежит лицензированию.
Выбрал несколько несложных коллекций для тестирования и дебага.
Несложные, потому что:
— Небольшое количество колонок
— Минимальное количество вложеных nested-структур
— При этом частые обновления - получаю лог изменений CDC сразу.
— Глазами можно отследить все применяемые изменения (либо то, что не получается)
На выбор у меня было 2 Connectors:
— MongoDB Kafka Connector
— Debezium connector for MongoDB
Несмотря на наличие отличной документации и даже поддержку snapshot с учетом фильтра (например, sync истории только за 1 год), выбор сделан в пользу Debezium Connector. Позже подробно напишу доступные возможности и пример конфигурации.
В каждое событие дополнительно пишу ряд метаданных:
—
ts_ms = metadata timestamp—
op = c (create), u (update), d (delete), r (snapshot)— Topic route: Мессаджи направляю сразу в топики с целевыми названиями таблиц в Snowflake.
— New Document State Extraction: этат трансформация позволяет перейти от сложного и детального формата события Debezium (schema, before, after) к упрощенному виду (только after), который мне и нужен в Snowflake.
Развернул devcontainer (docker-compose based), установил kcat + jq.
Использую kcat для просмотра топиков, key-value значений, оффсетов.
jq использую для форматирования ответов от REST API (Kafka Connect).
Очень удобно проконтролировать изменения, которые вношу пунктом ранее.
— Externalizing secrets
— Create a sink connector (Snowflake)
— Set up monitoring (Prometheus + Grafana)
— Use AVRO data format (
io.confluent.connect.avro.AvroConverter)— Configure topics (compact + delete, etc.)
— Configure incrmental snapshots loads via Debezium signals
— Ensure PII data masking (message transformations, connector configuration)
— Add HTTP bridge / REST proxy
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥9🔥6❤5⚡3
Вы создали VM, разместили на ней свои сервисы в Docker, запустили, сервисы (например, Kafka + Kafka Connect) начали писать данные.
Вдруг вы обнаруживаете, что disk volume заканчивается.
df -h
Что делать? Как перенести Docker Volumes и избежать ошибки Disk full?
— Добавить новый Filesystem, на котором будет достаточно места
— Остановить контейнеры
— Отключить Docker services
— Unmount docker overlay filesystems
— Перенести данные в новый раздел
— Внести изменения в конфигурационный файл Docker daemon.json
— Включить Docker services
— Запустить контейнеры
# Stop Docker containers
docker compose stop
# Stop Docker services
systemctl stop docker
systemctl stop docker.socket
# Unmount docker filesystems
umount /var/lib/docker/overlay2/*/*
# Move data
mv /var/lib/docker/ /mnt/${DESTINATION}/
# Edit Docker service configuration file:
nano /etc/docker/daemon.json
# Add or modify the data-root configuration option to point to the new directory:
{
"data-root": "/mnt/path/docker"
}
# Save and close the file.
# Start the Docker service:
systemctl start docker
systemctl start docker.socket
# Start Docker containers
docker compose start
Также этот скрипт на Github Gist: https://gist.github.com/kzzzr/fef4c9c88f301c282275e6d451e080f5
Это сработало для меня, и должно сработать для вас.
В частности, это помогло мне расширить дисковое пространство на VM, и позволило Docker писать в новую Filesystem БЕЗ повторного запуска full sync истории по 100+ коллекциям MongoDB (Debezium Connector + Kafka topics).
Please open Telegram to view this post
VIEW IN TELEGRAM
Gist
Docker: move persistent volumes (mounts) into another filesysytem WITHOUT data losses
Docker: move persistent volumes (mounts) into another filesysytem WITHOUT data losses - docker.md
👍16🔥3⚡1🥱1
Салют! Вчера осознал тот факт, что я в основно пишу сухие технические тексты, которые во многом отражают аспекты моей текущей деятельности, но игнорируют стратегическое видение.
Есть мнение, что существуют гораздо более актуальные темы, которые читатели хотели бы услышать и обсудить. Среди тех, на которые я хотел бы высказаться:
Please open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Poll
24%
ЕСТЬ NRT / STREAMING; ЕСТЬ необходимость или бизнес-обоснование (есть NRT-задача и она решается)
11%
ЕСТЬ NRT / STREAMING; НЕТ необходимости (просто хочется минимальное отставание)
19%
НЕТ NRT / STREAMING; и ЕСТЬ необходимость (есть NRT-задача и она пока не решена, но хочется)
46%
НЕТ NRT / STREAMING; и НЕТ необходимости (устраивает подход BATCH)
Рекомендую для структурирования и систематизации знаний:
— Источники данных
— Выгрузки и обращения по API
— Основы моделирования
— Витрины данных и визуализации
— Семантический слой
— There and back again 😏
Всё это с аллегориями и захватывающими иллюстрациями.
Всем, кто любит Средиземье и вселенную LoTR это особенно понравится.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Примерный список атрибутов:
— Source (Mobile Apps Events)
— Type (JSON files)
— Way of data integration (S3 table engine)
— Description (Events tracked in Mobile Apps, single file for each event)
Мой пример:
— Sources
— Staging
— Intermediate
— Analytics (dims / facts)
Ноды dbt (включая модели) можно окрасить в разные цвета на графе:
staging:
+docs:
node_color: "#219EBC"
models:
<resource-path>:
+docs:
show: true | false
{{ doc() }}: Переиспользование блоков документацииВ целом, большие блоки документации стоит вынести в отдельные markdown-файлы. Возможно, с картинками и схеми.
Также имеет смысл один раз описать атрибут (колонку), который присутствует в 1+ моделях, и впоследствие ссылаться на его описание:
models:
- name: events
description: '{{ doc("table_events") }}'
Рекомендую грамотно использовать title page и разместить на нем самую важную информацию:
— Используемые инструменты и сервисы
— Архитектурная схема
— Описание источников данных
— Ссылки на JIRA (task trackers), Wiki pages, Operational systems, Contacts (@), etc.
{% docs __overview__ %}
## OVERVIEW
## INFRASTRUCTURE SCHEMA
## TOOLS USED
## DATA SOURCES
## USEFUL LINKS
{% enddocs %}Т.к. сайт статический, его достаточно разместить в Object Storage с поддержкой Static website hosting:
— Host on Amazon S3 (optionally with IP access restrictions)
— Publish with Netlify
— Use your own web server like Apache/Nginx
Чтобы вебсайт всегда отражал актуальное состояние, необходимо после каждого изменения в код (Merge Request), генерировать и загружать новую версию.
Делать это можно с помощью Github Actions или аналогов, автоматизируя действия:
—
dbt docs generate—
aws s3 sync ./target s3://my-website-bucket/Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Data Apps Design
🟡 Дайджест самых интересных публикаций по темам:
Data Integration
— ▶ Успешный SaaS на рынке Аналитики – cтановление и планы развития / Алексей Сидоров из mybi connect
— 👨💻 Сказ о том как я realtime replication чинил (Kafka + Debezium + Clickhouse)
—…
Data Integration
— ▶ Успешный SaaS на рынке Аналитики – cтановление и планы развития / Алексей Сидоров из mybi connect
— 👨💻 Сказ о том как я realtime replication чинил (Kafka + Debezium + Clickhouse)
—…
🔥22👍7❤1⚡1😱1