通過ES-Hadoop實現Hive讀寫Elasticsearch資料
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為您演示,單擊此處即可免費試用。
操作流程
-
建立同一專有網路下的阿里雲Elasticsearch和E-MapReduce(以下簡稱EMR)例項、關閉Elasticsearch例項的自動建立索引功能並建立索引和Mapping、下載與Elasticsearch例項版本一致的ES-Hadoop安裝包。
-
[步驟一:上傳ES-Hadoop JAR包至HDFS](#步驟一:上傳ES-Hadoop JAR包至HDFS)
將已下載的ES-Hadoop安裝包上傳至EMR Master節點的HDFS目錄下。
-
建立Hive外表,與Elasticsearch索引中的欄位進行對映。
-
通過HiveSQL,向Elasticsearch例項的索引中寫入資料。
-
通過HiveSQL,讀取Elasticsearch例項中的索引資料。
準備工作
-
建立阿里雲Elasticsearch例項。
本文使用6.7.0版本的例項,具體操作步驟請參見建立阿里雲Elasticsearch例項。
-
關閉例項的自動建立索引功能,並提前建立索引和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" } } }
-
建立與Elasticsearch例項在同一專有網路下的EMR叢集。
注意 Elasticsearch例項的私網訪問白名單預設為0.0.0.0/0,您可在安全配置頁面檢視,如果未使用預設配置,您還需要在白名單中加入EMR叢集的內網IP地址:
-
請參見檢視叢集列表與詳情,獲取EMR叢集的內網IP地址。
-
請參見配置ES公網或私網訪問白名單,配置Elasticsearch例項的VPC私網訪問白名單。
-
-
下載ES-Hadoop安裝包,其版本需要與Elasticsearch例項保持一致。
本文使用elasticsearch-hadoop-6.7.0.zip。
步驟一:上傳ES-Hadoop JAR包至HDFS
-
登入E-MapReduce控制檯,獲取Master節點的IP地址,並通過SSH登入對應的ECS機器。
具體操作步驟請參見使用SSH連線主節點。
-
將已下載的elasticsearch-hadoop-6.7.0.zip上傳至Master節點,並解壓獲得elasticsearch-hadoop-6.7.0.jar。
-
建立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外表
-
在EMR控制檯的 資料開發 模組中,建立 HiveSQL 型別的作業。
具體操作步驟請參見Hive SQL作業配置。
-
配置作業,建立外表。
作業配置如下。
####新增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.nodes localhost 指定阿里雲Elasticsearch例項的訪問地址,建議使用內網地址,可在例項的基本資訊頁面檢視,詳情請參見檢視例項的基本資訊。 es.port 9200 Elasticsearch例項的訪問埠號。 es.net.http.auth.user / Elasticsearch例項的訪問使用者名稱。 es.net.http.auth.pass / Elasticsearch例項的訪問密碼。 es.nodes.wan.only false 開啟Elasticsearch叢集在雲上使用虛擬IP進行連線,是否進行節點嗅探: * true:設定 * false:不設定 es.nodes.discovery true 是否禁用節點發現: * true:禁用 * false:不禁用 es.index.auto.create yes 通過Hadoop元件向Elasticsearch叢集寫入資料,是否自動建立不存在的index: * true:自動建立 * false:不會自動建立 es.resource / 指定要讀寫的index和type。 es.mapping.names / 表欄位與Elasticsearch的索引欄位名對映。 es.read.metadata false 操作Elasticsearch欄位涉及到 _id 之類的內部欄位,請開啟此屬性。 更多的ES-Hadoop配置項說明,請參見官方配置說明。
-
儲存並執行作業。
執行成功後,結果如下。
步驟三:通過Hive寫入索引資料
-
建立一個 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");
-
儲存並執行作業。
-
執行成功後,登入Elasticsearch例項的Kibana控制檯,檢視company索引資料。
登入Kibana控制檯的具體操作步驟,請參見登入Kibana控制檯。您可以在Kibana控制檯中,執行以下命令檢視company索引資料。
GET company/_search
執行成功後,返回結果如下。
步驟四:通過Hive讀取索引資料
-
建立一個 HiveSQL 型別的讀資料作業。
作業配置如下。
add jar hdfs:///tmp/hadoop-es/elasticsearch-hadoop-hive-6.7.0.jar; select * from company;
-
儲存並執行作業。
總結
本文以阿里雲EMR和Elasticsearch為例,介紹瞭如何通過Elasticsearch強大的ES-Hadoop元件,在Hive上進行資料的查詢和寫入,可以幫助您將Elasticsearch與Hadoop生態元件結合起來,實現更靈活的資料分析。如果您需要了解ES-Hadoop與Hive更高階的配置,請參見Elasticsearch官方說明文件。
相關文章
- flink實戰--讀寫Hive(Flink on Hive)Hive
- TDengine可通過資料同步工具 DataX讀寫
- 使用 ES-Hadoop 將 Spark Streaming 流資料寫入 ESHadoopSpark
- Hive 與 ElasticSearch 的資料互動HiveElasticsearch
- 如果通過流資料實現實時分析?
- spark寫入hive資料SparkHive
- 通過Vue的過濾器實現資料的資料脫敏Vue過濾器
- Spring Aop實現資料庫讀寫分離Spring資料庫
- 用 logstash 從 kafka 讀取資料寫入 Elasticsearch(qbit)KafkaElasticsearch
- Webview獨立程式並通過AIDL實現資料通訊WebViewAI
- Restcloud ETl資料通過時間戳實現增量資料同步RESTCloud時間戳
- 通過 Swoole\Table 實現 Swoole 多程式資料共享
- MySQL-SpringBoot整合JPA實現資料讀寫分離MySqlSpring Boot
- 資料庫讀寫分離,主從同步實現方法資料庫主從同步
- Elasticsearch 資料寫入原理分析Elasticsearch
- 透過資料結構實現簡易通訊錄資料結構
- 通過原生js實現資料的雙向繫結JS
- Spark讀取elasticsearch資料指南SparkElasticsearch
- 通過佇列實現棧OR通過棧實現佇列佇列
- 教程:如何通過DLA實現資料檔案格式轉換
- 通過sysbench工具實現MySQL資料庫的效能測試MySql資料庫
- 資料結構--單連結串列(通過陣列實現)資料結構陣列
- mysql通過kafka實現資料實時同步(三)——es叢集配置MySqlKafka
- Elasticsearch 如何保證寫入過程中不丟失資料的Elasticsearch
- ios端app讀取iphone檔案(通過itunes實現)iOSAPPiPhone
- Spring Boot + Mybatis 多資料來源配置實現讀寫分離Spring BootMyBatis
- 資料庫中介軟體sharding-jdbc實現讀寫分離資料庫JDBC
- (7)資料庫讀寫分離,主從同步實現方法(資料庫設定)資料庫主從同步
- 使用Java通過POI讀取EXCEL中的資料JavaExcel
- EF Core3.0+ 通過攔截器實現讀寫分離與SQL日誌記錄SQL
- 如何高效實現 MySQL 與 elasticsearch 的資料同步MySqlElasticsearch
- TensorFlow讀寫資料
- 資料讀寫流程
- 案例:通過shell指令碼實現mysql資料備份與清理指令碼MySql
- LRU 實現 通過 LinkedHashMapHashMap
- 通過模板實現POI
- 通過命令curl 操作ElasticSearch指南Elasticsearch
- 【Hive】hive資料遷移Hive