隨著移動互聯(lián)網(wǎng)漩怎、云計算、物聯(lián)網(wǎng)的崛起與發(fā)展嗦嗡,大數(shù)據(jù)的時代已經(jīng)來臨勋锤。當(dāng)數(shù)據(jù)量不停增長時,如何實時查詢和分析業(yè)務(wù)的狀況變的業(yè)務(wù)狀況變的越來越重要侥祭。
本文主要包含以下幾個方面:
- 數(shù)據(jù)采集
- 消息隊列
- 數(shù)據(jù)存儲
- 離線分析
當(dāng)數(shù)據(jù)產(chǎn)生時叁执,通過flume客戶端去采集數(shù)據(jù)茄厘,然后放入kafka消息隊列中,接著通過flume服務(wù)端去消費這個數(shù)據(jù)谈宛,最終把數(shù)據(jù)放入es次哈、hbase、mongodb等數(shù)據(jù)庫中吆录。
1. 數(shù)據(jù)采集
Flume是一個分布式的窑滞、高可用的日志收集系統(tǒng)。Flume-NG采用三層架構(gòu)設(shè)計:收集(source)恢筝、暫存(channel)哀卫、處理(sink)。如圖所示:
1.1 source
source用來對接各種數(shù)據(jù)源滋恬,將收集到的數(shù)據(jù)存入channel中聊训。
常用的source類型有Avro source、Exec source恢氯、Kafka source等。
Avro source通過監(jiān)聽Avro端口接收外部客服端流事件鼓寺,在flume多層架構(gòu)中常被用來接收上層agent sink發(fā)送的event勋拟。
Kafka source用來對接分布式消息隊列kafka,作為kafka的消費者持續(xù)從kafka中拉取數(shù)據(jù)妈候。
Exec source收集標(biāo)準(zhǔn)輸出數(shù)據(jù)或者通過tail -f file的方式監(jiān)聽指定文件敢靡。但是不支持?jǐn)帱c續(xù)傳(不記錄讀取文件的位置)。
1.2 channel
channel為event中的緩沖區(qū)苦银,存儲source收集并且沒有被sink讀取的event,平衡source收集和sink讀取數(shù)據(jù)的速度幔虏,相當(dāng)于flume內(nèi)部的消息隊列纺念。
常用的channel類型有memory channel想括、file channel烟逊、kafka channel。
memory channel讀寫速度快位迂,但是存儲小访雪,flume進程掛掉時予颤,數(shù)據(jù)會丟失。
file channel將event寫入磁盤文件冬阳,存儲大蛤虐,無數(shù)據(jù)丟失風(fēng)險。
kafka channel將kafka作為channel存儲肝陪。kafka channel相對于memory channel和file channel存儲容量大驳庭,容錯能力強。在日志收集層氯窍,可以只配置source組件和kafka channel組件饲常,不需要再配置sink組件,可以減少日志收集層啟動的進程數(shù)并且有效降低服務(wù)器內(nèi)存狼讨、磁盤等資源使用率贝淤。再日志匯聚層,可以只配置kafka channel和sink政供,不需要再配置source播聪,減少日志匯聚層的進程數(shù),這樣能降低服務(wù)器的資源利用率和減少event再網(wǎng)絡(luò)之間的傳輸布隔,有效提高日志采集系統(tǒng)的性能离陶。
1.3 sink
avro sink常用來對接下一層的avro source,通過發(fā)送rpc請求將event發(fā)送到下一層的avro source衅檀。
hdfs sink用來將event寫入hdfs文件存儲招刨。
kafka sink將evnet寫入到kafka主題中。
本文采用exec source作為source哀军,channel采用file channel沉眶,sink采用kafka sink。這樣可以采集不同的數(shù)據(jù)源杉适,然后分發(fā)到不同的kafka topic中谎倔。
2. 消息隊列
kafka是一個開源的分布式消息隊列,具有高吞吐淘衙、可擴展传藏、高可用的特性。
一個kafka集群可以有多個kafka實例彤守,由zookeeper協(xié)調(diào)管理(保存kafka元數(shù)據(jù)毯侦、動態(tài)擴展、負載均衡)具垫。一個kafka實例就是一個broker侈离。broker中有包含topic,topic相當(dāng)于一個數(shù)據(jù)庫表筝蚕,一個topic可以分為多個partition和多個replication卦碾。producer將同一類型的消息寫入同一個topic中铺坞,consumer從同一個topic消費同一類型的數(shù)據(jù)。
kafka之所以能夠?qū)崿F(xiàn)高吞吐洲胖、可擴展济榨、高可用,是因為它基于磁盤順序讀寫(比內(nèi)存讀寫性能還高)绿映,pagecache擒滑、sendfile技術(shù)(零拷貝)、多分區(qū)(一個分區(qū)代表一個線程)叉弦。
3. 數(shù)據(jù)存儲
flume服務(wù)端通過消費kafka中的topic丐一,把日志寫入到各個數(shù)據(jù)庫中。
3.1 HBase
HBase是一個分布式的淹冰、持久的库车、強一致性的存儲系統(tǒng),具有盡似最優(yōu)的寫性能和出色的讀性能樱拴。HBase和傳統(tǒng)型關(guān)系型數(shù)據(jù)庫相比柠衍,就是使用了LSM樹做為底層數(shù)據(jù)結(jié)構(gòu)。LSM樹以磁盤傳輸速率工作并能較好地擴展以處理大量的數(shù)據(jù)疹鳄,它們使用日志文件和內(nèi)存存儲來將隨機寫轉(zhuǎn)換成順序?qū)懪÷裕虼艘材鼙WC穩(wěn)定的數(shù)據(jù)插入速率。又由于讀寫?yīng)毩⒈窆虼藘煞N操作之間沒有沖突。
Hbase中有3個主要組件:客戶端庫禽最、一臺主服務(wù)器和多臺region服務(wù)器腺怯。region服務(wù)器可以根據(jù)負載的變化動態(tài)添加和移除。主服務(wù)器主要負責(zé)利用zookeeper為region服務(wù)器分配region川无。
主服務(wù)器不負責(zé)數(shù)據(jù)服務(wù)呛占,只提供region管理和元數(shù)據(jù)的管理。region服務(wù)器提供讀寫服務(wù)懦趋。HBase主要處理兩種文件晾虑,預(yù)寫日志和實際的數(shù)據(jù)文件,兩者由HRegionServer管理仅叫。
HBase中的行鍵設(shè)計非常重要帜篇,它是用來定位具體一行的數(shù)據(jù)的,通過行鍵的查詢是最快的诫咱。但是如果按照特定序列來命名笙隙,容易造成region熱點,在某一時間段數(shù)據(jù)全往一個region中寫坎缭。一般通過加入salt或者哈希隨機化來設(shè)計行鍵竟痰。但反過來签钩,隨機寫帶來的一個壞處是會造成順序讀的性能下降。
3.2 Hive
Hive是一個建立在Hadoop架構(gòu)上的數(shù)據(jù)倉庫坏快。它能夠提供數(shù)據(jù)的精煉铅檩,查詢和分析。它可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表莽鸿,并提供sql查詢功能昧旨。
Hive可以映射hdfs或者hbase來建立外表,然后通過hql語句來查詢相應(yīng)的數(shù)據(jù)富拗。同時可以按天建立分區(qū)表臼予,減少查詢的數(shù)據(jù)量。值得注意的是啃沪,外表以及通過外表建立的分區(qū)表粘拾,在刪表時并不會刪除數(shù)據(jù)。
3.3 Elasticsearch
Elasticsearch是一款開源的创千、分布式的缰雇、restful風(fēng)格的搜索引擎。它內(nèi)部使用Lucene做索引與搜索追驴。它有如下特點:
- 一個分布式的實時文檔存儲械哟,每個字段可以被索引與搜索
- 一個分布式實時分析搜索引擎
- 能勝任上百個服務(wù)器節(jié)點的擴展,并支持PB級別的結(jié)構(gòu)化或者非結(jié)構(gòu)化的數(shù)據(jù)
4. 離線分析
Spark是一款開源的分布式大數(shù)據(jù)處理通用引擎殿雪,具有高吞吐暇咆、低延時、可擴展丙曙、高容錯等特點爸业。它包括離線計算、交互式查詢亏镰、數(shù)據(jù)挖掘算法扯旷、流式計算及圖計算。
Spark包含以下幾個組件:
)
Apache Spark core
Apache Spark core是spark平臺的核心組件索抓,其他組件都依賴于它钧忽。它主要負責(zé):
- 內(nèi)存管理和故障恢復(fù)
- 在集群上安排、分布和監(jiān)控作業(yè)
- 和存儲系統(tǒng)進行交互
Spark SQL
Spark SQL是Spark Core之上的一個組件逼肯,它引入了一個稱為SchemaRDD的新數(shù)據(jù)抽象耸黑,它為結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)提供支持(Hive等)。
如果配置支持hive汉矿,當(dāng)Spark SQL進行編程或者查詢時崎坊,可以使用HiveSQL作為查詢語言。
Spark Streaming
Spark Streaming利用Spark Core的快速調(diào)度功能來執(zhí)行流式分析洲拇。它以小批量獲取數(shù)據(jù)奈揍,并對這些小批量的數(shù)據(jù)執(zhí)行RDD(彈性分布式數(shù)據(jù)集)轉(zhuǎn)換曲尸。
MLib
MLlib是Spark之上的分布式機器學(xué)習(xí)框架,因為基于分布式內(nèi)存的Spark架構(gòu)男翰。根據(jù)基準(zhǔn)另患,它是由MLlib開發(fā)人員針對交替最小二乘法(ALS)實現(xiàn)完成的。 Spark MLlib是基于Hadoop磁盤的Apache Mahout版本的9倍(在Mahout獲得了Spark接口之前)蛾绎。
GraphX
GraphX是Spark上的一個分布式圖形處理框架冒版。它提供了一個用于表達圖形計算的API逆趋,可以通過使用Pregel抽象API為用戶定義的圖形建模。它還為此抽象提供了一個優(yōu)化的運行時。
相對于Hadoop明郭,spark采用了DAG執(zhí)行引擎栏尚,支持循環(huán)數(shù)據(jù)流和內(nèi)存計算到逊,在內(nèi)存中的速度是hadoop的100倍吮便,磁盤上的速度是hadoop的10倍。
Spark實現(xiàn)了DAG的計算模型镜粤,DAG計算模型是指將一個任務(wù)按照計算規(guī)則分解為若干子任務(wù)捏题,這些子任務(wù)之間根據(jù)邏輯關(guān)系構(gòu)建有向無環(huán)圖。
Spark計算操作都是基于RDD進行的肉渴。RDD具體只讀公荧、多分區(qū)、分布式的特性同规。外部的文件系統(tǒng)的文件如hbase循狰,hdfs都可以轉(zhuǎn)換為RDD。同時一個或者多個RDD可以轉(zhuǎn)換為新的RDD券勺。
RDD提供Transformation和Action兩種計算類型晤揣。Transformation的操作只有當(dāng)Action的時候才會真正的執(zhí)行操作。同時RDD可以緩存到內(nèi)存或者磁盤中朱灿,這樣可以減少網(wǎng)絡(luò)傳輸次數(shù),提高spark的計算性能钠四。