Tous les produits
Search
Centre de documentation

Elasticsearch:Use ES-Hadoop to enable Hive to write data to and read data from Alibaba Cloud Elasticsearch

Dernière mise à jour :Aug 09, 2026

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.

ES-Hadoop架构原理图

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

  1. Créez un cluster Alibaba Cloud Elasticsearch. Pour plus d'informations, consultez la rubrique Créer un cluster Alibaba Cloud Elasticsearch.

  2. Désactivez la fonctionnalité Auto Indexing du cluster, puis créez un index avec des mappages explicites. L'exemple suivant crée un index company contenant quatre champs :

    Important

    Si la fonction Auto Indexing est activée, Elasticsearch peut déduire des types de champs incorrects. Par exemple, un champ INT dans Hive peut devenir LONG dans 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.

Important

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.

Étape 1 : Charger le fichier JAR ES-Hadoop sur HDFS

  1. 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.

  2. 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.

  3. Chargez le fichier elasticsearch-hadoop-6.7.0.zip sur le nœud maître et extrayez-le pour obtenir le fichier elasticsearch-hadoop-hive-6.7.0.jar.

  4. 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

  1. 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.

    创建HiveSQL作业

  2. Configurez le job avec le code HiveSQL suivant. L'instruction ADD JAR charge le fichier JAR ES-Hadoop pour la session en cours, et l'instruction CREATE EXTERNAL TABLE mappe 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.nodes localhost Le 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.port 9200 Le port utilisé pour accéder au cluster Elasticsearch.
    es.net.http.auth.user elastic Le nom d'utilisateur pour Elasticsearch.
    es.net.http.auth.pass — Le mot de passe pour Elasticsearch.
    es.nodes.wan.only false Indique 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 true pour activer la détection des nœuds ; définissez-le sur false pour la désactiver.
    es.nodes.discovery true Définissez ce paramètre sur false pour Alibaba Cloud Elasticsearch. Lorsqu'il est défini sur true, 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.partitions true Définissez ce paramètre sur false pour ignorer la phase de prélecture de l'index, qui peut prendre plus de temps que la requête proprement dite.
    es.index.auto.create true Contrôle si ES-Hadoop crée automatiquement l'index lors de l'écriture des données. Définissez ce paramètre sur false si 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.metadata false Définissez ce paramètre sur true pour 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 elastic pour 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.

  3. 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