主題和分區(qū)是kafka的核心概念, 主題作為消息的歸類, 可以細(xì)分為一個(gè)或者多個(gè)分區(qū), 分區(qū)可以看做是消息的二次歸類, 分區(qū)的劃分不僅為kafka提供了可伸縮性, 水平拓展的功能, 還通過多副本機(jī)制來為kafka提供數(shù)據(jù)冗雜以提高數(shù)據(jù)可靠性.
創(chuàng)建主題
在kafka配置文件中, 如果auto.create.topics.enable=true,則當(dāng)生產(chǎn)者向一個(gè)未創(chuàng)建的主題發(fā)送消息或者消費(fèi)者從一個(gè)未創(chuàng)建的主題拉取消息時(shí), 會(huì)自動(dòng)創(chuàng)建一個(gè)num.partitions=1(默認(rèn))和default.replication.factor=1(默認(rèn))的主題, 建議關(guān)閉設(shè)為false
使用kafka-topic.sh創(chuàng)建主題
kafka-topics --zookeeper cloudera02/kafka --create --topic test_gp --partitions 4 --replication-factor 2
執(zhí)行完成后會(huì)在kafka的log.dir或者log.dirs目錄下創(chuàng)建對應(yīng)的主題分區(qū)文件夾
[root@cloudera01 data]# ls |grep test_gp
test_gp-0
test_gp-2
[root@cloudera01 data]# ssh cloudera02
Last login: Thu Jul 2 18:08:19 2020 from cloudera03
[root@cloudera02 ~]# cd /home/kafka/data/
[root@cloudera02 data]# ls |grep test_gp
test_gp-1
test_gp-2
test_gp-3
[root@cloudera02 data]# ssh cloudera03
Last login: Thu Jul 2 18:07:52 2020 from cloudera01
[root@cloudera03 ~]# cd /home/kafka/data/
[root@cloudera03 data]# ls |grep test_gp
test_gp-0
test_gp-1
test_gp-3
三個(gè)broker節(jié)點(diǎn)一共創(chuàng)建了8個(gè)文件夾, 是4個(gè)分區(qū), 2個(gè)備份相乘的結(jié)果, 每個(gè)副本就是一個(gè)日志文件
主題和分區(qū)都是提供給上層用戶的抽象, 而在副本層面或者說在Log層面才是真正的物理存儲(chǔ)
同一個(gè)分區(qū)中的多個(gè)副本必須分布在不同的broker中(機(jī)器節(jié)點(diǎn)), 這樣才能提供有效的數(shù)據(jù)冗雜
kafka-topics.sh中zookeeper, partitions, replication-factor和topic者四個(gè)參數(shù)分別表示zookeeper鏈接地址, 分區(qū)數(shù), 副本因子和主題名稱, 還有其他指令命令, 包括create, list, describe, alter, delete
可以通過describe指令來查看分區(qū)副本的分配細(xì)節(jié)
[root@cloudera02 ~]# kafka-topics --describe --zookeeper cloudera02/kafka --topic test_gp
Topic:test_gp PartitionCount:4 ReplicationFactor:2 Configs:
Topic: test_gp Partition: 0 Leader: 78 Replicas: 78,77 Isr: 78,77
Topic: test_gp Partition: 1 Leader: 77 Replicas: 77,78 Isr: 77,78
Topic: test_gp Partition: 2 Leader: 78 Replicas: 78,77 Isr: 78,77
Topic: test_gp Partition: 3 Leader: 77 Replicas: 77,78 Isr: 77,7
Topic表示主題名稱, Partition表示分區(qū)號(hào), PartitionCount表示主題中的分區(qū)個(gè)數(shù), ReplicationFactor表示副本因子,下面的Leader表示Leader副本所在的brokerid等等
創(chuàng)建主題時(shí)主題名不能與已經(jīng)存在的主題同名 ,否則會(huì)報(bào)錯(cuò)
20/07/02 18:34:45 ERROR admin.TopicCommand$: org.apache.kafka.common.errors.TopicExistsException: Topic 'test_gp' already exists.
可以使用if-not-exists參數(shù)來避免這個(gè)問題,如果有重名則不創(chuàng)建, 也不報(bào)錯(cuò), 如果沒有出現(xiàn)重名, 則會(huì)成功創(chuàng)建
[root@cloudera02 data]# kafka-topics --zookeeper cloudera02/kafka --create --topic test_gp --partitions 4 --replication-factor 2 --if-not-exists
主題名如果存在"." kafka會(huì)自動(dòng)把"."轉(zhuǎn)化為下劃線"", 所以topic.1_2和topic_1.2創(chuàng)建的主題名是一樣的, 會(huì)報(bào)沖突
kafka主題的命名不推薦以雙下劃線_開頭, 雙下劃線一般是kafka的內(nèi)部主題, 也不能只有"."
查看主題
使用list 和describe 指令來查看主題
通過list可以查看當(dāng)前所有可用的主題
kafka-topics --zookeeper cloudera02/kafka --list
使用describe查看單個(gè)或者多個(gè)主題的信息, 多個(gè)主題之間用逗號(hào)隔開
kafka-topics --describe --zookeeper cloudera02/kafka --topic test_gp,test_pg
Topic:test_gp PartitionCount:4 ReplicationFactor:2 Configs:
Topic: test_gp Partition: 0 Leader: 79 Replicas: 79,78 Isr: 79,78
Topic: test_gp Partition: 1 Leader: 77 Replicas: 77,79 Isr: 77,79
Topic: test_gp Partition: 2 Leader: 78 Replicas: 78,77 Isr: 78,77
Topic: test_gp Partition: 3 Leader: 79 Replicas: 79,77 Isr: 79,77
Topic:test_pg PartitionCount:3 ReplicationFactor:2 Configs:
Topic: test_pg Partition: 0 Leader: 77 Replicas: 77,78 Isr: 78,77
Topic: test_pg Partition: 1 Leader: 78 Replicas: 78,77 Isr: 78,77
Topic: test_pg Partition: 2 Leader: 77 Replicas: 77,78 Isr: 78,77
修改主題
主題創(chuàng)建好之后可以對其進(jìn)行修改, 包括修改分區(qū)數(shù)等等, 使用alter指令
[root@cloudera02 data]# kafka-topics --zookeeper cloudera02/kafka --alter --topic test_gp --partitions 5
建議在一開始就設(shè)置好分區(qū), 避免進(jìn)行調(diào)整, 目前kafka只支持增加分區(qū)數(shù), 不支持減小分區(qū)數(shù)
分區(qū)管理
優(yōu)先副本的選舉
分區(qū)使用多副本機(jī)制來提升可靠性,但只有l(wèi)eader副本對外提供讀寫