通過ES-Hadoop實現Hive讀寫Elasticsearch資料

Cloud_Tech發表於2020-09-30

ES-Hadoop是Elasticsearch推出的專門用於對接Hadoop生態的工具,可以讓資料在Elasticsearch和Hadoop之間雙向移動,無縫銜接Elasticsearch與Hadoop服務,充分使用Elasticsearch的快速搜尋及Hadoop批處理能力,實現互動式資料處理。本文介紹如何通過ES-Hadoop實現Hadoop的Hive服務讀寫Elasticsearch資料。

Hadoop生態的優勢是處理大規模資料集,但是其缺點也很明顯,就是當用於互動式分析時,查詢時延會比較長。而Elasticsearch擅長於互動式分析,對於很多查詢型別,特別是對於Ad-hoc查詢(即席查詢),可以達到秒級。ES-Hadoop的推出提供了一種組合兩者優勢的可能性。使用ES-Hadoop,您只需要對程式碼進行很小的改動,即可快速處理儲存在Elasticsearch中的資料,並且能夠享受到Elasticsearch帶來的加速效果。

ES-Hadoop的原理是將Elasticsearch作為MR、Spark或Hive等資料處理引擎的資料來源,在計算儲存分離的架構中扮演儲存的角色。這和 MR、Spark或Hive的資料來源並無差異,但相對於這些資料來源,Elasticsearch具有更快的資料選擇過濾能力。這種能力正是分析引擎最為關鍵的能力之一。

在這裡插入圖片描述

阿里雲Elasticsearch相容開源Elasticsearch的功能,以及Security、Machine Learning、Graph、APM等商業功能,致力於資料分析、資料搜尋等場景服務。支援5.5.3、6.3.2、6.7.0、6.8.0和7.4.0等版本,並提供了商業外掛X-Pack服務。在開源Elasticsearch的基礎上提供企業級許可權管控、安全監控告警、自動報表生成等功能。本文使用阿里雲Elasticsearch為您演示,單擊此處即可免費試用。

操作流程

  1. 準備工作

    建立同一專有網路下的阿里雲Elasticsearch和E-MapReduce(以下簡稱EMR)例項、關閉Elasticsearch例項的自動建立索引功能並建立索引和Mapping、下載與Elasticsearch例項版本一致的ES-Hadoop安裝包。

  2. [步驟一:上傳ES-Hadoop JAR包至HDFS](#步驟一:上傳ES-Hadoop JAR包至HDFS)

    將已下載的ES-Hadoop安裝包上傳至EMR Master節點的HDFS目錄下。

  3. 步驟二:建立Hive外表

    建立Hive外表,與Elasticsearch索引中的欄位進行對映。

  4. 步驟三:通過Hive寫入索引資料

    通過HiveSQL,向Elasticsearch例項的索引中寫入資料。

  5. 步驟四:通過Hive讀取索引資料

    通過HiveSQL,讀取Elasticsearch例項中的索引資料。

準備工作

  1. 建立阿里雲Elasticsearch例項。

    本文使用6.7.0版本的例項,具體操作步驟請參見建立阿里雲Elasticsearch例項

  2. 關閉例項的自動建立索引功能,並提前建立索引和Mapping。

    開啟自動建立索引功能後,可能會導致Elasticsearch自動建立的索引型別和您預期的型別不一致。比如您定義了一個欄位age,為INT型別,開啟自動建立索引後,可能將其索引成了LONG型別,因此建議手動建立索引。本文使用的索引和Mapping如下。

    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"
        }
      }
    }
    
  3. 建立與Elasticsearch例項在同一專有網路下的EMR叢集。

    注意 Elasticsearch例項的私網訪問白名單預設為0.0.0.0/0,您可在安全配置頁面檢視,如果未使用預設配置,您還需要在白名單中加入EMR叢集的內網IP地址:

  4. 下載ES-Hadoop安裝包,其版本需要與Elasticsearch例項保持一致。

    本文使用elasticsearch-hadoop-6.7.0.zip。

