Как стать автором
Обновить

Потери данных при репликации в аналитическое хранилище — автоматические сверки и мониторинг качества данных

Время на прочтение9 мин
Количество просмотров5.6K
Всего голосов 16: ↑16 и ↓0+16
Комментарии27

Комментарии 27

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

Мы пока не преисполнились настолько, чтобы писать тесты на тесты, но всё же сверки это проще, чем целый пайплайн данных. Начиная с того, что проблемы могут возникать в отправке данных из продуктов, а исходной табличке мы верим изначально. В целом по запросам аналитиков и ручным действиям новых проблем, которые бы не показали сверки, найдено не было, поэтому пока нет причин им не доверять.

К тому же за трансформацию и отправку данных в Clickhouse у нас отвечают сервисы, написанные на Benthos (он позволяет в декларативном стиле на yaml-е описать правила трансформации), что совсем не похоже на сервис на Python. Поэтому разница в подходах помогает подсветить все несовпадения.

а что делать с тем что при изменении логики пайплайна - тесты сами автоматически не меняются?

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

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

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

Не более ресурсоемко, чем руками каждый поток данных сверять, учитывая что их со временем все больше становится, а новую сверку на обкатанном подходе добавить достаточно легко.

Причин для расхождений может быть много - например в столбце updated_at/modified_at не всегда актуальная дата приходит - надо разбираться, почему. Либо статусы заказов при отправке в шину маппятся не так как ожидается. Либо с форматом данных накосячили. Тут при желании можно на отдельную статью материала набрать :)

Насчет датасетов не совсем понял идею, привести данные к одному виду все равно придется, но было бы интересно узнать, если у вас есть альтернативное решение

Мы пробовали контролировать путем вычисления некоторой функции свертки на одной стороне, и ее сравнения с такой же функцией на другой (контрольная сумма). Знаете, в чем проблема? Что пока сумма совпадает — все хорошо. А как только она расходится — становится совершенно невозможно понять, что именно не совпадает. То есть, функция должна быть не какая попало, а должна позволять диагностировать, в какой колонке расхождение. А при наличии нетривиальных типов данных (у автора есть json в колонках, а у нас просто есть различия в поддерживаемых типах данных на двух сторонах, скажем, timestamp with timezone где-то есть, а где-то его нет) становится совсем нетривиально, и проще иметь дело с самими данными — там хотя бы видно, где не совпало.

И еще, контрольная сумма или распределения — это тоже далеко не бесплатно с точки зрения ресурсов (особенно когда таблицы большие). И потом, они снова вам не показывают, что именно различается. Ну так, для примера, вот автор пишет: «Базу из миллиардов записей никто не пытается сверить напрямую.». Вообще говоря, на базе из миллиарда даже простой count(*) это далеко не бесплатно может оказаться, и не быстро. Быстро — это только из статистики можно взять, а статистика — она по определению может быть не актуальна.

ну так идеальная проверка будет такой же сложности как и исходный ETL - и работать столько же времени :)

В нашей компании сам ETL на самом деле достаточно ограниченный, это скорее доставка до stage-слоя сырых данных, с адаптированной структурой под хранилище. Основная трансформация происходит на слое витрин, но в этот момент мы уже имеем информацию о качестве этих данных.

так а качество витрин вы чтоли не проверяете??

Сами же пишете: "только десятые доли процента в наших расхождениях приходились на технические проблемы сети. Остальное — логика."

А витрины - это место концентрированной логики - там она прямо гнездится как пчелы в улье. Это самое то место за качеством данных в котором надо следить. Мы все DQ метрики в первую очередь для витрин и создаем

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

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

Видимо у вас модель 1:1 аля одна витрина на каждого аналитика. Все таки в более взрослой структуре - уже появляются общие витрины актуальные для многих людей или даже всей компании.И они должны быть 100% релевантными, т.к. на них уже базируется не песочница одного аналитика а отчетность для целых отделов или топов

Ну, не обязательно. У нас ETL реплицирует 1:1, а все отчеты строятся потом, в хадупе. Поэтому логика проверки сводится к тупому равенству колонок (на самом деле не такому тупому, но это не важно). Сложность в плане объема конечно никуда не девается, и может например выглядеть так: репликация через OGG BD, приносит там миллиард изменений по таблице в сутки. После анализа оказывается, что это 250 миллионов уникальных ключей, то есть по одной записи была одна вставка, два обновления, и скажем одно удаление (ну или типа того). Следовательно, когда мы лезем за данными в источник, чтобы их сравнить, нам уже не нужен миллиард, достаточно в четыре раза меньше (понятно, при определенных условиях — что нам интересен только текущий срез данных, а не история). В общем, разница кое-какая есть, но в целом вы конечно правы — у нас одной из серьезных проблем является то, чтобы проверка не грузила базы данных настолько же, как репликация, и укладывалась в определенное время (ну хотя бы чтоб репликация + проверка в сутки уложились). Причем эти требования противоречивы — потому что ускорить мы скажем можем, распараллелив выборку, но нагрузка на базу при этом вырастет в разы, а уже скажем и ночь закончилась, и на базе уже люди работают, транзакции свежие и все такое.

