Перейти к содержимому
Последнее обновление

Hudi Catalog

Hudi Catalog использует Hive Catalog. Подключаясь к Hive Metastore или службе метаданных, совместимой с Hive Metastore, Doris может автоматически получать сведения о базах данных и таблицах Hudi и выполнять запросы к данным.

Быстрый старт с Apache Doris и Apache Hudi.

Сценарии использования​

СценарийОписание
Ускорение запросовИспользуйте распределённый вычислительный движок Doris для прямого доступа к данным Hudi и ускорения запросов.
Интеграция данныхЧитайте данные Hudi и записывайте их во внутренние таблицы Doris или выполняйте операции ZeroETL с помощью вычислительного движка Doris.
Обратная запись данныхНе поддерживается.

Настройка Catalog​

Синтаксис​

CREATE CATALOG [IF NOT EXISTS] catalog_name PROPERTIES (
'type' = 'hms', -- required
'hive.metastore.uris' = '<metastore_thrift_url>', -- required
{MetaStoreProperties},
{StorageProperties},
{HudiProperties},
{CommonProperties}
);
  • [MetaStoreProperties]

    В разделе MetaStoreProperties указываются сведения о подключении и аутентификации для службы метаданных Metastore. Подробнее см. в разделе [Поддерживаемые службы метаданных].

  • [StorageProperties]

    В разделе StorageProperties указываются сведения о подключении и аутентификации для системы хранения. Подробнее см. в разделе [Поддерживаемые системы хранения].

  • [CommonProperties]

    В разделе CommonProperties указываются общие свойства. См. раздел [Общие свойства] в документе Обзор каталогов данных.

  • {HudiProperties}

    Имя параметраПрежнее имяОписаниеЗначение по умолчанию
    hudi.use_hive_sync_partitionuse_hive_sync_partitionИспользовать ли сведения о разделах, уже синхронизированные с Hive Metastore. Если установлено true, сведения о разделах будут получены непосредственно из Hive Metastore. В противном случае они будут получены из файла метаданных в файловой системе. Получение сведений из Hive Metastore эффективнее, но пользователи должны обеспечить синхронизацию последних метаданных с Hive Metastore.false

Кеш метаданных​

Для повышения производительности доступа к внешним источникам данных Apache Doris кеширует метаданные Hudi. Метаданные включают структуру таблиц (Schema), сведения о разделах, FS View и объекты Meta Client.

подсказка

В версиях до Doris 4.1.x кеширование метаданных управляется преимущественно глобальными параметрами конфигурации FE. Подробнее см. в разделе Кеш метаданных. Начиная с Doris 4.1.x, кеш внешних метаданных Hudi настраивается с помощью унифицированных ключей meta.cache.*.

Настройка свойств кеша (4.1.x+)​

Для записей кеша Hudi используется формат ключей конфигурации meta.cache.hudi.<entry>.{enable,ttl-second,capacity}. Сейчас размер кешей Hudi ограничивается количеством записей; параметр max-weight на уровне отдельного типа записей не поддерживается. См. раздел Управление памятью кеша внешних метаданных.

СвойствоПримерЗначение
enabletrue/falseВключать ли этот модуль кеша.
ttl-second600, 0, -10 отключает кеш (вступает в силу немедленно и позволяет увидеть последние данные); -1 означает, что срок действия не ограничен; другие положительные целые числа задают TTL в секундах, отсчитываемый от времени доступа.
capacity10000Максимальное количество записей в кеше. 0 отключает кеш.

Условия работы: Кеш модуля действует только при выполнении условий enable=true, ttl-second != 0 и capacity > 0.

Модули кеша​

Hudi Catalog включает следующие модули кеша:

Модуль (<entry>)Префикс ключа свойстваКешируемое содержимое и влияние
schemameta.cache.hudi.schema.Кеширует структуру таблиц. Влияет на актуальность отображаемых сведений о столбцах таблицы. Если отключён, последняя Schema загружается при каждом запросе.
partitionmeta.cache.hudi.partition.Кеширует метаданные разделов Hudi. Используется для обнаружения и отсечения разделов.
fs_viewmeta.cache.hudi.fs_view.Кеширует метаданные представления файловой системы Hudi.
meta_clientmeta.cache.hudi.meta_client.Кеширует объекты Hudi Meta Client. Сокращает повторную загрузку метаданных Hudi.

