Apache Atlas – доступный data catalog

Вводное слово

В задачах построения и развития Data Platform с течением времени мы всегда приходим к вопросу эффективного управления данными.

Chief Data Officer, задавшись целью развить, вывести на новый уровень функцию управления данными, склоняются к «тяжеловесным» шагам, внедряя дорогостоящее вендорское ПО или начиная собственную разработку инструментов.

В то же время в открытом доступе есть законченные, испытанные временем продукты, с которых можно начать испытывать и развивать процессы и компетенции в области Data Governance, применив минимум затрат на внедрение и двигаясь поступательно методом «маленьких побед».

Apache Atlas является одним из таких доступных open source-инструментов класса Data Catalog, который нам удалось полноценно опробовать и успешно замкнуть на него ряд процессов управления данными.

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

Архитектура и основные компоненты Atlas

Apache Atlas тесно интегрирован с экосистемой Hadoop, является open source-продуктом и присутствует в дистрибутивах от ArenaData, Cloudera и HortonWorks. Предоставляет возможности управления метаданными и создания единого каталога данных, а также классификации и управления этими данными.

Рассмотрим основные компоненты Atlas на верхнеуровневой архитектуре.

2435781a27939e8cd0cac196137c4c42.png

Система Типов 

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

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

{
    "enumDefs": [],
    "structDefs": [],
    "classificationDefs": [],
    "entityDefs": [
	    {
            "name": "Asset",
            "superTypes": [
                "Referenceable"
            ],
            "serviceType": "atlas_core",
            "typeVersion": "1.1",
            "attributeDefs": [
                {
                    "name": "name",
                    "typeName": "string",
                    "cardinality": "SINGLE",
                    "isIndexable": true,
                    "isOptional": false,
                    "isUnique": false
                },
                {
                    "name": "description",
                    "typeName": "string",
                    "cardinality": "SINGLE",
                    "isIndexable": false,
                    "isOptional": true,
                    "isUnique": false
                },
                {
                    "name": "owner",
                    "typeName": "string",
                    "cardinality": "SINGLE",
                    "isIndexable": true,
                    "isOptional": true,
                    "isUnique": false
                }
            ]
        }
	]
}

Экземпляры Типов называются Сущностями и представляют собой фактические элементы метаданных, которыми мы хотим управлять (конкретные таблицы, атрибуты etc.).

Система Типов базируется на концепции «наследования» из ООП, что позволяет использовать атрибуты родительского Типа при описании сущности дочернего. С помощью Типов задаются как структуры для хранения метаданных, так и определение связей между ними. Пример кастомной модели метаданных представлен на рисунке ниже. 

75571df3e5a7fcfd08f40c8a4fc819b1.png

Легенда обозначений:

  • Прямоугольники — Типы-контейнеры (таблица, столбец, etl-процесс etc.)

  • Линии — Типы-связи (столбец таблицы, PK, FK, таблица схемы etc.)

  • Зеленый цвет — Типы «из коробки»

  • Оранжевый цвет — новые спроектированные Типы

Система Типов дает Atlas необычайную гибкость, что является одним из главных его достоинств. За счет этого в Atlas одинаково легко можно спроектировать модели для хранения как технических, так и бизнес-метаданных (бизнес-глоссарий), добавить информацию, которая изначально была не заложена,   например, результаты профилирования и проверок качества данных.

Графовый движок

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

В качестве графовой базы данных Atlas использует JanusGraph, движком полнотекстового поиска выступает Solr, хранилищем метаданных — HBase.

Загрузка/ экспорт

Добавлять метаданные позволяет компонента Ingest, а их изменения в Atlas регистрирует Export в виде событий, которые потребители могут использовать для реагирования в режиме реального времени.

Интеграционный слой

Управлять метаданными в Atlas можно двумя способами:

  • Богатый REST API, который позволяет искать/ создавать/ обновлять/ удалять Типы и Сущности, связи между ними и другими объектами Atlas (Классификациями и Терминами).

  • Интерфейс обмена сообщениями (Kafka). Может использоваться как для передачи объектов метаданных в Atlas, так и для получения событий изменения метаданных, дает возможность задействовать их в приложениях. События генерируются идущими в комплекте процессами захвата (hooks) и самим Atlas и пишутся в разные топики Kafka.

Источники метаданных

Наполнять Atlas метаданными можно «вручную», используя описанные выше способы интеграции. 

