Чтение данных Hive из ADQM

Для получения данных из таблиц Hive через запросы SELECT ClickHouse предоставляет табличный движок Hive. Форматы принимаемых данных в настоящее время поддерживаются следующим образом:

  • Text — поддерживаются только простые скалярные типы столбцов кроме binary;

  • ORC — поддерживаются простые скалярные типы столбцов кроме char и сложный тип array;

  • Parquet — поддерживаются все простые скалярные типы столбцов и сложный тип array.

В данной статье описываются особенности работы с табличным движком Hive на примере ADQM и ADH (Arenadata Hadoop), который предоставляет сервис Hive.

Создание таблицы Hive

Базовый синтаксис запроса для создания таблицы Hive в ADQM:

CREATE TABLE <table_name> (<column_name> <column_type> [ALIAS <expr>], ...)
ENGINE = Hive('thrift://<host>:<port>', '<hive_database>', '<hive_table>')
PARTITION BY <expr>;

Параметры табличного движка Hive:

  • thrift://<host>:<port> — адрес хоста ADH, где установлен компонент Hive Metastore;

  • <hive_database> — имя удаленной базы данных Hive;

  • <hive_table> — имя удаленной таблицы Hive.

Структура таблицы ADQM может отличаться от структуры удаленной таблицы Hive, к которой осуществляется подключение:

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

  • Типы столбцов в таблице ADQM должны быть такими же, как в исходной таблице Hive.

  • Ключ партиционирования PARTITION BY таблицы ADQM должен соответствовать ключу PARTITIONED BY исходной таблицы Hive, а столбцы, указанные в выражении PARTITION BY, должны быть определены в структуре таблицы.

Режим высокой доступности (HA) HDFS

Если в кластере ADH активирован режим высокой доступности (High Availability, HA) для HDFS, перед подключением ADQM к таблицам Hive необходимо выполнить следующую настройку:

  1. Скопируйте файл /etc/hadoop/conf/hdfs-site.xml с хоста ADH на хост ADQM в папку /etc/clickhouse-server/.

  2. Добавьте следующую настройку в файл конфигурации ClickHouse /etc/clickhouse-server/config.xml:

    <hdfs>
        <libhdfs3_conf>/etc/clickhouse-server/hdfs-site.xml</libhdfs3_conf>
    </hdfs>
  3. Перезапустите сервер ClickHouse:

    $ sudo systemctl restart clickhouse-server

Внутреннее имя кластера HDFS, указанное как internal nameservice, должно быть в нижнем регистре. Иначе при попытке получить данные из удаленной таблицы Hive ADQM может вернуть сообщение об ошибке следующего содержания:

Unable to connect to HDFS: InvalidParameter: Cannot parse URI: hdfs://<internal_nameservice_in_lower_case>, missing port or invalid HA configuration
Caused by: HdfsConfigNotFound: Config key: dfs.ha.namenodes.<internal_nameservice_in_lower_case> not found. (NETWORK_ERROR)

где <internal_nameservice_in_lower_case> — internal nameservice, указанный в параметре dfs.internal.nameservices файла конфигурации hdfs-site.xml, но в нижнем регистре.

Пример

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

  1. На хосте ADH, где установлен компонент Hive HiveServer2, создайте таблицу Hive test_table в базе данных default:

    CREATE TABLE test_table(id int, value int, name string) PARTITIONED BY (date string);
  2. Вставьте в таблицу тестовые данные:

    INSERT INTO test_table partition(date='2023-11-23') SELECT 0, 1, 'one';
  3. На хосте ADQM запустите консольный клиент clickhouse-client и создайте таблицу на базе движка Hive (замените <adh_host> на IP-адрес хоста ADH с компонентом Hive Metastore):

    CREATE TABLE hive_table(id Int8, value Int16, name String, date String)
    ENGINE = Hive('thrift://<adh_host>:9083', 'default', 'test_table')
    PARTITION BY date;
  4. Запросите данные из таблицы:

    SELECT * FROM hive_table;
    ┌─id─┬─value─┬─name─┬─day────────┐
    │  0 │     1 │ one  │ 2023-11-23 │
    └────┴───────┴──────┴────────────┘
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней