0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文讀懂什么是分布式流處理系統(tǒng)Kafka

馬哥Linux運(yùn)維 ? 2017-12-12 09:14 ? 次閱讀

什么是Kafka

Kafka是一個(gè)分布式流處理系統(tǒng),流處理系統(tǒng)使它可以像消息隊(duì)列一樣publish或者subscribe消息,分布式提供了容錯(cuò)性,并發(fā)處理消息的機(jī)制。

Kafka的基本概念

kafka運(yùn)行在集群上,集群包含一個(gè)或多個(gè)服務(wù)器。kafka把消息存在topic中,每一條消息包含鍵值(key),值(value)和時(shí)間戳(timestamp)。

kafka有以下一些基本概念:

Producer - 消息生產(chǎn)者,就是向kafka broker發(fā)消息的客戶端。

Consumer - 消息消費(fèi)者,是消息的使用方,負(fù)責(zé)消費(fèi)Kafka服務(wù)器上的消息。

Topic - 主題,由用戶定義并配置在Kafka服務(wù)器,用于建立Producer和Consumer之間的訂閱關(guān)系。生產(chǎn)者發(fā)送消息到指定的Topic下,消息者從這個(gè)Topic下消費(fèi)消息。

Partition - 消息分區(qū),一個(gè)topic可以分為多個(gè) partition,每個(gè)partition是一個(gè)有序的隊(duì)列。partition中的每條消息都會(huì)被分配一個(gè)有序的id(offset)。

Broker - 一臺(tái)kafka服務(wù)器就是一個(gè)broker。一個(gè)集群由多個(gè)broker組成。一個(gè)broker可以容納多個(gè)topic。

Consumer Group - 消費(fèi)者分組,用于歸組同類消費(fèi)者。每個(gè)consumer屬于一個(gè)特定的consumer group,多個(gè)消費(fèi)者可以共同消息一個(gè)Topic下的消息,每個(gè)消費(fèi)者消費(fèi)其中的部分消息,這些消費(fèi)者就組成了一個(gè)分組,擁有同一個(gè)分組名稱,通常也被稱為消費(fèi)者集群。

Offset - 消息在partition中的偏移量。每一條消息在partition都有唯一的偏移量,消息者可以指定偏移量來(lái)指定要消費(fèi)的消息。

Kafka分布式架構(gòu)

如上圖所示,kafka將topic中的消息存在不同的partition中。如果存在鍵值(key),消息按照鍵值(key)做分類存在不同的partiition中,如果不存在鍵值(key),消息按照輪詢(Round Robin)機(jī)制存在不同的partition中。默認(rèn)情況下,鍵值(key)決定了一條消息會(huì)被存在哪個(gè)partition中。

partition中的消息序列是有序的消息序列。kafka在partition使用偏移量(offset)來(lái)指定消息的位置。一個(gè)topic的一個(gè)partition只能被一個(gè)consumer group中的一個(gè)consumer消費(fèi),多個(gè)consumer消費(fèi)同一個(gè)partition中的數(shù)據(jù)是不允許的,但是一個(gè)consumer可以消費(fèi)多個(gè)partition中的數(shù)據(jù)。

kafka將partition的數(shù)據(jù)復(fù)制到不同的broker,提供了partition數(shù)據(jù)的備份。每一個(gè)partition都有一個(gè)broker作為leader,若干個(gè)broker作為follower。所有的數(shù)據(jù)讀寫(xiě)都通過(guò)leader所在的服務(wù)器進(jìn)行,并且leader在不同broker之間復(fù)制數(shù)據(jù)。

上圖中,對(duì)于Partition 0,broker 1是它的leader,broker 2和broker 3是follower。對(duì)于Partition 1,broker 2是它的leader,broker 1和broker 3是follower。

在上圖中,當(dāng)有Client(也就是Producer)要寫(xiě)入數(shù)據(jù)到Partition 0時(shí),會(huì)寫(xiě)入到leader Broker 1,Broker 1再將數(shù)據(jù)復(fù)制到follower Broker 2和Broker 3。