В то же время  каталог поддерживает интеграцию со многими источниками метаданных «из коробки» — компонентами экосистемы Hadoop (HBase, Hive, Sqoop, Storm, Kafka, Falcon),   причем этот  список  постоянно пополняется.

Готовая интеграция подразумевает две вещи: модель метаданных для хранения объектов этих систем и функционал захвата (hooks) объектов (в реальном времени или в некоторых случаях в пакетном режиме).

GUI и политики безопасности

Как и другие инструменты класса Data Catalog, Atlas предоставляет простой, но интуитивно понятный интерфейс для пользователя и администратора, помогающий выполнять главные задачи дата каталога — поиск, исследование и управление данными.

Благодаря интеграции Atlas с Ranger возможно определять политики безопасности на основе метаданных (тегирования данных). Ranger является потребителем событий изменения метаданных в Atlas.

f96e664a33876b24d69a35b2c899df96.png

Что получает пользователь?

1. Полноценный каталог данных

Позволяет:

  • использовать заранее подготовленные или кастомные модели хранения метаданных,

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

  • связывать метаданные друг с другом, задавая различные логические и смысловые вариации связей,

  • искать элементы метаданных в каталоге с помощью развитого инструментария поиска,

  • просматривать детальную информацию по каждому объекту метаданных (карточки метаданных) и быстро переключаться на связанные с ним объекты.

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

e5cf57470c7cbf89519bdd5c1f9a3388.png

2. Бизнес-глоссарий

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

  • объединять их в категории и выстраивать в иерархии,

  • соединять друг с другом разными типами связей (расширение контекста термина и функционала поиска данных для пользователя),

  • присоединять к объектам метаданных (быстрый поиск физических данных).

На рисунке ниже показана карточка термина Claim (по центру), размещенного в глоссарии Insurance (слева). Термин привязан к объекту метаданных Типа hdfs_path и относится к классификации Insurance, которая наследуется (см. п.4) объектами метаданных.

153ab2ece2df61a2d23399391a255e40.png

3. Data Lineage

Data Lineage дает нам:

  • информацию о происхождении данных — всю цепочку источников,

  • влияние элементов метаданных друг на друга — impact analysis,

  • как графическое представление данных, так и стандартный формат выгрузки (json), который в дальнейшем можно использовать для задач автоматизации.

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

На рисунке ниже пример построенного  Data Lineage в Atlas.

5430c2f4b63c6ac01b9106b0ae2bb393.png

4. Классификации

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

Классификации позволяют создавать и управлять сложными моделями доступа к данным в связке с Apache Ranger (см. п.6), обладают свойством наследования, то есть тег может быть унаследован от привязанного Термина или данных — источников (согласно Data Lineage).

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

Ниже на рисунках показано, как любые изменения классификаций распространяются по Data Lineage.

2115f228e3321b99777756e4fa4f6fae.png0a0928ccabb64c119ae9e5c18082f007.pngd625c2734ed893b5b90b0279aab75061.png

5. Бизнес-метаданные

Появились в последних (начиная с 2.1.0) версиях Atlas. Это дополнительные атрибуты, которые пользователи могут добавлять к уже созданным Типам метаданных через GUI — наполнять их и осуществлять по ним поиск.

Управлять и изменять бизнес-метаданные также возможно через REST API.

babff88839dd24b1b36aec7be633d048.png

6. Ролевой доступ

Функционал ролевого доступа в Atlas включает:

  • Несколько методов аутентификации (File, Kerberos, LDAP, Keycloak (OpenID Connect/ OAUTH2), PAM).

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

  • Управление доступом к данным и маскированием с помощью системы тегов и связкой с Apache Ranger. Например, можно создавать следующие правила:

    • кто может получить доступ к данным, классифицированным как PII, SENSITIVE;

    • группа пользователей может видеть только последние 4 цифры столбцов, классифицированных как NATIONAL_ID, CARD_NUMBER.

7. Логирование изменений

Все изменения метаданных в Atlas логируются. 

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

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

Резюме

Плюсы

  1. Полноценный Data Catalog. Есть все базовые функции:

    1. поиск,

    2. организация хранения и управления метаданными,

    3. бизнес-глоссарий,

    4. Data Lineage.

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

  3. Open source — бесплатно, в открытом доступе. Идет в составе всех популярных дистрибутивов Hadoop. 

  4. Продукт зрелый, прошел испытание временем, продолжает развиваться и с каждой новой версией обрастает дополнительным функционалом.

  5. Относительно прост в установке, настройке и кастомизации.

  6. Много подготовленных моделей и инструментов захвата метаданных «из коробки».

  7. Богатый REST API и формат обмена данными с ядром Atlas дает широкие возможности по автоматизации процессов, которых изначально в Atlas нет.

