1.前言
我在之前的文章當中,介紹了很多有關(guān)于Flink的相關(guān)知識和內(nèi)容。因為我目前階段所做的學(xué)習和工作的內(nèi)容就是圍繞著這一部分知識進行的。但是在進行數(shù)據(jù)計算的時候,F(xiàn)Link是沒有辦法單獨進行計算的,所以還需要使用消息隊列與Flink結(jié)合起來,那這個消息隊列,必然是Kafka。因為Kafka與Flink實在是太契合了。所以接下來,就讓我從Kafka的組成架構(gòu)開始,圍繞著kafka的生產(chǎn)者、kafka本身、kafka消費者這幾個階段,來為大家介紹一下這款與flink親密度極高的消息隊列。
2.kafka簡單介紹
大家都知道kafka是一個消息隊列,它的本質(zhì)就是完成對數(shù)據(jù)的傳輸工作。這就是代表著,Kafka除了傳輸功能外的其他功能,都是為了Kafka能夠更好的傳輸數(shù)據(jù)而延伸出來的。就比如,開發(fā)人員希望Kafka能夠更好的傳輸數(shù)據(jù),所以為它設(shè)計了分布式結(jié)構(gòu),由多個broker組成一個大的Kafka集群。然后為了提高吞吐量,又引入了topic的概念,讓數(shù)據(jù)的發(fā)送方和拉取方都面向?qū)?yīng)的topic進行工作,topic本身實際上是一個邏輯上的概念,在其內(nèi)部是由partition完成工作的。也就是說,一個topic內(nèi)部可能會有多個partition,多個partition一起來完成對應(yīng)topic的工作內(nèi)容,使得kafka的并發(fā)能力得到了增強,數(shù)據(jù)的傳輸就會更棒。
但用這種方式雖然提高的傳輸?shù)男?,但是傳輸?shù)臅r候數(shù)據(jù)還會面臨丟失的問題,所以這個時候就引入了副本、落盤、偏移量這些概念。大家設(shè)想一下,當數(shù)據(jù)的發(fā)送方向kafka傳輸數(shù)據(jù),topic接收到數(shù)據(jù)之后,由其附屬的partition來進行工作,如果partition壞掉了,那這個partition中的數(shù)據(jù)就會丟失,那整體的程序就面臨著數(shù)據(jù)丟失的危害,所以針對partition分區(qū),要對每一個分區(qū)設(shè)置規(guī)定數(shù)量的副本數(shù),這樣即使正在工作的分區(qū)壞掉了,也會有其他的副本分區(qū)代替它進行工作,這樣就在partition階段保證了數(shù)據(jù)的不丟失,但是設(shè)置副本之后,還需要知道哪個分區(qū)是主、哪個分區(qū)是從。這就引入了ISR隊列機制。partition階段的東西處理完了之后,又有新的問題出現(xiàn)。如果萬一突然停電,那就算kafka中有一萬個分區(qū)副本也是毛用沒有,所以為了能夠讓數(shù)據(jù)即使發(fā)生停電也不丟數(shù)據(jù),kafka又加入了落盤的概念,將數(shù)據(jù)保存在磁盤上,停電了也沒什么問題了。
那就算將數(shù)據(jù)保存在磁盤上,也會有新的問題,數(shù)據(jù)一旦落盤就要序列化和反序列化,并且還有進行IO操作,這就很浪費時間,所以Kfaka開發(fā)者們又重新定義了序列化機制,并且還加入了磁盤順序?qū)懭氲母拍睿寯?shù)據(jù)的落盤能達到600M/s。這樣就解決了數(shù)據(jù)丟失的問題。
接下來就是最后一個問題了,故障恢復(fù)之后,怎么找到故障之前處理到哪條數(shù)據(jù)了呢?這個時候就加入了偏移量的概念,由kafka內(nèi)置的系統(tǒng)主題來維護所有topic的數(shù)據(jù)偏移量,當故障恢復(fù)的情況一旦發(fā)生,就會讀取對應(yīng)topic中的偏移量,在落盤處找到其對應(yīng)的數(shù)據(jù),恢復(fù)到之前的位置。
上面的這些內(nèi)容,就是kafka常用到的所有概念了,只不過現(xiàn)階段我描述的比較籠統(tǒng),不過請大家放心,在后面我會從生產(chǎn)者、kafka本身、消費者這三個角度來給朋友們講解,算上這篇文章一共會有4個,希望大家讀完這篇文章之后,能夠?qū)afka的整體有一個清晰的認識。
3.kafka組成架構(gòu)
在kafka工作的時候,需要明確一些概念,才好方便大家使用。為了大家能夠更好的明白我在說什么,我先用一個圖來表示kafka工作的時候,都有哪些東西在干活。

這個圖大概就是這個樣子的,如果kafka想要運行,上面的這些內(nèi)容是一個都不能少的。不過我感覺我的圖畫的有點亂,所以接下來我先給大家一一介紹這些組件,然后再從宏觀的角度上去講講工作時候的流程。
1.生產(chǎn)者:生產(chǎn)者的概念是根據(jù)kafka提出的,指的就是負責向kafka發(fā)送數(shù)據(jù)的客戶端。
2.消費者:消費者的概念也是根據(jù)kafka提出的,指的就是從kafka中拉取數(shù)據(jù)的客戶端。
3.消費者組:是由多個消費者聯(lián)合起來,形成的一個“大”的消費者,它能夠同時獲取一個topic中多個partition中的數(shù)據(jù)進行消費,通過提升吞吐量的方式加快數(shù)據(jù)的處理速度。如果kafka一個分區(qū)內(nèi)部有多個partition,那這個時候可以設(shè)置Flink的并行度為分區(qū)數(shù),或者是小于分區(qū)數(shù)的二進制數(shù)。
4.kafka集群:由多個broker組成,以集群的方式處理數(shù)據(jù)。
5.broker:一臺kafka服務(wù)器就是一個broker,一個broker里面可以包含很多個topic。
6.topic:比較重要的一個概念,生產(chǎn)者和消費者都是面向它進行工作的,但它本身是一個邏輯上的概念。可以把它看成是一個消息隊列。
7.partition:這個概念也很重要,因為它是kafka組件中主要負責干活的那一個。它本身是一個內(nèi)部有序的消息隊列,多個partition能夠組成一個topic,并且如果topic足夠大,甚至能夠散落在很多個broker上。
8.Replica:副本,大家可以看我的這個圖,是不是partition后面有一個字母L或者F,L就是leader,F(xiàn)就是Follow。L是干活的,F(xiàn)是保證其數(shù)據(jù)不丟失的。
9.Leader:分區(qū)副本中的大哥,負責干活的那一個。
10.Follow:分區(qū)副本中的小弟,負責維護數(shù)據(jù)副本,平時就從leader上同步點數(shù)據(jù),然后隨時等待上位。
11.zk集群:沒有zk就沒辦法使用kafka,因為zk上維護了kafka一些重要的信息內(nèi)容,就比如分區(qū)副本的名稱以及其主從身份信息。
上述的這些概念就是kafka運行時候的基本概念了,掌握了它們之后就對kafka有一個基本的認知了。不過接下來我還要給大家嘮叨一下,kafka輕度級別的工作流程。
1.生產(chǎn)者發(fā)送數(shù)據(jù)給kafka中對應(yīng)的topic。
2.topic是邏輯上的概念,底層干活的是內(nèi)部有序分區(qū)間無序的partition,當有數(shù)據(jù)進來partition就開始工作。
3.partition工作分為Leader工作和Follower工作,Leader負責接收數(shù)據(jù),F(xiàn)ollower負責從Leader上同步數(shù)據(jù)。這個時候能被消費者消費到的數(shù)據(jù)內(nèi)容,是同步速度最慢的那個Follower的數(shù)據(jù)位置的數(shù)據(jù)。
4.消費者進行數(shù)據(jù)消費。