Это отдельная большая история, впрочем.

Да, сумму можно использовать для предварительной оценки, что с данными все ок. Если не ок, то в дальнейших исследованиях это ничем не поможет.

А еще, я добавил абзац "Логи", чтобы было видно, что мы все проблемы видим сразу с примерами, и все проблемные ID-шники под рукой.

готовых решений не нашёл

Думаю и не найдете. Вот смотрите, я делаю такой же сервис (ему уже лет пять или шесть). Он внутренний.

Потребности наши похожи, но в тоже время, постановка нашей задачи достаточно сильно отличается от того, что у вас. Я вообще не уверен, что это можно просто унифицировать. Например, возможно я не увидел, но у вас вообще не рассматривается вопрос, что источник и реплика не синхронны. В тоже время у нас это практически всегда так — репликация периодическая, и производится раз в сутки или в час. Всех устраивает Т-1 в реплике, потому что это система для отчетности. Соответственно, так как данные не синхронны, возникает вопрос синхронизации их на одно время. А лучше на одну транзакцию.

Да, мы пока не уперлись в эту проблему, чтобы бороться с задержкой в синхронности реплики. Также какое-то время может уходить на доставку данных до хранилища. Если проблемы есть, они в любом случае проявятся на сверке после того как реплика будет синхронизирована, и запущена сверка, которую мы запускаем пока раз в сутки. Хотя для более чувствительных и важных данных возможно будем запускать чаще и проводить сверки за меньшие периоды.

На требование сверки в рамках одной транзакции конечно текущий сервис не заточен, но мы пока так нашли свой баланс между требованиями и вложениями в этот проект. В целом нет уверенности, что движение в эту сторону подсветит какие-то неизвестные проблемы с данными.

Мы даже не пытаемся. Одну транзакцию можно более-менее гарантировать, если у вас есть привилегия и ваша база Oracle — тогда вы можете себе позволить AS OF scn, и наслаждаться. В остальных случаях — увы.

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

У нас есть полностью аналогичная структура, множество продакшн-узлов на MySQL и один аналитический на Clickhouse. Тоже шина данных и весьма сложные процессы трансформации (вплоть до того что сверять по количеству нельзя, надо сверять суммы или другие показатели, да и таблицы не переносятся as is).

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

Это работает, и при том довольно легко масштабируется и дорабатывается. С учетом того что clickhouse выполняет всю работу с данными - ещё и достаточно быстро.

Да еще и заставили аналитиков быть тестерами - i like it !!! Сплошной профит

Мы пробовали этот подход, но в то время мы нагребли много проблем:
- limit не отрабатывал нормально, поэтому не было возможности забирать данные по частям. У нас есть большие таблички, и забирать данные оттуда не получалось вообще никак
- были проблемы с джойнами, условиями (часть внешних фильтров не переносилась на MySQL)
- плохо отрабатывали группировки и having
- из-за сложных запросов прикладывался Clickhouse


Кроме того, сложные запросы могут прикладывать продакшн-базы, но вы видимо сами следите за тем чтобы аналитики писали оптимальные запросы.

Сейчас возможно эти проблемы уже пофиксили, но в нашей инфраструктуре это казалось проблематично. Кликхаус у нас на нескольких нодах, джойны с distributed таблицами могут создавать лишний нагрузочный фон.

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

А не пробовали рассмотреть great_expectations или по стеку не совсем подходил? https://docs.greatexpectations.io/docs/

Инструмент любопытный, посмотрим внимательнее, спасибо! Но вижу, что с Clickhouse там пока, кажется, нет интеграции

Джойны на спарке? Жесть какая.

А про дерево Меркла вы когда-нибудь слышали?

Я никогда не слышал про дерево Меркла, сейчас прочитал, но не понял как это может облегчить решаемую задачу. Не могли бы пояснить?

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

Правильно я понимаю, что в итоге нужно хранить для каждой строки хэш ее неключевых полей?

Не надо хранить, можно считать каждый раз. Это точно быстрее, чем переписывать данные в spark.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий