從本文開始,Flume我們就告一段落了,接下來我們來講述Kafka的相關內容,Kafka是一個分布式的基于發布/訂閱模式的訊息佇列,主要應用于大資料實時處理領域,關注專欄《破繭成蝶——大資料篇》,查看更多相關的內容~
目錄
一、Kafka概述
二、訊息佇列
三、Kafka的特點
四、Kafka的架構
五、訊息發送的流程
六、Kafka的應用場景
一、Kafka概述
Kafka是分布式發布-訂閱訊息系統,它最初由LinkedIn公司開發,之后成為Apache專案的一部分,Kafka是一個分布式的,可劃分的,冗余備份的持久性的日志服務,它主要用于處理活躍的流式資料,
在大資料系統中,常常會碰到一個問題,整個大資料是由各個子系統組成,資料需要在各個子系統中高性能,低延遲的不停流轉,傳統的企業訊息系統并不是非常適合大規模的資料處理,為了同時搞定在線應用(訊息)和離線應用(資料檔案,日志)Kafka就出現了,Kafka可以起到兩個作用:(1)降低系統組網復雜度,(2)降低編程復雜度,各個子系統不在是相互協商介面,各個子系統類似插口插在插座上,Kafka承擔高速資料總線的作用,
二、訊息佇列
訊息佇列有兩種模式,一種是點對點式,一種是發布/訂閱模式,Kafka屬于后者,
點對點模式即一對一,消費者主動拉取資料,訊息收到后訊息清除,訊息生產者生產訊息發送到佇列中,然后訊息消費者從佇列中取出并且消費訊息,訊息被消費以后,佇列中不再有存盤,所以訊息消費者不可能消費到已經被消費的訊息,佇列支持存在多個消費者,但是對一個訊息而言,只會有一個消費者可以消費,
發布/訂閱模式即一對多,消費者消費資料之后不會清除訊息,訊息生產者(發布)將訊息發布到topic中,同時有多個訊息消費者(訂閱)消費該訊息,和點對點方式不同,發布到topic的訊息會被所有訂閱者消費,
三、Kafka的特點
(1)同時為發布和訂閱提供高吞吐量,據了解,Kafka每秒可以生產約25萬訊息(50 MB),每秒處理55萬訊息(110 MB),
(2)可進行持久化操作,將訊息持久化到磁盤,因此可用于批量消費,例如ETL,以及實時應用程式,通過將資料持久化到硬碟以及replication防止資料丟失,
(3)分布式系統,易于向外擴展,所有的producer、broker和consumer都會有多個,均為分布式的,無需停機即可擴展機器,
(4)訊息被處理的狀態是在consumer端維護,而不是由server端維護,當失敗時能自動平衡,
(5)支持online和offline的場景,
四、Kafka的架構

Kafka的整體架構非常簡單,是顯式分布式架構,producer、broker(kafka)和consumer都可以有多個,producer,consumer實作Kafka注冊的介面,資料從producer發送到broker,broker承擔一個中間快取和分發的作用,broker分發注冊到系統中的consumer,broker的作用類似于快取,即活躍的資料和離線處理系統之間的快取,客戶端和服務器端的通信,是基于簡單、高性能且與編程語言無關的TCP協議,以下是幾個基本概念:
1、Topic:特指Kafka處理的訊息源(feeds of messages)的不同分類,
2、Partition:Topic物理上的分組,一個topic可以分為多個partition,每個partition是一個有序的佇列,partition中的每條訊息都會被分配一個有序的id(offset),
3、Message:訊息,是通信的基本單位,每個producer可以向一個topic(主題)發布一些訊息,
4、Producers:訊息和資料生產者,向Kafka的一個topic發布訊息的程序叫做producers,
5、Consumers:訊息和資料消費者,訂閱topics并處理其發布的訊息的程序叫做consumers,
6、Broker:快取代理,Kafka集群中的一臺或多臺服務器統稱為broker,
7、Segment:partition物理上的分組由多個segment組成,
8、Offset:每個partition都由一系列有序的、不可變的訊息組成,這些訊息被連續的追加到partition中,Partition中的每個訊息都有一個連續的序列號叫做offset,用于partition唯一表示一條訊息,
9、Consumer Group(CG):消費者組,由多個consumer組成,消費者組內每個消費者負責消費不同磁區的資料,一個磁區只能由一個消費者消費;消費者組之間互不影響,所有的消費者都屬于某個消費者組,即消費者組是邏輯上的一個訂閱者,
五、訊息發送的流程

Producer根據指定的partition方法(round-robin、hash等),將訊息發布到指定topic的partition里面,kafka集群接收到Producer發過來的訊息后,將其持久化到硬碟,并保留訊息指定時長(可配置),而不關注訊息是否被消費,Consumer從kafka集群pull資料,并控制獲取訊息的offset,
六、Kafka的應用場景
1、訊息佇列
比起大多數的訊息系統來說,Kafka有更好的吞吐量,內置的磁區,冗余及容錯性,這讓Kafka成為了一個很好的大規模訊息處理應用的解決方案,訊息系統一般吞吐量相對較低,但是需要更小的端到端延時,并嘗嘗依賴于Kafka提供的強大的持久性保障,在這個領域,Kafka足以媲美傳統訊息系統,如ActiveMR或RabbitMQ,
2、行為跟蹤
Kafka的另一個應用場景是跟蹤用戶瀏覽頁面、搜索及其他行為,以發布-訂閱的模式實時記錄到對應的topic里,那么這些結果被訂閱者拿到后,就可以做進一步的實時處理,或實時監控,或放到Hadoop/離線資料倉庫里處理,
3、元資訊監控
作為操作記錄的監控模塊來使用,即匯集記錄一些操作資訊,可以理解為運維性質的資料監控吧,
4、日志收集
日志收集方面,其實開源產品有很多,包括Scribe、Apache Flume,很多人使用Kafka代替日志聚合(log aggregation),日志聚合一般來說是從服務器上收集日志檔案,然后放到一個集中的位置(檔案服務器或HDFS)進行處理,然而Kafka忽略掉檔案的細節,將其更清晰地抽象成一個個日志或事件的訊息流,這就讓Kafka處理程序延遲更低,更容易支持多資料源和分布式資料處理,比起以日志為中心的系統比如Scribe或者Flume來說,Kafka提供同樣高效的性能和因為復制導致的更高的耐用性保證,以及更低的端到端延遲,
5、流處理
這個場景可能比較多,也很好理解,保存收集流資料,以提供之后對接的Storm或其他流式計算框架(Spark Streaming Flink)進行處理,很多用戶會將那些從原始topic來的資料進行階段性處理,匯總,擴充或者以其他的方式轉換到新的topic下再繼續后面的處理,例如一個文章推薦的處理流程,可能是先從RSS資料源中抓取文章的內容,然后將其丟入一個叫做“文章”的topic中;后續操作可能是需要對這個內容進行清理,比如回復正常資料或者洗掉重復資料,最后再將內容匹配的結果返還給用戶,這就在一個獨立的topic之外,產生了一系列的實時資料處理的流程,Strom和Samza是非常著名的實作這種型別資料轉換的框架,
6、事件源
事件源是一種應用程式設計的方式,該方式的狀態轉移被記錄為按時間順序排序的記錄序列,Kafka可以存盤大量的日志資料,這使得它成為一個對這種方式的應用來說絕佳的后臺,比如動態匯總(News feed),
7、持久性日志(commit log)
Kafka可以為一種外部的持久性日志的分布式系統提供服務,這種日志可以在節點間備份資料,并為故障節點資料回復提供一種重新同步的機制,Kafka中日志壓縮功能為這種用法提供了條件,在這種用法中,Kafka類似于Apache BookKeeper專案,
以上就是Kafka的基本介紹,你們在此程序中遇到了什么問題,歡迎留言,讓我看看你們都遇到了哪些問題~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263786.html
標籤:其他
上一篇:Hive insert overwrite時設定lzo壓縮格式報錯:NATIVE-LZO LIBRARY NOT AVAILABLE 解決方案