Сопоставление и преобразование устаревших параметров​

В версии 4.1.x и более поздних рекомендуется использовать унифицированные ключи. Ниже приведено соответствие между устаревшими свойствами Catalog и унифицированными ключами 4.1.x+:

Устаревший ключ свойстваУнифицированный ключ 4.1.x+Описание
schema.cache.ttl-secondmeta.cache.hudi.schema.ttl-secondСрок действия кеша структуры таблиц

Рекомендации​

  • Доступ к последним данным в реальном времени: Если каждый запрос должен видеть последние изменения данных или схемы таблиц Hudi, можно задать для ttl-second в модуле schema или partition значение 0.
    -- Disable partition metadata cache to detect the latest partition changes in Hudi tables
    ALTER CATALOG hudi_ctl SET PROPERTIES ("meta.cache.hudi.partition.ttl-second" = "0");
  • Оптимизация производительности: Начиная с Doris 4.1.4, успешное изменение свойств Catalog сбрасывает контекст выполнения Catalog и очищает инициализированные записи во всех движках кеша метаданных, к которым обращается этот Catalog. При следующем обращении Doris создаёт их заново с новым контекстом и конфигурацией; выполняющиеся запросы не затрагиваются.

Мониторинг​

Метрики кеша доступны в системной таблице information_schema.catalog_meta_cache_statistics:

SELECT catalog_name, engine_name, entry_name,
effective_enabled, ttl_second, capacity,
estimated_size, hit_rate, load_failure_count, last_error
FROM information_schema.catalog_meta_cache_statistics
WHERE catalog_name = 'hudi_ctl' AND engine_name = 'hudi'
ORDER BY entry_name;

См. документацию этой системной таблицы: catalog_meta_cache_statistics.

Поддерживаемые версии Hudi​

Текущая версия зависимости Hudi — 0.15. Рекомендуется обращаться к данным Hudi версии 0.14 и выше.

Поддерживаемые типы запросов​

Тип таблицыПоддерживаемые типы запросов
Copy On WriteЗапрос к снимку (Snapshot Query), Time Travel, инкрементальное чтение (Incremental Read)
Merge On ReadЗапросы к снимкам (Snapshot Queries), запросы с оптимизацией чтения (Read Optimized Queries), Time Travel, инкрементальное чтение (Incremental Read)

Поддерживаемые службы метаданных​

Поддерживаемые системы хранения​

Поддерживаемые форматы данных​

Сопоставление типов столбцов​

Тип HudiТип DorisКомментарий
booleanboolean
intint
longbigint
floatfloat
doubledouble
decimal(P, S)decimal(P, S)
bytesstring
stringstring
datedate
timestampdatetime(N)Автоматически сопоставляется с datetime(3) или datetime(6) в зависимости от точности
arrayarray
mapmap
structstruct
otherUNSUPPORTED

Примеры​

Создание Hudi Catalog аналогично созданию Hive Catalog. Дополнительные примеры см. в разделе Hive Catalog.

CREATE CATALOG hudi_hms PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://172.21.0.1:7004',
'hadoop.username' = 'hive',
'dfs.nameservices'='your-nameservice',
'dfs.ha.namenodes.your-nameservice'='nn1,nn2',
'dfs.namenode.rpc-address.your-nameservice.nn1'='172.21.0.2:4007',
'dfs.namenode.rpc-address.your-nameservice.nn2'='172.21.0.3:4007',
'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);

Выполнение запросов​

Простой запрос​

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

-- 1. switch to catalog, use database and query
SWITCH hudi_ctl;
USE hudi_db;
SELECT * FROM hudi_tbl LIMIT 10;

-- 2. use hudi database directly
USE hudi_ctl.hudi_db;
SELECT * FROM hudi_tbl LIMIT 10;

-- 3. use full qualified name to query
SELECT * FROM hudi_ctl.hudi_db.hudi_tbl LIMIT 10;

Чтение исторических данных (Time Travel)​

