Data Apps Design
1.54K subscribers
143 photos
2 videos
41 files
231 links
В этом блоге я публикую свои выводы и мнения на работу в Data:

— Data Integration
— Database engines
— Data Modeling
— Business Intelligence
— Semantic Layer
— DataOps and DevOps
— Orchestrating jobs & DAGs
— Business Impact and Value
Download Telegram
👑 Особенности работы с External Data (на примере обменных курсов валют)

⬜️Бизнес-задача:

— Операции с контрагентами совершаются в около 15 разных валют

— Есть необходимость пересчета финансовых показателей в разные валюты для отчетности

— Обменные курсы актуальны на каждую отдельную дату (курс меняется)

⬜️ Реализация:

— Используется поставщик данных и его API (для примера это Open Exchange Rates)

— Ежедневно несколько раз в течение дня (раз в 3 часа) делаются запросы на получение обменных курсов к каждой из 15 валют (Airflow)

— Ответы в виде JSON сохраняются AS IS в S3 / Object storage

— Эти файлы читаются на стороне DWH и формируется витрина обменных курсов (пар) в разрезе базовой валюты и даты

⬜️ Ключевые моменты, на которые стоит обращать внимание:

🟡Case sensitive identifiers

Трехбуквенных код валюты указывается в верхнем регистре. Учитывайте это при чтении данных, иначе получите NULLs вместо рейтов.

В случае Redshift + dbt я добавляю hooks:

pre_hook=["SET enable_case_sensitive_identifier TO TRUE"],        
post_hook=["SET enable_case_sensitive_identifier TO FALSE"]


🟡Корректность файлов JSON содержащихся в S3

Порой ответы от API сервиса приходят с ошибкой, например:

<html>
<head><title>504 Gateway Time-out</title></head>
<body>
<center><h1>504 Gateway Time-out</h1></center>
</body>
</html>


Такие файлы, даже находясь среди корректных, могут вызывать ошибки чтения:

ERROR: Spectrum Scan Error
Detail:
-----------------------------------------------
error: Spectrum Scan Error
code: 15001
context: Error while reading next ION/JSON value: Invalid syntax. File: /dwh/currencies/2024-01-14-CHF-2024-01-14-08-15-10-UTC.json Offset: 0 Line: 1


🟡В рамках одних суток актуален последний курс

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

Я делаю эту пометку и фильтр на нее с помощью window function:

SELECT

...

, (ROW_NUMBER() OVER (PARTITION BY base_currency, business_dt ORDER BY business_ts DESC) = 1) AS is_most_recent

...

WHERE ...
AND is_most_recent


🟡 Чтение огромного числа маленьких файлов

Требует гораздо большего количества времени нежели чем чтение одного (относительно) большого файла.

Поэтому, рекомендация:

— Делать compaction / merge файлов (сливать множество маленьких в один большой, например, раз в месяц)
— Выполнять загрузку в момент появления нового файла

С этим могут помочь инструменты типа EL SaaS (Hevo, Fivetran), или встроенные в СУБД возможности (Snowpipe для Snowflake)

Дайте знать, если полезно ⭐️

#s3 #object_storage #dwh #dbt #external_data

🌐 @data_apps | Навигация по каналу
Please open Telegram to view this post
VIEW IN TELEGRAM
👍173
Как выбрать СУБД для аналитики?

Привет! Предположим, что у вас есть:

🟢 Целостное понимание потребностей бизнеса

Включая требования к производительности, времени отклика, безопасности данных, перечень ключевых метрик (показателей) и формулы их расчета, и т.д.

🟢 Возможность предлагать и оценивать альтернативные СУБД для решения задач бизнеса

Объективно, в заданных условиях, некоторые СУБД способны справляться значительно лучше других. Иначе говоря, имеют конкурентные преимущества.

К сожалению, во многих случаях решение о том, какую СУБД использовать уже принято и не подлежит пересмотру: кем-то когда-то давно до вас по принципу "я работал с этим 5 лет назад", "у нас с ними партнерские отношения", "в компании есть экспертиза по (ms sql)".