在上圖中,Client向Partition 1中寫(xiě)入數(shù)據(jù)時(shí),會(huì)寫(xiě)入到Broker 2,因?yàn)锽roker 2是Partition 1的Leader,然后Broker 2再將數(shù)據(jù)復(fù)制到follower Broker 1和Broker 3中。

上圖中的topic一共有3個(gè)partition,對(duì)每個(gè)partition的讀寫(xiě)都由不同的broker處理,因此總的吞吐量得到了提升。

實(shí)驗(yàn)一:kafka-python實(shí)現(xiàn)生產(chǎn)者消費(fèi)者

kafka-python是一個(gè)python的Kafka客戶端,可以用來(lái)向kafka的topic發(fā)送消息、消費(fèi)消息。

這個(gè)實(shí)驗(yàn)會(huì)實(shí)現(xiàn)一個(gè)producer和一個(gè)consumer,producer向kafka發(fā)送消息,consumer從topic中消費(fèi)消息。結(jié)構(gòu)如下圖

producer代碼

consumer代碼

接下來(lái)創(chuàng)建test topic

打開(kāi)兩個(gè)窗口中,我們?cè)趙indow1中運(yùn)行producer,如下

在window2中運(yùn)行consumer,如下

可以看到window2中的consumer成功的讀到了producer寫(xiě)入的數(shù)據(jù)

實(shí)驗(yàn)二:消費(fèi)組實(shí)現(xiàn)容錯(cuò)性機(jī)制

這個(gè)實(shí)驗(yàn)將展示消費(fèi)組的容錯(cuò)性的特點(diǎn)。這個(gè)實(shí)驗(yàn)中將創(chuàng)建一個(gè)有2個(gè)partition的topic,和2個(gè)consumer,這2個(gè)consumer共同消費(fèi)同一個(gè)topic中的數(shù)據(jù)。結(jié)構(gòu)如下所示

producer部分代碼和實(shí)驗(yàn)一相同,這里不再重復(fù)。consumer需要指定所屬的consumer group,代碼如下

接下來(lái)我們創(chuàng)建topic,名字test,設(shè)置partition數(shù)量為2

打開(kāi)三個(gè)窗口,一個(gè)窗口運(yùn)行producer,還有兩個(gè)窗口運(yùn)行consumer。

運(yùn)行consumer的兩個(gè)窗口的輸出如下:

可以看到兩個(gè)consumer同時(shí)運(yùn)行的情況下,它們分別消費(fèi)不同partition中的數(shù)據(jù)。window1中的consumer消費(fèi)partition 0中的數(shù)據(jù),window2中的consumer消費(fèi)parition 1中的數(shù)據(jù)。

我們嘗試關(guān)閉window1中的consumer,可以看到如下結(jié)果

剛開(kāi)始window2中的consumer只消費(fèi)partition1中的數(shù)據(jù),當(dāng)window1中的consumer退出后,window2中的consumer中也開(kāi)始消費(fèi)partition 0中的數(shù)據(jù)了。

實(shí)驗(yàn)三:offset管理

kafka允許consumer將當(dāng)前消費(fèi)的消息的offset提交到kafka中,這樣如果consumer因異常退出后,下次啟動(dòng)仍然可以從上次記錄的offset開(kāi)始向后繼續(xù)消費(fèi)消息。

這個(gè)實(shí)驗(yàn)的結(jié)構(gòu)和實(shí)驗(yàn)一的結(jié)構(gòu)是一樣的,使用一個(gè)producer,一個(gè)consumer,test topic的partition數(shù)量設(shè)為1。

producer的代碼和實(shí)驗(yàn)一中的一樣,這里不再重復(fù)。consumer的代碼稍作修改,這里consumer中打印出下一個(gè)要被消費(fèi)的消息的offset。consumer代碼如下

在一個(gè)窗口中啟動(dòng)producer,在另一個(gè)窗口并且啟動(dòng)consumer。consumer的輸出如下

可以嘗試退出consumer,再啟動(dòng)consumer。每一次重新啟動(dòng),consumer都是從offset=98的消息開(kāi)始消費(fèi)的。

修改consumer的代碼如下,在consumer消費(fèi)每一條消息后將offset提交回kafka

啟動(dòng)consumer

可以看到consumer從offset=98的消息開(kāi)始消費(fèi),到offset=829時(shí),我們Ctrl+C退出consumer。

我們?cè)俅螁?dòng)consumer

可以看到重新啟動(dòng)后,consumer從上一次記錄的offset開(kāi)始繼續(xù)消費(fèi)消息。之后每一次consumer重新啟動(dòng),consumer都會(huì)從上一次停止的地方繼續(xù)開(kāi)始消費(fèi)。

本文主要介紹了一下kafka的基本概念,并結(jié)合一些實(shí)驗(yàn)幫助理解kafka中的一些難點(diǎn),如多個(gè)consumer的容錯(cuò)性機(jī)制,offset管理。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84069
  • kafka
    +關(guān)注

    關(guān)注

    0

    文章

    49

    瀏覽量

    5195

原文標(biāo)題:Python操作分布式流處理系統(tǒng)Kafka

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    分布式軟件系統(tǒng)

    。 分布式程序設(shè)計(jì)語(yǔ)言用于編寫(xiě)運(yùn)行于分布式計(jì)算機(jī)系統(tǒng)上的分布式程序。個(gè)分布式程序由若干個(gè)可以獨(dú)立執(zhí)行的程序模塊組成,它們
    發(fā)表于 07-22 14:53

    LED分布式原理

    本帖最后由 eehome 于 2013-1-5 09:49 編輯 1. 分布式技術(shù)分布式就是:在各并聯(lián)支路點(diǎn)均設(shè)立獨(dú)立恒流源,從而管理、維持、控制支路與整體線路穩(wěn)定。在使
    發(fā)表于 03-09 16:47

    如何設(shè)計(jì)分布式干擾系統(tǒng)?

    什么是分布式干擾系統(tǒng)?分布式干擾系統(tǒng)種綜合化、體化、小型化、網(wǎng)絡(luò)化和智能化
    發(fā)表于 08-08 06:57

    讀懂分布式架構(gòu)知識(shí)體系(內(nèi)含超全核心知識(shí)大圖)

    和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不致;Durabilit:事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失。分布式
    發(fā)表于 10-23 10:02

    分布式處理器的效率怎么提高?

    3和PSoC 5架構(gòu)的分布式處理技術(shù)示例,該架構(gòu)由個(gè)主CPU(在本例中為8051或ARM Cortex M3)、個(gè)DMA引擎、以及通用數(shù)字模塊(UDB)陣列構(gòu)成。UDB可高效用作
    發(fā)表于 11-07 07:01

    分布式系統(tǒng)的優(yōu)勢(shì)是什么?

    當(dāng)討論分布式系統(tǒng)時(shí),我們面臨許多以下這些形容詞所描述的 同類型: 分布式的、刪絡(luò)的、并行的、并發(fā)的和分散的。分布式處理
    發(fā)表于 03-31 09:01

    分布式的優(yōu)缺點(diǎn)是什么?

     分布式技術(shù)就是在需要恒的節(jié)點(diǎn)上串接,低壓差線性恒驅(qū)動(dòng)器。低壓差很重要,關(guān)系到產(chǎn)品驅(qū)動(dòng)效率。做到恒驅(qū)動(dòng)有很多種,其中低壓差線性恒
    發(fā)表于 04-01 09:03

    HarmonyOS鴻蒙操作系統(tǒng)之什么是“基于微內(nèi)核的全場(chǎng)景分布式操作系統(tǒng)”?

    分布式:這個(gè)要提它對(duì)應(yīng)的個(gè)詞來(lái)看,就是集中式;分布式是負(fù)責(zé)處理系統(tǒng)資源和控制程序運(yùn)行。它與集中式操作系統(tǒng)的區(qū)別在于資源管理、進(jìn)程通信和
    發(fā)表于 09-23 17:06

    分布式操作系統(tǒng)的相關(guān)資料分享

    文章目錄分布式操作系統(tǒng)嵌入操作系統(tǒng)集群操作系統(tǒng)集群系統(tǒng)管理
    發(fā)表于 12-22 07:23

    分布式測(cè)井曲線自動(dòng)處理系統(tǒng)的實(shí)現(xiàn)

    本文介紹了分布式測(cè)井?dāng)?shù)據(jù)自動(dòng)處理系統(tǒng)的研究與實(shí)現(xiàn);詳細(xì)介紹了測(cè)井曲線自動(dòng)處理系統(tǒng)的模塊與組成;論述了分布式并行數(shù)據(jù)處理,人機(jī)交互,神經(jīng)網(wǎng)絡(luò)算
    發(fā)表于 06-15 10:34 ?8次下載

    采用DSP芯片的分級(jí)分布式管理系統(tǒng)設(shè)計(jì)

    采用DSP芯片的分級(jí)分布式管理系統(tǒng)設(shè)計(jì) 概述:通過(guò)個(gè)兩級(jí)分布式圖像處理系統(tǒng)中管理計(jì)算機(jī)的實(shí)現(xiàn),闡述基于DSP的控制電路的設(shè)計(jì)方法以及對(duì)兩
    發(fā)表于 03-07 12:58 ?559次閱讀
    采用DSP芯片的分級(jí)<b class='flag-5'>分布式</b>管理<b class='flag-5'>系統(tǒng)</b>設(shè)計(jì)

    大數(shù)據(jù)環(huán)境下的分布式數(shù)據(jù)處理關(guān)鍵技術(shù)探析

    的實(shí)時(shí)處理能力。詳細(xì)介紹了組成基于大數(shù)據(jù)的分布式數(shù)據(jù)處理系統(tǒng)的四個(gè)子系統(tǒng)及其關(guān)鍵技術(shù),討論和比較了各個(gè)子
    發(fā)表于 12-05 19:04 ?0次下載
    大數(shù)據(jù)環(huán)境下的<b class='flag-5'>分布式</b>數(shù)據(jù)<b class='flag-5'>流</b><b class='flag-5'>處理</b>關(guān)鍵技術(shù)探析

    分布式的產(chǎn)生與定義

    如果要更好的理解分布式是什么,首先得認(rèn)識(shí)下,什么是集中式處理系統(tǒng)和分散式處理系統(tǒng)。集中式處理系統(tǒng)它主要是把
    的頭像 發(fā)表于 12-29 15:22 ?3976次閱讀

    分布式視頻處理系統(tǒng)有什么優(yōu)勢(shì)?

    分布式視頻處理系統(tǒng)作為基于網(wǎng)絡(luò)傳輸?shù)男滦推唇蛹夹g(shù),支持多種顯示系統(tǒng)同時(shí)控制,可實(shí)現(xiàn)將多種分辨率傳輸?shù)?b class='flag-5'>一塊超高清大屏上,它在LED小間距屏市場(chǎng)有著很高的滲透率,業(yè)內(nèi)三思航天級(jí)品質(zhì)的LED
    發(fā)表于 04-16 15:15 ?2347次閱讀

    分布式發(fā)布與訂閱系統(tǒng)Apache Kafka在即將發(fā)布的2.8版本

    分布式發(fā)布與訂閱系統(tǒng)Apache Kafka在即將發(fā)布的2.8版本,使用Kafka內(nèi)部的Quorum控制器來(lái)取代ZooKeeper,因此用戶第
    的頭像 發(fā)表于 05-31 09:58 ?1482次閱讀