Чтение данных 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 необходимо выполнить следующую настройку:
-
Скопируйте файл /etc/hadoop/conf/hdfs-site.xml с хоста ADH на хост ADQM в папку /etc/clickhouse-server/.
-
Добавьте следующую настройку в файл конфигурации ClickHouse /etc/clickhouse-server/config.xml:
<hdfs> <libhdfs3_conf>/etc/clickhouse-server/hdfs-site.xml</libhdfs3_conf> </hdfs>
-
Перезапустите сервер 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 не включен).
-
На хосте ADH, где установлен компонент Hive HiveServer2, создайте таблицу Hive
test_table
в базе данныхdefault
:CREATE TABLE test_table(id int, value int, name string) PARTITIONED BY (date string);
-
Вставьте в таблицу тестовые данные:
INSERT INTO test_table partition(date='2023-11-23') SELECT 0, 1, 'one';
-
На хосте 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;
-
Запросите данные из таблицы:
SELECT * FROM hive_table;
┌─id─┬─value─┬─name─┬─day────────┐ │ 0 │ 1 │ one │ 2023-11-23 │ └────┴───────┴──────┴────────────┘