Каждая операция записи в таблицу Hudi создаёт новый снимок. Doris поддерживает чтение указанного снимка таблицы Hudi. По умолчанию запросы читают только последний снимок.

Хронологию изменений указанной таблицы Hudi можно запросить с помощью табличной функции hudi_meta():

Эта табличная функция поддерживается начиная с версии 3.1.0.

SELECT * FROM hudi_meta(
'table' = 'hudi_ctl.hudi_db.hudi_tbl',
'query_type' = 'timeline'
);

+-------------------+--------+--------------------------+-----------+-----------------------+
| timestamp | action | file_name | state | state_transition_time |
+-------------------+--------+--------------------------+-----------+-----------------------+
| 20241202171214902 | commit | 20241202171214902.commit | COMPLETED | 20241202171215756 |
| 20241202171217258 | commit | 20241202171217258.commit | COMPLETED | 20241202171218127 |
| 20241202171219557 | commit | 20241202171219557.commit | COMPLETED | 20241202171220308 |
| 20241202171221769 | commit | 20241202171221769.commit | COMPLETED | 20241202171222541 |
| 20241202171224269 | commit | 20241202171224269.commit | COMPLETED | 20241202171224995 |
| 20241202171226401 | commit | 20241202171226401.commit | COMPLETED | 20241202171227155 |
| 20241202171228827 | commit | 20241202171228827.commit | COMPLETED | 20241202171229570 |
| 20241202171230907 | commit | 20241202171230907.commit | COMPLETED | 20241202171231686 |
| 20241202171233356 | commit | 20241202171233356.commit | COMPLETED | 20241202171234288 |
| 20241202171235940 | commit | 20241202171235940.commit | COMPLETED | 20241202171236757 |
+-------------------+--------+--------------------------+-----------+-----------------------+

С помощью конструкции FOR TIME AS OF можно читать исторические версии данных по временной метке снимка. Формат времени соответствует документации Hudi. Примеры:

SELECT * FROM hudi_tbl FOR TIME AS OF "2022-10-07 17:20:37";
SELECT * FROM hudi_tbl FOR TIME AS OF "20221007172037";
SELECT * FROM hudi_tbl FOR TIME AS OF "2022-10-07";

Обратите внимание: таблицы Hudi не поддерживают конструкцию FOR VERSION AS OF. Попытка использовать этот синтаксис с таблицей Hudi приведёт к ошибке.

Инкрементальные запросы​

Инкрементальное чтение (Incremental Read) позволяет запрашивать изменения данных за указанный период времени и возвращает итоговое состояние данных на конец этого периода.

Для поддержки Incremental Read Doris предоставляет синтаксис @incr:

SELECT * from hudi_table@incr('beginTime'='xxx', ['endTime'='xxx'], ['hoodie.read.timeline.holes.resolution.policy'='FAIL'], ...);
  • beginTime

    Обязательный параметр. Формат времени должен соответствовать официальной документации Hudi для hudi_table_changes; поддерживается значение "earliest".

  • endTime

    Необязательный параметр. По умолчанию используется последнее значение commitTime.

В функцию @incr можно добавить дополнительные параметры, совместимые с параметрами чтения Spark.

Просмотрев план выполнения с помощью desc, можно увидеть, что Doris преобразует @incr в предикаты, передаваемые в VHUDI_SCAN_NODE:

|   0:VHUDI_SCAN_NODE(113)                                                                                            |
| table: lineitem_mor |
| predicates: (_hoodie_commit_time[#0] > '20240311151019723'), (_hoodie_commit_time[#0] <= '20240311151606605') |
| inputSplitNum=1, totalFileSize=13099711, scanRanges=1

Часто задаваемые вопросы​

  1. Запрос блокируется при использовании Java SDK для чтения инкрементальных данных через JNI

    Добавьте -Djol.skipHotspotSAAttach=true в JAVA_OPTS_FOR_JDK_17 или JAVA_OPTS в файле be.conf.

Приложение​

Журнал изменений​

Версия DorisПоддержка функций
2.1.8/3.0.4Зависимость Hudi обновлена до 0.15. Добавлен Hadoop Hudi JNI Scanner.