Минусы

  1. Простенький GUI с проблемами в верстке. Интерфейс администратора скуден по функционалу. Управление метаданными (загрузка/ обновление/ удаление) — исключительно  через консоль. Часть функций, доступных только через REST API, хочется вынести в GUI — например, выгрузка Data Lineage в файл в удобном формате.

  2. Нет функционала поддержания версионности изменений: просмотра версии объекта на дату, сравнения версий, подсветки изменений.

  3. Нет встроенного релизного цикла — редактирования версии метаданных, сборки мета-патча, релиза патча.

  4. Отсутствуют инструменты для организации процесса согласования изменений метаданных, бизнес-терминов заинтересованными лицами/ ролями и встроенного  способа коммуникации участников процесса согласования.

  5. Примитивная нотификация — только сообщения в Kafka. Нет пользовательского функционала «подписки» на отслеживание изменений объекта с нотификацией, например, по почте.

  6. Отсутствие семантического поиска.

  7. Нет разметки текста — Rich Text. Например, в описании метаданных нельзя вставить гиперссылку или выделить текст жирным/ курсивом.

  8. Нет возможности вставить картинки, отрисовать ER-модель.

  9. Нельзя управлять атрибутами Терминов. Есть только два базовых атрибута — длинное и краткое описание.

  10. Нет встроенных инструментов профилирования данных.

  11. Набор готовых моделей метаданных и коннекторов ограничен экосистемой Hadoop и некоторыми облачными сервисами.

  12. Легко сломать сам Atlas при не связанных с ним работах в составных компонентах — HBase, Solr, Kafka, Zookeeper, Ranger.

  13. Нужно быть аккуратными с ручными операциями удаления/ обновления метаданных через REST API — легко сломать, сложно восстановить, невозможно удалить полностью. В частности, практически невозможно кардинально поменять Тип без полной зачистки Atlas: Тип не поменять, пока есть связанные с ним элементы, soft delete-объекты все еще могут расцениваться как связанные. Возможность полного удаления объекта метаданных (hard delete) появилась относительно недавно в самой последней версии Atlas.

  14. Некоторые операции взаимодействия с Atlas через REST API крайне сложные, так как требуют предварительного получения GUID-элементов, что выливается в дополнительную комбинацию запросов (json + парсинг).

Итого

Atlas — отличный Data Catalog для старта внедрения и развития процессов управления данными. В нем есть необходимый функционал для решения базовых задач, которые ставятся перед инструментами этого класса. 

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

Определенная «аскетичность» интерфейса и функционала делает основной целевой аудиторией инструмента опытных пользователей данных — дата-инженеров, системных аналитиков и дата-стюардов.

Рядовому бизнес-пользователю, которому нужна максимальная функциональность из интерфейса, красивая разметка текста и написание статей (как в wiki), максимально легкий поиск (как в Яндексе), нотификации в интерфейсе и на почте по шаблону, социальные функции (чаты, оценки), Atlas с большой вероятностью не понравится.

Bonus. Установка Atlas для ознакомления и экспериментов

Установка

Минимальный набор для запуска Apache Atlas предполагает наличие поднятых и прописанных в конфигурации экземпляров Solr в качестве движка полнотекстового поиска и HBase как хранилища метаданных, а также Zookeeper.

Пример ниже автоматически устанавливает все необходимые и дополнительные компоненты и семплы данных и предоставляет возможность на практике опробовать взаимодействие Apache Atlas с Hadoop.

Пререквизиты:

  • Локальная машина или облачная виртуальная машина, на которой запущены Docker и Docker Compose,

  • Репозитории GitHub — Docker Atlas,

  • Docker образы (будут извлечены в процессе установки):

Клонируем репозиторий,  

git clone https://github.com/lucasmsp/docker-atlas.git

Может сложиться ситуация, что установка завершит свою работу по истечению стандартного порога ожидания запуска сервера Atlas — он довольно долго устанавливает патчи с обновлениями модели метаданных. Рекомендую увеличить значение переменной START_TIMEOUT в файле /docker-atlas/atlas/resources/atlas-setup.sh в 2–3 раза. 

Переходим в корень клонированного репозитория и используем команду docker-compose up, чтобы начать установку:

cd docker-atlas
docker-compose up

После извлечения Docker образов для Kafka и Zookeeper, указанных в пререквизитах, установка продолжится Maven-сборкой для Atlas — процесс занимает длительное время.