#database #pricing
Please open Telegram to view this post
VIEW IN TELEGRAM
Как выбрать СУБД для аналитики? Мой список критериев для выбора Analytics Database

🔵Performance and Scalability

— Работа в периоды пиковых нагрузок (одновременные запросы от EL + dbt + BI + analysts)
— Поддержка масштабируемости и scaling
— Насколько адекватно время ответа на запросы (от простых select * from table limit 10 до сложных дашбордов)

🔵Feature support

— Поддержка semi-structured data (nested JSONs, MongoDB, event tracking)
— Geospatial: GEO-joins (ST_Intersects), H3 library for geo-indexing
— Адекватная поддержка Window functions (+ Qualify)
— Простое создание окружений (Zero copy clone - DEV, TEST sandboxes)
— Time travel, restore deleted data (UNDROP)

🔵Security

— PRIVILEGES management (roles, users, groups, RBAC)
— Privacy: column/row level security, Data Masking
— 2FA access
— Security certified

🔵Maintenance and Administration

— Усилия на администрирование: install, upgrade, scale, assign AWS roles, monitoring
— Наличие удобных интерфейсов для мониторинга (Web UI)
— Introspection: metadata and database statistics

🔵Integrations and Ecosystem

— Интеграция с dbt: dbtCore / dbtCloud, dbt packages support, Semantic layer
— Наличие Data Hub: exchange rates, market data (trends, financial)
— В целом наличие и доступность интеграций с другими инструментами: EL, BI, reverse ETL, etc.

🔵Pricing model

— Модель ценообразования: Serverless / Reserved nodes / ...
— Примерный порядок расходов: Total Cost of Ownership
— Прозрачная статистика по расходам
— Возможность оптимизировать эти расходы (менять что-то и видеть результаты)

В ближайшие недели у меня запланирован финальный transition с Amazon Redshift в Snowflake. Напишу об этом опыте и результатах.

💬 Какую СУБД используете вы и какие были критерии выбора?

#database #pricing

🌐 @data_apps | Навигация по каналу
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍2
О чем этот блог?

🔻 Меня зовут Артемий Козырь.

У меня 10+ лет опыта на проектах, связанных с DWH и Data в крупных компаниях: PwC, Moscow Exchange, Sber, Sibur, Wheely.

В этом блоге я публикую свои выводы и мнения на разные аспекты сферы работы с Data:

— Data Integration
— Database engines
— Data Modeling
— Business Intelligence
— Semantic Layer
— DataOps and DevOps
— Orchestrating jobs & DAGs
— Business Impact and Value

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

Мои ресурсы:

YouTube
[Designing Modern Data Apps]
Github
Habr
LinkedIn

Вопросы и предложения @kzzzr

🌐 @data_apps
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍86
Data Apps Design pinned «О чем этот блог? 🔻 Меня зовут Артемий Козырь. У меня 10+ лет опыта на проектах, связанных с DWH и Data в крупных компаниях: PwC, Moscow Exchange, Sber, Sibur, Wheely. В этом блоге я публикую свои выводы и мнения на разные аспекты сферы работы с Data: —…»
Channel name was changed to «Data Apps Design»
🟡 Дайджест самых интересных публикаций по темам:

Data Integration

Успешный SaaS на рынке Аналитики – cтановление и планы развития / Алексей Сидоров из mybi connect
👨‍💻 Сказ о том как я realtime replication чинил (Kafka + Debezium + Clickhouse)
👑 Особенности работы с External Data (на примере обменных курсов валют)
🏆 Удержать стоимость SaaS ELT на уровне $13K / year вместо повышения цены в 2,35 раза
👀 Где взять динамический датасет для целей тестирования?
⚡️ Real time replication работает как в сказке! Но всё далеко непросто
⚙️ Clickhouse is advancing at data integration
Важнейшие критерии при выборе Extract – Load решения для интеграции данных в DWH
Extract - Load как сервис и как собственное решение. Поиск баланса и дзен

Database engines

🟢 Snowflake Cost Management
❄️ Финализирую Redshift to Snowflake transition
Как выбрать СУБД для аналитики? Мой список критериев для выбора Analytics Database
❄️ Наступает время Snowflake
❄️ Snowflake - перспективный лидер, и я ищу подводные камни
⚡️ I have run a Proof of Concept with Redshift Serverless

Data Modeling

SQL + dbt = God Mode Data Modeling / Подходы к созданию витрины корпоративных метрик
🔳 The Ultimate Guide to dbt
🙂 Переварил и делюсь ключевыми идеями Tristan Handy (CEO dbtLabs) о новом опыте работы с dbt
Что делать если в СУБД отсутствуют необходимые функции и преобразования?
🚀 Ключевые метрики компании на дашборде - путь от hardcoded cube к live calculated measures
Моделирование отчета для BI в виде сводной таблицы со сравнением периодов
Работа с ГЕО-данными в DWH: координаты, зоны, агрегация
Зрелость DBT-проекта. Есть, куда расти?
Стратегия инкрементального наполнения витрин: необходимость, реализация, подводные камни

Business Intelligence

Apache Superset — продолжаю использовать и приятно удивлен
Business Intelligence 101: Всё самое важное о BI инструментах
👀 Продлеваю контракт с Looker (Annual Contract Renewal)
🔼 Aggregate awareness
Хочу 100 графиков на дашборде и чтобы отображались за 10 секунд
🙂 Datalens в Open Source

Semantic Layer

😒 dbt Semantic Layer - сплошное разочарование
⚡️ Replacing Looker with Cube + Superset
Семантический слой для Аналитики ключевых метрик – dbt Metrics vs. Cube
Аналитика ключевых метрик компании: dbt Metrics / Cube.js / LookML

DataOps and DevOps

🙂 Могли бы покритиковать архитектуру Data Stack?
😎 Уже более полугода использую Census App для задач reverse ETL
Why I use dev containers?
💎 Операционализация аналитики c инструментами класса reverse ETL – опыт использования Census

Orchestrating jobs & DAGs

🔸 Развернул Self-hosted runner for Github Actions
🔺 Рецепт Airflow DAG - а так ли правильно мы его готовим?
⚙️ Добавить логику повторных попыток retry в оркестрацию расчетов DAG
Мои рекомендации по альтернативам (для оркестрации dbt jobs)
Оркестрация dbt jobs для Dev, Test, Prod без головной боли

Business Impact and Value

🤯
Нерелевантные, демотивирующие и бессмысленные задачи
Вебинар Сквозная аналитика + Modern Data Stack
Single Person Team в Data Engineering
Cчитаю, что чем выше уровень maturity в компании, тем меньше должен быть sum of data work.
🚀 Released myBI dbt Core and myBI Market showcase
🚀 Аналитика продуктивности команд разработки на основе данных Github
End-to-End решение для аналитики на примере источника MaestroQA

Learning

Первый дебютный запуск серии вебинаров Designing Modern Data Apps завершился!
🟢 [Designing Modern Data Apps] Цикл вебинаров
💰 Подписка на ресурсы издательства O'Reilly - одно из самых выгодных вложений
👀 Как вы структурируете свои мысли?


🌐 @data_apps | Навигация по каналу
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍621
Data Apps Design pinned «🟡 Дайджест самых интересных публикаций по темам: Data Integration — Успешный SaaS на рынке Аналитики – cтановление и планы развития / Алексей Сидоров из mybi connect — 👨‍💻 Сказ о том как я realtime replication чинил (Kafka + Debezium + Clickhouse) — 👑»
Когда у меня проблемы с интернетом, первый сайт, на который я захожу, чтобы проверить наличие подключения - ya.ru

Когда-то это была просто строка ввода фразы для поиска на белом фоне. Даже помню - "Яндекс для аскетов".

Шли годы, что-то менялось в Яндексе, и сегодня страничка выглядит так:

P.S. Интернет дали, но внутри я уже не в первый ловлю себя на мысли "вдруг отключили весь западный сегмент интернета" 🤔
👍4
🔺 Рецепт Airflow DAG - а так ли правильно мы его готовим?

#orchestration

