В сценариях аналитики больших данных Hive превосходит в пакетной обработке массивных наборов данных, тогда как Elasticsearch обеспечивает поиск и аналитику в реальном времени. Интеграция этих систем является ключом к преодолению разрыва между масштабной пакетной обработкой и поиском с низкой задержкой, эффективно разрушая силосы данных. С помощью коннектора ES-Hadoop (Elasticsearch for Apache Hadoop) можно интегрировать MRS Hive с CSS Elasticsearch, позволяя Hive напрямую читать и записывать данные Elasticsearch в виде внешних таблиц. Такой подход сохраняет привычные рабочие процессы экосистемы Hadoop, обеспечивая задержку поиска уровня секунды.
ES-Hadoop — это библиотека коннектора, интегрирующая Elasticsearch с экосистемой Hadoop, позволяющая MapReduce, Hive и Spark напрямую читать из индексов Elasticsearch и записывать в них.
В сценарии интеграции MRS Hive‑Elasticsearch ES-Hadoop выступает в качестве слоя трансляции запросов: при выполнении SQL‑запросов в Hive ES‑Hadoop преобразует план выполнения Hive в запросы Elasticsearch, отправляемые по протоколу REST.
Рисунок 1 Подключение MRS Hive к Elasticsearch cluster

Для получения дополнительной информации о ES-Hadoop и Hive см. официальный документ Apache Hive integration.
Адрес загрузки: https://www.elastic.co/downloads/hadoop
Адрес загрузки: https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient
curl -X GET http://<host>:<port>
curl -X GET http://<host>:<port> -u <user>:<password>
curl -X GET https://<host>:<port> -u <user>:<password> -ik
Variable | Description |
|---|---|
host | IP-адрес каждого узла в кластере. Если кластер содержит несколько узлов, будет несколько IP-адресов. Вы можете использовать любой из них. |
port | Номер порта для доступа к узлу кластера. Обычно номер порта — 9200. |
user | Имя пользователя для доступа к кластеру. |
пароль | Пароль пользователя. If the password contains special characters, enclose the username and password in single quotation marks, for example, curl -u "user:password!" "http://<host>:<port>". |
hadoop fs -mkdir /tmp/hadoop-eshadoop fs -put elasticsearch-hadoop-x.x.x.jar /tmp/hadoop-eshadoop fs -put commons-httpclient-x.x.jar /tmp/hadoop-es
keytool -import -alias newname -keystore ./truststore.jks -file ./CloudSearchService.cer
keytool -import -alias newname -keystore .\truststore.jks -file .\CloudSearchService.cer
В предыдущей команде newname указывает пользовательское имя сертификата.
После выполнения этой команды вам будет предложено задать пароль сертификата и подтвердить пароль. Надёжно сохраните пароль. Он будет использоваться для доступа к кластеру.
chown -R omm truststore.jks
add jar hdfs:///tmp/hadoop-es/commons-httpclient-3.1.jar;add jar hdfs:///tmp/hadoop-es/elasticsearch-hadoop-x.x.x.jar;
Эта команда действительна только для текущего сеанса.
Создайте внешнюю таблицу Hive и свяжите её с индексом Elasticsearch, сопоставив структуру таблицы Hive с полями индекса Elasticsearch.
CREATE EXTERNAL table IF NOT EXISTS student(id BIGINT,name STRING,addr STRING)STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'TBLPROPERTIES('es.nodes' = 'xxx.xxx.xxx.xxx:9200','es.port' = '9200','es.net.ssl' = 'false','es.nodes.wan.only' = 'false','es.nodes.discovery'='true','es.input.use.sliced.partitions'='false','es.resource' = 'student/_doc');
CREATE EXTERNAL table IF NOT EXISTS student(id BIGINT,name STRING,addr STRING)STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'TBLPROPERTIES('es.nodes' = 'xxx.xxx.xxx.xxx:9200','es.port' = '9200','es.net.ssl' = 'false','es.nodes.wan.only' = 'false','es.nodes.discovery'='true','es.input.use.sliced.partitions'='false','es.nodes.client.only'='true','es.resource' = 'student/_doc','es.net.http.auth.user' = 'username','es.net.http.auth.pass' = 'password');
CREATE EXTERNAL table IF NOT EXISTS student(id BIGINT,name STRING,addr STRING)STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'TBLPROPERTIES('es.nodes' = 'https://xxx.xxx.xxx.xxx:9200','es.port' = '9200','es.net.ssl' = 'true','es.net.ssl.truststore.location' = 'certFilePath','es.net.ssl.truststore.pass' = 'certPassword','es.nodes.wan.only' = 'false','es.nodes.discovery'='true','es.nodes.client.only'='true','es.input.use.sliced.partitions'='false','es.resource' = 'student/_doc','es.net.http.auth.user' = 'username','es.net.http.auth.pass' = 'password');
Параметр | Значение по умолчанию | Описание |
|---|---|---|
es.nodes | localhost | Адрес для доступа к кластеру Elasticsearch. |
es.port | 9200 | Номер порта для доступа к кластеру. Обычно это 9200. |
es.nodes.wan.only | false | Нужно ли выполнять обнаружение узлов. |
es.nodes.discovery | true | Нужно ли отключать обнаружение узлов. Сохраните настройку по умолчанию. |
es.input.use.sliced.partitions | true | Нужно ли использовать срезы. Значение может быть:
Когда этот параметр установлен в true, фаза предварительной выборки может занимать гораздо больше времени, чем фактический запрос. Рекомендуется установить его в false для повышения эффективности запроса. |
es.resource | NA | Целевой индекс и тип. |
es.net.http.auth.user | NA | Имя пользователя для доступа к кластеру. Установите этот параметр только если включён режим безопасности. |
es.net.http.auth.pass | NA | Пароль пользователя. Установите этот параметр только если включён режим безопасности. |
es.net.ssl | false | Указывает, включён ли SSL. Значение может быть:
|
es.net.ssl.truststore.location | NA | Путь к файлу сертификата .jks, например, file:///tmp/truststore.jks. |
es.nodes.client.only | false | Указывает, имеет ли кластер Elasticsearch выделенные клиентские узлы. Значение может быть:
|
es.net.ssl.truststore.pass | NA | Пароль к файлу сертификата .jks. |
Для получения подробной информации о параметрах конфигурации ES-Hadoop см. official configuration description.
INSERT INTO TABLE student VALUES (1, "Lucy", "address1"), (2, "Lily", "address2");
select * from student;
Результат запроса выглядит следующим образом:
+-------------+---------------+---------------+| student.id | student.name | student.addr |+-------------+---------------+---------------+| 1 | Lucy | address1 || 2 | Lily | address2 |+-------------+---------------+---------------+2 rows selected (0.116 seconds)
Левая часть консоли представляет собой поле ввода команд, а треугольный значок в её правом верхнем углу является кнопкой выполнения. Правая часть отображает результат выполнения.
GET /student/_search
Рисунок 2 результат запроса Kibana