6cda0e396808569bb903c522e550788e.png

По завершении сборки будут созданы следующие девять контейнеров, состояние которых можно проверить с помощью команды docker ps в отдельном окне консоли:

ace9b7cd12189a728d512e4b4850d514.png

Последним шагом установки является запуск Apache Atlas Server.

01e1760235936df49c4f7f7c0e9b8847.png

Атласу может понадобиться несколько минут для запуска. Проверяем статус следующей командой:

curl -u admin:admin http://localhost:21000/api/atlas/admin/version

Если установка завершит свою работу по истечению порога ожидания запуска сервера Atlas, можно вручную остановить и запустить сервер.

docker exec -it docker-atlas_atlas-server_1 /opt/atlas/bin/atlas_stop.py
docker exec -it docker-atlas_atlas-server_1 /opt/atlas/bin/atlas_start.py

При этом внимательно следить за тем, что происходит в логах:

docker exec -it docker-atlas_atlas-server_1 tail -f /opt/atlas/logs/application.log

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

6d3489fcb051699e0a80b07e68fe03d5.png

Когда процесс обновления и настройки закончится, логи перестанут обновляться, и мы увидим заветное Atlas server is ready. Пробуем зайти в UI Atlas по адресу http://localhost:21000

c2135382acea81a2e897005226262fdd.png

Примеры наполнения данными

  1. Семпл из коробки

После успешного запуска сервера Atlas можно наполнить его семплом метаданных «из коробки»

docker exec -it docker-atlas_atlas-server_1 /opt/atlas/bin/quick_start.p
  1. Автоматический захват метаданных Так как в составе установке есть Hadoop и Hive-сервер, можем протестировать захват метаданных из Hive-сервера.

$ docker exec -it docker-atlas_hive-server_1 /bin/sh
# /opt/hive/bin/beeline -u jdbc:hive2://localhost:10000
> CREATE TABLE pokes (foo INT, bar STRING);
> LOAD DATA LOCAL INPATH '/opt/hive/examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
> CREATE TABLE IF NOT EXISTS `archive` (
  `ar_namespace` int,
  `ar_title` binary,
  `ar_string` binary,
  `ar_comment` binary,
  `ar_user` int,
  `ar_user_string` binary,
  `ar_timestamp` binary,
  `ar_minor_edit` tinyint,
  `ar_flags` binary,
  `ar_rev_id` int,
  `ar_string_id` int,
  `ar_deleted` tinyint,
  `ar_len` int,
  `ar_page_id` int,
  `ar_parent_id` int
);

Через несколько секунд Atlas подхватит изменения, и они будут доступны для поиска и просмотра в UI:

831caac499b5cf70a56ad15c14b29f44.png19325a3d9608317d4beb61743e0befcb.png

  1. Вручную создаем и наполняем кастомный Тип метаданных

Попробуем создать свой Тип метаданных и его экземпляр вручную. Прямое взаимодействие с моделью данных и REST API Atlas открывает широкий простор для автоматизации и кастомизации процессов захвата и наполнения Atlas метаданными из любых источников.

Создаем новые Типы метаданных table и column, которые наследует свойства Типа DataSet и объявляют дополнительные атрибуты:

curl -X POST -u admin:admin -H "Content-Type: application/json" -d '
{
    "enumDefs": [],
    "structDefs": [],
    "classificationDefs": [],
    "entityDefs": [
	    {
            "name": "column",
            "superTypes": [
                "DataSet"
            ],
            "serviceType": "test",
            "typeVersion": "1.0",
            "attributeDefs": [
			    {
                    "name": "data_type_nm",
                    "typeName": "string",
                    "cardinality": "SINGLE",
                    "isIndexable": true,
                    "isOptional": true,
                    "isUnique": false
                },
				{
                    "name": "nullable_flg",
                    "typeName": "boolean",
                    "cardinality": "SINGLE",
                    "isIndexable": true,
                    "isOptional": true,
                    "isUnique": false
                }
			]
        },
		{
            "name": "table",
            "superTypes": [
                "DataSet"
            ],
            "serviceType": "test",
            "typeVersion": "1.1",
            "attributeDefs": [
			    {
                    "name": "history_type_nm",
                    "typeName": "string",
                    "cardinality": "SINGLE",
                    "isIndexable": true,
                    "isOptional": true,
                    "isUnique": false
                }
			]
        }
	],
	"relationshipDefs": []	
}
' http://localhost:21000/api/atlas/v2/types/typedefs;

После успешного создания нового Типа Atlas вернет респонс, содержащий всю информацию о Типе, в том числе присвоенный ему GUID:

2ebc20d687fe4a9d7b8265ec39a52743.png

Создаем новые Типы для связиtable и column, одна из которых будет иметь логический смысл первичного ключа таблицы:

curl -X POST -u admin:admin -H "Content-Type: application/json" -d '
{
    "enumDefs": [],
    "structDefs": [],
    "classificationDefs": [],
    "entityDefs": [],
	"relationshipDefs": [  
        {
          "name": "table_x_column",
          "serviceType": "test",
          "typeVersion": "1.0",
          "relationshipCategory": "AGGREGATION",
          "relationshipLabel": "__table_x_column",
          "endDef1": {
                "type": "table",
                "name": "table_columns",
                "isContainer": true,
                "cardinality": "SET",
                "isLegacyAttribute": true
          },
          "endDef2": {
                "type": "column",
                "name": "table",
                "isContainer": false,
                "cardinality": "SINGLE",
                "isLegacyAttribute": true
          },
          "propagateTags": "NONE"
        },
        {
          "name": "table_x_primary_key",
          "serviceType": "test",
          "typeVersion": "1.0",
          "relationshipCategory": "AGGREGATION",
          "relationshipLabel": "__table_x_primary_key",
          "endDef1": {
                "type": "table",
                "name": "primary_keys",
                "isContainer": true,
                "cardinality": "SET",
                "isLegacyAttribute": true
          },
          "endDef2": {
                "type": "column",
                "name": "table_pk",
                "isContainer": false,
                "cardinality": "SINGLE",
                "isLegacyAttribute": true
          },
          "propagateTags": "NONE"
        }
    ]	
}
' http://localhost:21000/api/atlas/v2/types/typedefs;

Создаем экземпляры Типов.

Таблица:

curl -X POST -u admin:admin -H "Content-Type: application/json" -d '{"entity": {"typeName" : "table", "attributes" : {"name" : "dds.transaction", "qualifiedName" : "dds.transaction", "description" : "Транзакция"}}}' http://localhost:21000/api/atlas/v2/entity;

Столбцы:

curl -X POST -u admin:admin -H "Content-Type: application/json" -d '{"entity": {"typeName" : "column", "attributes" : {"name" : "transaction_id", "qualifiedName" : "dds.transaction.transaction_id", "description" : "ID транзакции"}}}' http://localhost:21000/api/atlas/v2/entity;
curl -X POST -u admin:admin -H "Content-Type: application/json" -d '{"entity": {"typeName" : "column", "attributes" : {"name" : "transaction_amt", "qualifiedName" : "dds.transaction.transaction_amt", "description" : "Сумма транзакции"}}}' http://localhost:21000/api/atlas/v2/entity;

Связи между ними:

curl -u admin:admin -H "Content-Type: application/json" -X POST -d '{"typeName": "table_x_column", "end1": {"typeName": "table", "uniqueAttributes": {"qualifiedName": "dds.transaction"}}, "end2": {"typeName": "column", "uniqueAttributes": {"qualifiedName": "dds.transaction.transaction_id"}}}' http://localhost:21000/api/atlas/v2/relationship;
curl -u admin:admin -H "Content-Type: application/json" -X POST -d '{"typeName": "table_x_column", "end1": {"typeName": "table", "uniqueAttributes": {"qualifiedName": "dds.transaction"}}, "end2": {"typeName": "column", "uniqueAttributes": {"qualifiedName": "dds.transaction.transaction_amt"}}}' http://localhost:21000/api/atlas/v2/relationship;
curl -u admin:admin -H "Content-Type: application/json" -X POST -d '{"typeName": "table_x_primary_key", "end1": {"typeName": "table", "uniqueAttributes": {"qualifiedName": "dds.transaction"}}, "end2": {"typeName": "column", "uniqueAttributes": {"qualifiedName": "dds.transaction.transaction_id"}}}' http://localhost:21000/api/atlas/v2/relationship;

Новые Типы метаданных, его экземпляры и связи между ними появились в Atlas:

6823a0ad042c2d5bedbb601cc0114fd9.png

Далее схожим образом, обращаясь к экземпляру Типа по qualifiedName или GUID, его можно обновлять, удалять, добавлять связи с другими объектами метаданных и терминами Бизнес-глоссария, добавлять классификации и встраивать в цепочки Data Lineage.

© Habrahabr.ru