За многие годы Airflow стал де-факто стандартом в области управления цепочками взаимосвязанных задач.

Хотя сам инструмент позиционируется как полноценное решение для построения пайплайнов данных, мною он всегда рассматривался только как оркестратор (дирижер, раздающий задачи). Решать эти задачи мною призывались специализированные инструменты:

— Processing: curl, jq, awk, sed
— File storage: S3, MinIO
— Transformations: dbt + DBMS (Clickhouse, Snowflake, ...)
— Alerts: Slack, Telegram


🔺 Дам пример: перед нами задача — регулярно получать выгрузки из REST-сервиса для аналитики в Clickhouse.

Вся соль DAG в том, какими инструментами и набором шагов мы решим эту задачу. Сравните

Подход #1:

20 разных endpoints (справочники, факты)
— DAG с PythonOperator на каждый endpoint, request с обработкой ответа
— Вставка результата (JSON) в MongoDB как документ
— Создание целевых таблиц в Clickhouse (SQL = CREATE TABLE ...)
Предобработка данных (типы, название колонок, порядок), возможно в pandas
— Вставка в целевые таблицы (INSERT loop = медленно)

И подход #2:

Однострочный bash-скрипт с параметрами curl ${ENDPOINT} | jq | s3 copy ${S3_BUCKET_PATH} -
Конфиг в yaml с параметрами для 20 endpoints
— Генерация DAG по шаблону BashOperator на основе yaml config
— Запись результатов в стиле Extract - Load в S3
— Чтение из Clickhouse с использованием S3 table engine (с чтением схемы schema inference)


🔹 В качестве критериев для сравнения используйте:

Простота конфигурации и гибкость (endpoint: добавить, убрать, применить фильтр, записать в другой S3 bucket, выполнить полный пересчет)
Быстрота (скорость работы, устойчивость к росту объема данных)
Принцип EL = все трансформации в DWH (никаких трансформаций вне DWH)
Устойчивость к изменениям и проблемам (какие точки отказа? сколько их?)
— Поддержка Schema Evolution (меняются атрибуты, типы данных в выгрузке - будет ли ошибка? требуются ли ручные действия?)


Хочется разразиться целой публикацией на Хабр на этот счет: обзор возможностей, эволюция развития инструмента, лучшие практики (и плохие тоже) и их рационализация. Дайте реакций, и это случится.

🔻 А что вы думаете насчет Airflow и рецептов DAGs? Какого подхода придерживаетесь?


🌐 @data_apps | Навигация по каналу
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍94
Первый дебютный запуск серии вебинаров Designing Modern Data Apps завершился!

#learning

(на самом деле уже пару недель назад 😝)

Результаты:

15 участников в закрытом канале
10 live стримов на YouTube
Сквозной проект на датасете, приближенном к реальности
Общение с единомышленниками, ответы на вопросы в QA sessions
Инфра в лучшем облаке РФ + индивидуальные гранты
— Single Github repo, прираставший с каждым новым стримом

Мои ощущения:

— Благодарен за опыт сотрудничеству с различными обучающими платформами (4+ года)
— Но безумно рад наконец запустить свой продукт, в котором я принимаю основные решения 😎
— Максимально ответственно подошел к подготовке программы и контента, плотность зашкаливает 💻
— Научился стримить с OBS, создавать и переключать сцены ▶️
— Создал шаблон слайдов с брендированием ◻️
— Впереди еще много рациональных идей, которые хочется воплотить


В марте я планирую новый запуск.

🔘 Резерв места: https://forms.gle/DcL96jDWx728tTyH7


🌐 @data_apps | Навигация по каналу
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥187
👨‍💻 Сказ о том как я realtime replication чинил (Kafka + Debezium + Clickhouse)

Считайте, что это Incident Postmortem


🔴 Итак, input: Данные в таблице заказов застряли на вчерашней дате, свежих заказов в базе нет.


🔴 Шаги по решению проблемы:

— Проверяем таблицы в Clickhouse, действительно последняя дата - вчера

— Делаем сверку с таблицей источника данных - последний заказ несколько минут назад

Вывод: что-то не так с репликацией данных

— Смотрим в Kafka на topic offsets

start:3752136
end:3884660
offset:3869357
lag:15303


О нет, накоплено отставание в 15К записей, и оно продолжает расти! В чем дело?

Либо не хватает мощности (bottleneck) для записи в Clickhouse. Либо что-то с самим подключением (коннектором).

— Подключаемся на VM на которой развернут Debezium connector и смотрим лог

В логах сервиса (контейнер) вроде ничего подозрительного, при просмотре последних сообщений ошибок нет.

— Смотрим статус коннектора

curl http://localhost:8083/connectors/clickhouse-jdbc-sink/status | jq


Видим огромное, сложно воспринимаемое сообщение о статусе, в котором взглядом выцепляю failed: Connection refused

— Делаем restart коннектора (вместе с tasks!)

curl -X POST http://localhost:8083/connectors/clickhouse-jdbc-sink/restart?includeTasks=true | jq


Есть! Через несколько секунд проблема решена.

Коннектор работает, отставание (оффсет) обнулилось, данные в Clickhouse появились.


🔴 Выводы:

1. Всегда что-то может пойти не так, и заранее неизвестно что, где и когда.
2. Поэтому необходимы инструменты мониторинга:

— Общая нагрузка на систему CPU / Memory / Disk (identify bottlenecks)
— Потребление ресурсов в разрезе сервисов (Debezium connectors, Kafka, Clickhouse)
— Healthchecks - периодические проверки статуса и работоспособности сервисов
— Своевременные уведомления о возникающих проблемах (errors, connection lost, etc.)

Продолжаю работу.

💬 Сталкивались с ситуациями, когда мониторинг выручал? Какие инструменты могли бы советовать?


🌐 @data_apps | Навигация по каналу
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍4🔥2
👀 Записали интервью-обсуждение с Алексеем из myBI Connect.

— Путь становления одного из самых популярных сервисов SaaS аналитики в РФ

— Что представляет из себя сервис изнутри? Самые популярные коннекторы

— Белые пятна и пробелы на рынке. Запросы клиентов, тренды

— Жизнь после санкций. Переезд в Y.Cloud. Будущее PowerBI. Трудности и бенефиты

— Планы экспансии. Ликбез и культура данных. Продвинутые аналитические паттерны в легкой доступности

🔥 Дайте реакций! Скоро релиз!

🌐 @data_apps | Навигация по каналу
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥137👎1
PowerBI и Azure в РФ всё!

Дорогие клиенты, вам даем времени 5 дней на offboarding, дальше сами.

Не удивлен, не расстроен, но воодушевлен.

Никогда не любил PowerBI в силу ряда причин:

— Нет клиента для Mac / Linux
— Нет версионирования (вроде что-то завезли, но это не полноценный git)
— Всё необходимо щелкать мышью 🟦
— Какие-то сложносочиненные навороты с DAX / MDX, погружаться в которые нет желания
— Gateways и прочие сложности с публикацией и регулярным обновлением 🟦
— И конечно же тесная связь с Microsoft и их софтом

💠 Проведу 1-2 короткие консультации БЕСПЛАТНО насчет миграции из PowerBI / Azure в новый мир:

— RU Clouds: Y.Cloud / Cloud.ru
— EL: Kafka + Debezium, Airbyte (Connectors)
— Database: Clickhouse / Greenplum / Starrocks
— Transformations: dbt (SQL code)
— Semantic layer: Cube
— BI: Superset / Metabase / Datalens
— Orchestration: Airflow / Dagster / Prefect
— Monitoring: Prometheus, Grafana

Напишите мне в ЛС @kzzzr:

— Для чего вы использовали PowerBI
— Какие у вас источники данных
— Какие объемы данных
— Примерный перечень и сложность расчета метрик (показателей)
— Комментарий по срокам и необходимости видеть актуальные отчеты

🌐 @data_apps | Навигация по каналу
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍3🤡3🤯1🌚1
❄️ Финализирую Redshift to Snowflake transition

Да! Процесс длился с Июля 2023 с разной степенью интенсивности, но я сделал это.

Чеклист коротко:

