Миграция Big Data на практике: как мы готовили напильники

Всем привет, меня зовут Алексей Марьин, я IT-лидер стрима «Озеро данных» в ВТБ. До 2019 года мы активно и вполне успешно использовали для анализа и обработки больших данных продукт Oracle Big Data Appliance с Cloudera Hadoop Distribution внутри. И всё было хорошо, пока Oracle не решил прекратить развивать это направление бизнеса. Тогда пришлось задуматься об альтернативе, и мы обратились к Arenadata Hadoop. По пути мы столкнулись с некоторыми, так скажем, особенностями: пришлось кое-что допиливать напильником.

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

С чего всё началось

Сперва расскажу, что предстояло переносить. Это были два кластера: регламентный и пользовательский. Мы специально разнесли два этих вида нагрузки, чтобы точно избежать конфликтов за ресурсы. Заодно пользовательский кластер выполняет функцию DR: так как все реплики источников и построенные витрины реплицируются на второй кластер, в случае отказа первого он может начать выполнять функцию регламентного, а аналитики данных временно выселяются на мороз.

Архитектура старого озера

Архитектура старого озера

Как я уже говорил, всё это замечательно себе работало на Oracle BDA и Cloudera. А потом развитие продуктов превратилось в тыкву и, хотя сопровождение ещё оставалось, пропала возможность расширить кластер (или даже заменить сломавшийся узел) или получить новую версию Cloudera.

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

В каком-то смысле банку повезло столкнуться с миграцией на импортозамещённый продукт заранее, ещё до 2022. Тогда, в 2020 году, в ВТБ началась цифровая трансформация (мы о ней уже писали здесь), и переезд на Arenadata Hadoop стал частью этого масштабного процесса. Это дало возможность как следует подготовиться к переезду, ведь объём работ предстоял большой: нам предстояло перенести около 5 Пб данных.

Этапы проекта

Миграция шла в несколько этапов:

Подготовка инфраструктуры. До конца 2021 года мы занимались в основном закупкой, монтажом и настройкой оборудования. Тогда же провели пилотные и нагрузочные запуски. 

Параллельно мы решали другую проблему: старая система DRP, на которой находились сразу два кластера — регламентный и пользовательский, уже не справлялась с нагрузкой, и нужно было как-то её усилить. Мы пошли на инженерную хитрость: взяли часть нового оборудования для DAPP и поставили на него ADH и Cloudera. Затем перенесли на него пользовательский кластер. Эта промежуточная архитектура позволила нам выиграть время и лучше подготовить старую систему к миграции.

Архитектура старого озера на новом железе

Архитектура старого озера на новом железе

Позже, в конце 2021 года, мы подняли на DAPP и регламентный кластер, а также необходимые среды тестирования, разработки и т. д. С этого момента можно было приступать к миграции.

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

Запуск в промышленную эксплуатацию. Зима 2023 года. Уже в феврале на новой системе DAPP работало более 80% функционала, данные активно грузились и комплекс был поставлен на поддержку.

Завершение работ. Весна 2023. В мае процесс миграции практически закончился: более 95% процедур загрузки и 70% витрин уже работали на новом кластере, осталось только «подобрать хвосты», то есть довести до финала какие-то мелочи.

Архитектура нового озера

Архитектура нового озера

Специфика импортозамещённого решения

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

Кое-чего нам не хватает до сих пор: например, полнофункционального аналога Cloudera Manager. В итоге за время проекта у нас выросло как минимум три параллельных решения по мониторингу кластера и процессов на нём, которые мы теперь мучительно сращиваем в одно. А из-за отсутствия поддержки Impala на момент миграции нам приходилось страдать с более медленным и прожорливым Hive и переучивать пользователей на Spark. Правда, была и другая сторона медали: с переходом на ADH произошло обновление всех компонентов Hadoop.

Что сейчас? Мы всё ещё ждём от Arenadata поддержки некоторых других нужных нам инструментов. Уже есть хорошие новости: в релизе 3.2.4.1 появилась Impala, которая должна спасти наших дата-сайентистов, чахнущих над задумчивым Hive. В последнем релизе 3.2.4.2 мы получили Kyuubi, который должен позволить нам вернуть более продвинутых дата-сайентистов, умеющих не только писать на Spark, но и выписывать себе в сессии все доступные ядра в рамки приличия. Наконец, ближе к середине года наконец должен будет появиться Hue, который на голову выше идущего сейчас в поставке Zeppelin и не требует от пользователей ковыряния в кишках «бобра».

Собственная разработка

Не всё, что мы использовали при миграции с Oracle BDA на Arenadata Hadoop, было готовыми решениями. Пришлось и самим кое-что написать. Об этом уже подробнее расскажет мой коллега, передаю ему слово.

bf430bf8c3f2eaacd016084b2cf73ae9.PNGДмитрий Власов

Директор проектов службы развития больших данных

Мы разработали собственный фреймворк загрузки сырых данных. Со второго раза. Так как в новом релизе Hadoop обновились практически все мажорные версии, желание начать жить по-новому было непреодолимым. Но с горьким опытом приходит понимание, что слона (даже жёлтого и плюшевого) лучше есть по частям.

