ELK hadoop hbase

在一個index/type裡面,只要你想,你可以存儲任意多的文檔。注意,儘管一個文檔,物理上存在於一個索引之中,文檔必須被索引/賦予一個索引的type。

分片和複製(shards & replicas)

一個索引可以存儲超出單個結點硬件限制的大量數據。比如,一個具有10億文檔的索引佔據1TB的磁盤空間,而任一節點都沒有這樣大的磁盤空間;或者單個節點處理搜索請求,響應太慢。

為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到集群中的任何節點上。

分片之所以重要,主要有兩方面的原因:

  • 允許你水平分割/擴展你的內容容量
  • 允許你在分片(潛在地,位於多個節點上)之上進行分佈式的、並行的操作,進而提高性能/吞吐量

至於一個分片怎樣分佈,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對於作為用戶的你來說,這些都是透明的。

在一個網絡/雲的環境裡,失敗隨時都可能發生,在某個分片/節點不知怎麼的就處於離線狀態,或者由於任何原因消失了,這種情況下,有一個故障轉移機制是非常有用並且是強烈推薦的。為此目的,Elasticsearch允許你創建分片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。

複製之所以重要,有兩個主要原因:

  • 在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到複製分片從不與原/主要(original/primary)分片置於同一節點上是非常重要的。
  • 擴展你的搜索量/吞吐量,因為搜索可以在所有的複製上並行運行

總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(意思是沒有複製)或多次。一旦複製了,每個索引就有了主分片(作為複製源的原來的分片)和複製分片(主分片的拷貝)之別。分片和複製的數量可以在索引創建的時候指定。在索引創建之後,你可以在任何時候動態地改變複製的數量,但是你事後不能改變分片的數量。

默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個複製,這意味著,如果你的集群中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。

kibana

Kibana 是一個為 Logstash 和 ElasticSearch 提供的日誌分析的 Web 接口。可使用它對日誌進行高效的搜索、可視化、分析等各種操作。

logstash

Logstash 是一款強大的數據處理工具,它可以實現數據傳輸,格式處理,格式化輸出,還有強大的插件功能,常用於日誌處理。

工作流程:

input 數據輸入端,可以接收來自任何地方的源數據。

  • file:從文件中讀取
  • syslog:監聽在514端口的系統日誌信息,並解析成RFC3164格式。
  • redis:從redis-server list 中獲取
  • beat:接收來自Filebeat的事件

Filter 數據中轉層,主要進行格式處理,數據類型轉換、數據過濾、字段添加,修改等,常用的過濾器如下。

  • grok: 通過正則解析和結構化任何文本。Grok 目前是logstash最好的方式對非結構化日誌數據解析成結構化和可查詢化。logstash內置了120個匹配模式,滿足大部分需求。
  • mutate: 在事件字段執行一般的轉換。可以重命名、刪除、替換和修改事件字段。
  • drop: 完全丟棄事件,如debug事件。
  • clone: 複製事件,可能添加或者刪除字段。
  • geoip: 添加有關IP地址地理位置信息。

output 是logstash工作的最後一個階段,負責將數據輸出到指定位置,兼容大多數應用,常用的有:

elasticsearch: 發送事件數據到 Elasticsearch,便於查詢,分析,繪圖。

  • file: 將事件數據寫入到磁盤文件上。
  • mongodb:將事件數據發送至高性能NoSQL mongodb,便於永久存儲,查詢,分析,大數據分片。
  • redis:將數據發送至redis-server,常用於中間層暫時緩存。
  • graphite: 發送事件數據到graphite。http://graphite.wikidot.com/
  • statsd: 發送事件數據到 statsd。

方案2-hadoop,hbase,hive

hadoop

一個分佈式系統基礎架構,由Apache基金會所開發。用戶可以在不瞭解分佈式底層細節的情況下,開發分佈式程序。充分利用集群的威力進行高速運算和存儲。 Hadoop實現了一個分佈式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬件上;而且它提供高傳輸率(high throughput)來訪問應用程序的數據,適合那些有著超大數據集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)文件系統中的數據。Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的數據提供了存儲,則MapReduce為海量的數據提供了計算。

hbase

