ES-Hadoop est un connecteur open source qui fait le pont entre Apache Hadoop et Elasticsearch. Il permet à Hive de lire et d'écrire dans un index Elasticsearch avec des modifications de code minimales. Cette rubrique vous guide tout au long de la configuration complète : création des clusters, chargement du fichier JAR ES-Hadoop sur le système de fichiers distribués Hadoop (HDFS), création d'une table externe Hive et exécution de jobs HiveSQL pour écrire et lire des données.
Fonctionnement
ES-Hadoop utilise Elasticsearch comme source de données pour MapReduce, Spark et Hive. Hadoop excelle dans le traitement par lots de grands volumes de données, mais présente une latence élevée pour les requêtes interactives. Elasticsearch répond aux requêtes, y compris les requêtes ad hoc, en quelques secondes. ES-Hadoop combine les deux approches : Hive gère l'orchestration des requêtes tandis qu'Elasticsearch effectue la sélection et le filtrage rapides des données côté serveur.

Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster Alibaba Cloud Elasticsearch (la version 6.7.0 est utilisée dans cette rubrique)
Un cluster E-MapReduce (EMR) situé dans le même réseau privé virtuel (VPC) que le cluster Elasticsearch
Un accès SSH au nœud maître du cluster EMR
Préparation de l'environnement
Créer un cluster Elasticsearch et configurer un index
Créez un cluster Alibaba Cloud Elasticsearch. Pour plus d'informations, consultez la rubrique Créer un cluster Alibaba Cloud Elasticsearch.
-
Désactivez la fonctionnalité Auto Indexing du cluster, puis créez un index avec des mappages explicites. L'exemple suivant crée un index
companycontenant quatre champs :ImportantSi la fonction Auto Indexing est activée, Elasticsearch peut déduire des types de champs incorrects. Par exemple, un champ
INTdans Hive peut devenirLONGdans l'index créé automatiquement. Définissez explicitement les mappages pour éviter les incompatibilités de type.PUT company { "mappings": { "_doc": { "properties": { "id": { "type": "long" }, "name": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "birth": { "type": "text" }, "addr": { "type": "text" } } } }, "settings": { "index": { "number_of_shards": "5", "number_of_replicas": "1" } } }
Créer un cluster EMR
Créez un cluster EMR dans le même VPC que votre cluster Elasticsearch.
Par défaut, la liste d'autorisation d'adresses IP privées du cluster Elasticsearch autorise 0.0.0.0/0. Vérifiez la liste d'autorisation sur la page de configuration de sécurité du cluster. Si la valeur par défaut n'est pas utilisée, ajoutez l'adresse IP privée du cluster EMR à la liste d'autorisation.
Pour obtenir l'adresse IP privée du cluster EMR, consultez la rubrique Afficher la liste des clusters et les détails des clusters.
Pour configurer la liste d'autorisation, consultez la rubrique Configurer une liste d'autorisation d'adresses IP publiques ou privées pour un cluster Elasticsearch.
Étape 1 : Charger le fichier JAR ES-Hadoop sur HDFS
Téléchargez le package ES-Hadoop correspondant à la version de votre cluster Elasticsearch. Cette rubrique utilise le fichier
elasticsearch-hadoop-6.7.0.zip.Connectez-vous à la console EMR et récupérez l'adresse IP du nœud maître. Utilisez ensuite SSH pour vous connecter à l'instance Elastic Compute Service (ECS) à cette adresse. Pour plus d'informations, consultez la rubrique Se connecter à un cluster.
Chargez le fichier
elasticsearch-hadoop-6.7.0.zipsur le nœud maître et extrayez-le pour obtenir le fichierelasticsearch-hadoop-hive-6.7.0.jar.-
Créez un répertoire HDFS et chargez le fichier JAR :
hadoop fs -mkdir /tmp/hadoop-es hadoop fs -put elasticsearch-hadoop-6.7.0/dist/elasticsearch-hadoop-hive-6.7.0.jar /tmp/hadoop-es
Étape 2 : Créer une table externe Hive
-
Dans l'onglet Data Platform de la console EMR, créez un job HiveSQL. Pour plus d'informations, consultez la rubrique Configurer un job Hive SQL.