Первая версия фреймворка была заказана у одной известной компании. Авторы много думали над UX, но результат получился довольно квадратно-гнездовым. Когда тебе нужно забрать за минимальное время и разложить по правильным патрициям несколько сотен Гб, нужно иметь возможность влиять на генерируемый код, а этот фреймворк такого не позволял. Никакая возможность сгенерировать весь необходимый код на основе описания формата источника в Excel этого не перевесит.

Вторая версия была написана подпольно и победила первую в революционной борьбе. Она, конечно, тоже неидеальна и по её равиоли-коду плачет основательный реинжиниринг, но она решила главную задачу. Теперь любой из шагов процесса можно переопределить под конкретную СУБД, систему-источник или конкретную таблицу:

  • как понять границы инкремента на источнике;  

  • как забрать инкремент;

  • какой частью данных на кластере его сравнивать;

  • какие партиции нужно перезаписать, а какие дополнить.

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

Как работает ДАГ в рамках фреймворка

Как работает ДАГ в рамках фреймворка

Команда фреймворка реализует всевозможные cross-cutting concerns и мёрджит доработки конкретных ETL-методов от разработчиков тиражных команд. Аналитикам в тиражных командах остаётся только выучить YAML и писать на нём свои настройки. А также немножко Python, чтобы написать соответствующий ДАГ Airflow.

Да, у нас нет генератора ДАГов. Да, его можно было бы написать. Нет, мы его не написали. Да, он был в первой версии фреймворка, но он был настолько ужасен, что мы решили вынести почти всю логику в Spark. С оставшейся в ДАГах логикой может справиться даже аналитик. Может быть, мы ещё напишем новый генератор, с лаптой и девицами.

В ходе миграции пришлось заняться ещё одной собственной разработкой — инструментом синхронизации кластеров, который мы назвали просто: Hadoop Sync. 

Мы всегда решали вопрос георезервирования кластера и разделения регламентной и пользовательской нагрузки созданием двух отдельных кластеров с одинаковым набором данных в озере и витринах. Также мы решаем задачу копирования данных на непромышленные контуры. Ранее мы пользовались инструментом Wandisco Fusion, перехватывающим все запросы к HDFS на оба кластера. Но при переезде стало понятно, что дальше нам с ним не по пути: он был несовместим с решением от Arenadata. Вендор настоятельно рекомендовал использовать их новое решение — Wandisco LDM, но после весны 2022 года пришлось искать что-то импортозамещённое. Вот только на рынке такого решения не оказалось, пришлось писать самим.

UI нашего Hadoop Sync

UI нашего Hadoop Sync

Ранее инструменты Wandiscо де-факто считались стандартом для подобных задач в банке. Перед нами был выбор: либо начинать всё с чистого листа, либо взять за основу опенсорсное решение и начать его дорабатывать. После довольно длительного исследования командой мы выбрали второй путь, а в качестве подопытного решения взяли CircusTrain. Забегая вперед, скажу: всё оказалось не так просто и у «бесплатного» решения было множество проблем и допущений. Ну вы и сами знаете про то, где обычно лежит «бесплатный сыр».

Одним из таких допущений стало то, что мы не стали реализовывать псевдо-онлайн-репликацию данных. Стоимость такого решения была бы слишком высока, и потому мы остановились на варианте, когда вызов Hadoop Sync осуществляет пользователь самостоятельно после окончания записи данных. На приёмнике данных реализовали так называемую транзакционную защищённость. Это в дальнейшем стало дополнительной головной болью для команды разработки и поддержки, потому что не все пользователи данных понимали, что до окончания репликации данные по факту не обновляются.

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

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

Что ж, сейчас общая схема решения с Hadoop Sync выглядит так:

Функциональная схема Hadoop Sync

Функциональная схема Hadoop Sync

Развиваясь далее, мы стали добавлять внешние хранилища данных, например S3. И наша задача сейчас — создать систему для потребителей в банке, которая сможет не только работать с большими данными в экосистеме Hadoop, но и обычными реляционными БД.

Миграция в цифрах

Процесс миграции был долгим и трудоёмким. Вот несколько цифр, которые позволят оценить масштаб работ:

  • 2 года занял проект миграции на новую платформу;

  • для его осуществления привлекли более 1000 человек;

  • для проекта разработан функционал обработки потоков данных, включающий более 1000 потоков;

  • на отечественное решение перенесено хранилище объёмом 5 Пб данных, ежедневной загрузкой 12 Тб и 3 тысячами пользователей;

  • с DAPP интегрированы корпоративные хранилища, мастер-системы, Legacy-системы.

Вместо резюме

Что остаётся сказать напоследок? Даже если привычное проверенное зарубежное решение вам больше недоступно, можно — и вполне реально! — найти адекватную отечественную замену. Не факт, что вы сразу получите все необходимые инструменты. Возможно придётся подождать, пока вендор их реализует. И нужно быть готовым к тому, что всё равно где-то что-то придётся разрабатывать и самим.

Делитесь в комментариях и своим опытом миграции на импортозамещённые продукты — что на что вы меняли, какие отечественные аналоги удалось найти, чем они вам понравились (или нет).

© Habrahabr.ru