步驟一:上傳ES-Hadoop JAR包至HDFS

  1. 登入E-MapReduce控制檯,獲取Master節點的IP地址,並通過SSH登入對應的ECS機器。

    具體操作步驟請參見使用SSH連線主節點

  2. 將已下載的elasticsearch-hadoop-6.7.0.zip上傳至Master節點,並解壓獲得elasticsearch-hadoop-6.7.0.jar。

  3. 建立HDFS目錄,將elasticsearch-hadoop-6.7.0.jar上傳至該目錄下。

    hadoop fs -mkdir /tmp/hadoop-es
    hadoop fs -put /tmp/hadoop-es/elasticsearch-hadoop-6.7.0.jar /tmp/hadoop-es
    

步驟二:建立Hive外表

  1. 在EMR控制檯的 資料開發 模組中,建立 HiveSQL 型別的作業。

    具體操作步驟請參見Hive SQL作業配置
    在這裡插入圖片描述

  2. 配置作業,建立外表。

    作業配置如下。

    ####新增jar包,僅對當前會話有效########
    add jar hdfs:///tmp/hadoop-es/elasticsearch-hadoop-hive-6.7.0.jar;
    ####建立hive外表,與es索引進行對映#####
    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.json' = 'false',
        'es.resource' = 'company/employees',
        'es.net.http.auth.user' = 'elastic', 
        'es.net.http.auth.pass' = 'xxxxxx'
    );
    

    ES-Hadoop相關引數說明

    引數預設值說明
    es.nodeslocalhost指定阿里雲Elasticsearch例項的訪問地址,建議使用內網地址,可在例項的基本資訊頁面檢視,詳情請參見檢視例項的基本資訊
    es.port9200Elasticsearch例項的訪問埠號。
    es.net.http.auth.user/Elasticsearch例項的訪問使用者名稱。
    es.net.http.auth.pass/Elasticsearch例項的訪問密碼。
    es.nodes.wan.onlyfalse開啟Elasticsearch叢集在雲上使用虛擬IP進行連線,是否進行節點嗅探: * true:設定 * false:不設定
    es.nodes.discoverytrue是否禁用節點發現: * true:禁用 * false:不禁用
    es.index.auto.createyes通過Hadoop元件向Elasticsearch叢集寫入資料,是否自動建立不存在的index: * true:自動建立 * false:不會自動建立
    es.resource/指定要讀寫的index和type。
    es.mapping.names/表欄位與Elasticsearch的索引欄位名對映。
    es.read.metadatafalse操作Elasticsearch欄位涉及到 _id 之類的內部欄位,請開啟此屬性。

    更多的ES-Hadoop配置項說明,請參見官方配置說明

  3. 儲存並執行作業。 在這裡插入圖片描述

    執行成功後,結果如下。
    在這裡插入圖片描述

步驟三:通過Hive寫入索引資料

  1. 建立一個 HiveSQL 型別的寫資料作業。

    作業配置如下。

    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");
    
  2. 儲存並執行作業。

    在這裡插入圖片描述

  3. 執行成功後,登入Elasticsearch例項的Kibana控制檯,檢視company索引資料。

    登入Kibana控制檯的具體操作步驟,請參見登入Kibana控制檯。您可以在Kibana控制檯中,執行以下命令檢視company索引資料。

    GET company/_search
    

    執行成功後,返回結果如下。
    在這裡插入圖片描述

步驟四:通過Hive讀取索引資料

  1. 建立一個 HiveSQL 型別的讀資料作業。

    作業配置如下。

    add jar hdfs:///tmp/hadoop-es/elasticsearch-hadoop-hive-6.7.0.jar;
    select * from company;
    
  2. 儲存並執行作業。
    在這裡插入圖片描述

總結

本文以阿里雲EMR和Elasticsearch為例,介紹瞭如何通過Elasticsearch強大的ES-Hadoop元件,在Hive上進行資料的查詢和寫入,可以幫助您將Elasticsearch與Hadoop生態元件結合起來,實現更靈活的資料分析。如果您需要了解ES-Hadoop與Hive更高階的配置,請參見Elasticsearch官方說明文件

相關文章