-
Configurez le job avec le code HiveSQL suivant. L'instruction
ADD JARcharge le fichier JAR ES-Hadoop pour la session en cours, et l'instructionCREATE EXTERNAL TABLEmappe les colonnes Hive à l'index Elasticsearch.-- Load the ES-Hadoop JAR (valid for the current session only) ADD JAR hdfs:///tmp/hadoop-es/elasticsearch-hadoop-hive-6.7.0.jar; -- Create a Hive external table mapped to the Elasticsearch index CREATE EXTERNAL TABLE IF NOT EXISTS company( id BIGINT, name STRING, birth STRING, addr STRING ) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES( 'es.nodes' = 'http://es-cn-mp91kzb8m0009****.elasticsearch.aliyuncs.com', 'es.port' = '9200', 'es.net.ssl' = 'true', 'es.nodes.wan.only' = 'true', 'es.nodes.discovery' = 'false', 'es.input.use.sliced.partitions'= 'false', 'es.input.json' = 'false', 'es.resource' = 'company/_doc', 'es.net.http.auth.user' = 'elastic', 'es.net.http.auth.pass' = 'xxxxxx' );Le tableau suivant décrit les principaux paramètres ES-Hadoop.
Parameter Default Description es.nodeslocalhostLe point de terminaison interne du cluster Elasticsearch. Vous pouvez l'obtenir depuis la page Basic Information du cluster. Pour plus d'informations, consultez la rubrique Afficher les informations de base d'un cluster. es.port9200Le port utilisé pour accéder au cluster Elasticsearch. es.net.http.auth.userelasticLe nom d'utilisateur pour Elasticsearch. es.net.http.auth.pass— Le mot de passe pour Elasticsearch. es.nodes.wan.onlyfalseIndique s'il faut activer la détection des nœuds lorsque le cluster Elasticsearch utilise une adresse IP virtuelle pour les connexions. Définissez ce paramètre sur truepour activer la détection des nœuds ; définissez-le surfalsepour la désactiver.es.nodes.discoverytrueDéfinissez ce paramètre sur falsepour Alibaba Cloud Elasticsearch. Lorsqu'il est défini surtrue, ES-Hadoop tente de découvrir tous les nœuds du cluster, ce qui échoue derrière une adresse IP virtuelle.es.input.use.sliced.partitionstrueDéfinissez ce paramètre sur falsepour ignorer la phase de prélecture de l'index, qui peut prendre plus de temps que la requête proprement dite.es.index.auto.createtrueContrôle si ES-Hadoop crée automatiquement l'index lors de l'écriture des données. Définissez ce paramètre sur falsesi vous avez défini l'index manuellement.es.resource— Le nom de l'index et le type de document pour les opérations de lecture et d'écriture. es.mapping.names— Mappages des noms de champs entre la table Hive et l'index Elasticsearch. Utilisez ce paramètre lorsque les noms de colonnes Hive diffèrent des noms de champs Elasticsearch. Exemple : 'es.mapping.names' = 'hive_date:@timestamp'.es.read.metadatafalseDéfinissez ce paramètre sur truepour inclure les métadonnées du document (telles que_id) dans les résultats de la requête.es.query— Une requête Elasticsearch pour filtrer les données côté serveur lors de la lecture. RemarqueÉvitez d'utiliser le compte
elasticpour l'accès en production. Si vous réinitialisez son mot de passe, l'accès peut être interrompu pendant la propagation de la modification. Connectez-vous à la console Kibana et créez plutôt un utilisateur dédié disposant du rôle requis. Pour plus d'informations, consultez la rubrique Utiliser le mécanisme RBAC fourni par Elasticsearch X-Pack pour implémenter le contrôle d'accès.Pour la liste complète des options de configuration ES-Hadoop, consultez la référence de configuration open source ES-Hadoop.
-
Enregistrez et exécutez le job. Une exécution réussie renvoie le résultat suivant.


Étape 3 : Écrire des données dans l'index
Le modèle d'écriture le plus courant consiste à insérer des données depuis une table Hive existante dans la table externe sauvegardée par Elasticsearch :
ADD JAR hdfs:///tmp/hadoop-es/elasticsearch-hadoop-hive-6.7.0.jar;
-- Insert from another Hive table (typical production pattern)
INSERT INTO TABLE company
SELECT id, name, birth, addr FROM source_table;
Vous pouvez également insérer des lignes directement, ce qui est utile pour les tests :
ADD JAR hdfs:///tmp/hadoop-es/elasticsearch-hadoop-hive-6.7.0.jar;
INSERT INTO TABLE company VALUES (1, "zhangsan", "1990-01-01", "No.969, wenyixi Rd, yuhang, hangzhou");
INSERT INTO TABLE company VALUES (2, "lisi", "1991-01-01", "No.556, xixi Rd, xihu, hangzhou");
INSERT INTO TABLE company VALUES (3, "wangwu", "1992-01-01", "No.699 wangshang Rd, binjiang, hangzhou");
Enregistrez et exécutez le job.

Pour vérifier que les données ont été écrites, connectez-vous à la console Kibana et exécutez la requête suivante. Pour plus d'informations sur la connexion, consultez la rubrique Se connecter à la console Kibana.
GET company/_search
Une écriture réussie renvoie tous les documents insérés.

Étape 4 : Lire des données depuis l'index
Tous les exemples de lecture utilisent le fichier JAR ES-Hadoop chargé au début de la session. ES-Hadoop transfère le filtrage des requêtes à Elasticsearch, de sorte que seuls les documents correspondants sont transférés vers Hive.
ADD JAR hdfs:///tmp/hadoop-es/elasticsearch-hadoop-hive-6.7.0.jar;
SELECT * FROM company;
Enregistrez et exécutez le job.

Dépannage
Erreur : Could not initialize class org.elasticsearch.hadoop.rest.commonshttp.CommonsHttpTransport
FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. Could not initialize class org.elasticsearch.hadoop.rest.commonshttp.CommonsHttpTransport.
Cette erreur se produit dans les clusters EMR V5.6.0 où le composant Hive ne contient pas le fichier commons-httpclient-3.1.jar. Ajoutez manuellement le fichier au répertoire lib de Hive. Téléchargez-le depuis Maven Central.
Étapes suivantes
Pour connaître les options avancées d'intégration Hive, consultez la documentation open source Elasticsearch Hadoop.
Pour le contrôle d'accès et la gestion des utilisateurs, consultez la rubrique Utiliser le mécanisme RBAC fourni par Elasticsearch X-Pack pour implémenter le contrôle d'accès.