🔵 Data Integration (EL)

— Create WH and user for EL (Hevo)
— Create empty schema landing
— Create EL pipelines from scratch (Hevo)
— Configure EXTERNAL STAGES and TABLES
— UNLOAD from Redshift (S3 Parquet) and COPY into Snowflake full history of largest tables

🔵 Data modeling with dbt (T)

— Create distinct WH for workloads: EL, T, DEV, BI, CI
— Set up Resource monitors for credit usage
— Adapt dbt project to Snowflake syntax
— Configure essential dbt packages
— Adapt JSON parsing code to LATERAL FLATTEN
— Enable Carto extension (H3 indexing + geo-joins)
— Snapshots for most dimensions
dbt build --full-refresh
— Optimize warehouse size dynamically for heavy models

🔵 Orchestration

— Set up dbtCloud jobs
— Configure Slim CI job

🔵 Data serving

— RBAC: Roles, Users, Groups, Privileges
— Connect Snowflake to Looker and Metabase
— Test Dashboards
— Connect reverse ETL, Jupyter, Airflow to Snowflake

🔵 Paperwork

— Launch procurement process with Vendr
— Notion Page on Snowflake transition
— JIRA tasks, approvals, 30+ emails

🟣 Наблюдения:

— Всё работает красиво и довольно шустро
— Радует то, что я разделил все нагрузки на разные Warehouses
— Для сложных моделей dbt и full-refreshes я динамически назначаю более мощные WH
— Snowflake очень удобная СУБД, всё сделано для людей, включая UI
— Много простых и крайне полезных мета-команда (SHOW, DESCRIBE, USE, LIST, ...)

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

А пока можете поздравить меня.

🌐 @data_apps | Навигация по каналу
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍121
🟢 Snowflake Cost Management

Активная фаза transition завершена, самые острые проблемы и вопросы решены, сломанные дашборды и интеграции исправлены.

И первое, на что хочется обратить внимание – это траты.
Пока рано делать полноценные выводы, но давайте посмотрим на факты:

— Кластер Amazon Redshift из 2 x ra3.4xlarge nodes обходился примерно в $3700 / мес. (~ $925 / нед. ~ $125 / день)

— Траты Snowflake за неделю 19 - 26 марта составляют ~ $760 (на картинке)

При этом:

— 20 марта – подготовка к transition, запуски dbtCloud jobs
— 21 марта – день, когда я полноценно переключил все нагрузки на Snowflake и делал history backfill (COPY / INSERT) + full-refreshes (повышенные траты)
— 23-24 марта – выходные
— 25 марта – пользователи начинают находить ошибки, выпускаю фиксы и делаю full-refreshes
— 26 марта – день в разгаре

Ключевые выводы:

✔️Однозначно, разделение запросов и пользователей (workloads) на разные Virtual Warehouses - это преимущество

✔️Конфигурация и настройки прямо влияют на производительность и расходы. SCALING_POLICY / SCALING_POLICY / STATEMENT_TIMEOUT_IN_SECONDS / MAX_CONCURRENCY_LEVEL / etc.

✔️Оптимизация становится дико интересной игрой, когда она четко привязана к метрике (💵)

✔️Стали доступны продвинутые инструменты Мониторинга: dbt Artifacts, Snowflake Cost Management, Resource Monitors

✔️Правильное расписание (scheduling) имеет значение - делай расчеты и запуски только тогда, когда это необходимо

✔️Выбор Warehouse size – решение уравнения с переменными время исполнения и стоимость

✔️Мой dbtCloud setup стал значительно проще (набор jobs и их конфигурация, на картинке)

✔️Явный эффект для крупных таблиц имеют Cluster keys (упорядочивание записей в micro-partitions, что-то типа индекса)

— Первая неделя использования Snowflake внушает оптимизм относительно того, что траты, возможно, будут немного меньше, чем на Redshift, при всех полученных преимуществах

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

Я продолжаю экспериментировать и постепенно внедрять и другие отмеченные мной Snowflake features.

🌐 @data_apps | Навигация по каналу
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔21❤‍🔥1💯1