加速你的檢索
- 2019 年 12 月 12 日
- 筆記
上篇了解 hive 的一種查詢優化方案,可以通過分區表盡量避免查詢掃描全表,提高查詢時效。這篇我們討論使用另外一種優化手段 –把查詢檢索交給專業的組件去執行。
我們使用的整個 Hadoop 大數據生態架構如下圖。Hadoop 生態是基於 HDFS ( Hadoop Distributed File System, 分散式文件系統) 文件系統之上,採用 Zookeeper 組件協調分散式服務(包括集群管理、節點註冊發現等),採用 Yarn 進行資源管理和調度。再上層才是 hive、Pig 等高層查詢分析組件。而相對於 Hadoop1.0 時期,2.0 整體架構變動不大,只是引入了 Tez,一款有向無環圖 DAG(Directed Acyclic Graph) 的計算框架,引入了 Spark 流數據處理框架,底層架構基本一致。

Hadoop 1.0 生態架構

Hadoop 2.0 生態架構


MapReduce 與 Tez 分散式作業計算對比
我們再來看下 Yarn 是如何進行分散式計算資源管理

Yarn 資源管理器架構
Yarn 資源管理框架架構如上圖,資源管理器最主要的兩個組件:調度器(Scheduler)和應用管理器(ApplicationManager)。
調度器(Scheduler)負責根據相近的容量,隊列等約束將資源分配給各種正在運行的應用程式。調度器是純調度程式,因為它不執行應用程式狀態的監視或跟蹤。此外,由於應用程式故障或硬體故障,它無法保證重新啟動失敗的任務。調度器根據應用程式的資源需求執行其調度功能;它是基於資源 Container 的抽象概念,它包含記憶體、CPU、磁碟、網路等元素資源。
調度器具有可插入策略,該策略負責在各種隊列、應用程式等之間對集群資源進行分區。當前的調度程式(如 CapacityScheduler 和 FairScheduler )是插件的一些示例。
應用管理器(ApplicationsManager)負責接受作業提交,協商第一個容器以執行特定於應用程式的 ApplicationMaster,並提供在失敗時重新啟動 ApplicationMaster 容器的服務。每個應用程式 ApplicationMaster 負責從調度程式協商適當的資源容器,跟蹤其狀態並監視進度。
綜上,一條 Hive sql 除了要經過常規的客戶端分析,sql 優化,還需要向 Yarn 資源管理框架提交任務,分配資源,創建 Contains ,執行 MapReduce 作業。這裡較大一部分耗時是在創建任務、分配資源及提交作業上,所以 hive 一般在大數據處理中只用於離線數據分析、展示,那我們想做到數據實時檢索查詢該如何優化呢?這時候就想起一句話「專業的人干專業的事「,專業的數據檢索分析引擎 – Elasticsearch (下稱 "ES" )
ES 是一款分散式、RESTful 風格的搜索和數據分析引擎(官方網站:https://www.elastic.co/ )。 ES 作為高性能的數據分析引擎,其數據響應速度都是在毫秒級,同時其部署架構也是天然支援分散式集群,根據多副本 ( replicas ) 多分片 ( shards ) 的設計原理,其數據也是保證高可用。結合官方數據分析工具 Kibana 可快速分析展示數據結果,其數據呈現效果極其豐富。
了解這麼多關於 Elasticsearch 的特性,也知道其能夠加速數據檢索。但現在的問題是,我們的大量數據是保存在 Hdfs 或者 Hive 中,那怎麼把數據同步到 Elasticsearch 中呢,這就需要使用 ES 的官方 Hadoop 組件 Elasticsearch-Hadoop 連接器,下面就展示如何使用連接器將大數據導入到 ES 中。
- 引入我們需要的依賴 jar 包;
add jar elasticsearch-hadoop-xx.jar;
- 創建 ES 外部表,表結構的存儲格式選擇 「EsStorageHandler」,表配置里填寫對應的 ES 索引名稱(es.resource)、ES 集群節點資訊(es.node、es.port)、ES 文檔 id(es.mapping.id),如果你的 ES 集群節點有許可權認證,還需要填寫集群的帳號。
create external table es_hadoop_connection( user_id string, user_name string, hobby string, address string, create_time string ) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES( 'es.mapping.id'='user_id', 'es.resource'='es_user_info/es_user_info', 'es.node'='127.0.0.1', 'es.port'='9200', 'es.index.auto.create'='true', 'es.net.http.auth.user'='admin', 'es.net.http.auth.pass'='admin' );
- 通過查詢語句導入數據,從 hive 中已有的數據表中查詢導出數據,如果你的數據文件在 HDFS 文件系統上,可以創建 hive 外部表,而數據表 location 直接指定 HDFS 上的文件位置。在 ES 集群中就能查詢到導入的數據。
INSERT OVERWRITE TABLE es_hadoop_connection select user_id,user_name,hobby,address,create_time from user_info;
通過以上簡單的幾個步驟就可以將我們原本在 HDFS 或者 hive 中的數據導入到 Elasticsearch 中,後續就是如何在 ES 中查詢分析我們的數據了,這將在以後的文章中詳細講解。