HBase是一個分佈式的、面向列的開源數據庫,該技術來源於 FayChang 所撰寫的Google論文“Bigtable:一個結構化數據的分佈式存儲系統”。就像Bigtable利用了Google文件系統(File System)所提供的分佈式數據存儲一樣,HBase在Hadoop之上提供了類似於Bigtable的能力。HBase是Apache的hadoop項目的子項目。HBase不同於一般的關係數據庫,它是一個適合於非結構化數據存儲的數據庫。另一個不同的是HBase基於列的而不是基於行的模式。

hive

Hive是一個數據倉庫,它部署在Hadoop集群上,它的數據是存儲在HDFS上的,Hive所建的表在HDFS上對應的是一個文件夾,表的內容對應的是一個文件。它不僅可以存儲大量的數據而且可以對存儲的數據進行分析,但它有個缺點就是不能實時的更新數據,無法直接修改和刪除數據,如果想要修改數據需要先把數據所在的文件下載下來,修改完之後再上傳上去。Hive的語法非常類似於我們的MySQL語句,所以上起手來特別容易。HIve特別神奇的地方是我們只需寫一條SQL語句它就會自動轉換為MapReduce任務去執行,不用我們再手動去寫MapReduce了。

方案對比

Hadoop在設計上就是一個分佈式的,面向批處理的平臺,用以處理大數據集。雖然它是一個非常強大的工具,但它的批處理的本質意味著在處理結果時需要花費一定時間。此外,用戶必需重新為各種操作編寫代碼。Hive或者Pig這樣的類庫能起到一定作用,但不能完全解決問題,想象一下在Map/Reduce中重新實現地理位置查詢的難度吧。

而使用Elasticsearch,你就可以將搜索工作交給搜索引擎去完成,而專注於其它方面的工作,例如數據轉換。Elasticsearch-Hadoop項目為Hadoop提供了直接的整合功能,因此用戶使用起來沒有任何障礙,我們為vanilla Map/Reduce提供了專門的InputFormat與OutputFormat,為Cascading的數據讀寫提供了Taps,併為Pig和Hive提供了Storages。這樣你就可以以HDFS一樣方式的訪問Elasticsearch的數據了。

通常來說,與Hadoop進行整合的數據存儲系統都可能會成為系統的瓶頸,這是由於每個job在集群中的各種任務會造成大量的請求。而Map/Reduce模型的分佈式特性用於Elasticsearch上會配合得非常良好,因為我們能夠將某個特定查詢所生產的Map/Reduce任務數量與Elasticsearch的分片數量相關聯。這樣每次有查詢運行時,系統就會動態地按照Hadoop的劃分生成一個數值,該數值與Elasticsearch的可用分片數量成正比,這樣各個job就能夠並行地運行了。你可以按照Elasticsearch的數量對Hadoop集群進行擴展,或者是反過來也可以。

此外,這種整合將分片的信息暴露給Hadoop,以此可以實現協同定位。Job的任務會在每個Elasticsearch分片所在的同一臺機器上運行,通過實現數據本地化消除了網絡的開銷,並改善了性能。出於這個原因,我們建議你在相同的機器上運行Elasticsearch和Hadoop集群,尤其是他們能夠互相平衡資源的使用情況(I/O與CPU)。

最後但也是很重要的一點是,Elasticsearch能夠提供近乎實時的響應速度(毫秒等級),這極大的改善了Hadoop job的執行速度以及執行的各種開銷,在類似於Amazon EMR這種“租用的資源”上運行時的改善尤其明顯。

本公司應用場合

基本現在在的數據容量來說,用hadoop或spark有點過於龐大了,而elasticsearch是現在應用的比較多,也比較熟練。數據的導入可以進一步研究logstash對excel的擴展,或是直接使用java寫出數據讀入接口,將數據讀入elasticsearch。最大化elastic的搜索與聚合作用,完全可以滿足現有的業務需求。而且hadoop在搜索上肯定是比不上elasticsearch的。相對來說elk的輕量級,易佈署都比較貼合公司的實際應用場景。

比如,可以採用spring-boot搭建的web後臺框架,處理一些輸入及格式化輸出,到定製化的前端。

回到目錄

(1) Hadoop: Setting up a Single Node Cluster.

(2) HBase

(3) Apache HBase™ Reference Guide

(4) elastic offical website


分享到:


相關文章: