1.概述
在 Kafka 集群中,我們可以對(duì)每個(gè) Topic 進(jìn)行一個(gè)或是多個(gè)分區(qū),并為該 Topic 指定備份數(shù)。這部分元數(shù)據(jù)信息都是存放在 Zookeeper 上,我們可以使用 zkCli 客戶端,通過(guò) ls 和 get 命令來(lái)查看元數(shù)據(jù)信息。通過(guò) log.dirs 屬性控制消息存放路徑,每個(gè)分區(qū)對(duì)應(yīng)一個(gè)文件夾,文件夾命名方式為:TopicName-PartitionIndex,該文件夾下存放這該分區(qū)的所有消息和索引文件,如下圖所示:
2.內(nèi)容
Kafka 集群在生產(chǎn)消息入庫(kù)的時(shí)候,通過(guò) Key 來(lái)進(jìn)行分區(qū)存儲(chǔ),按照相應(yīng)的算法,生產(chǎn)分區(qū)規(guī)則,讓所生產(chǎn)的消息按照該規(guī)則分布到不同的分區(qū)中,以達(dá)到水平擴(kuò)展和負(fù)載均衡。而我們?cè)谙M(fèi)這些消息的時(shí)候,可以使用多線程來(lái)消費(fèi)該 Topic 下的所有分區(qū)中的消息。
分區(qū)規(guī)則的制定,通過(guò)實(shí)現(xiàn) kafka.producer.Partitioner 接口,該接口我們可以進(jìn)行重寫(xiě),按照自己的方式去實(shí)現(xiàn)分區(qū)規(guī)則。如下,我們按照 Key 的 Hash 值,然后取模得到分區(qū)索引,代碼如下所示:
package cn.hadoop.hdfs.kafka.partition; import kafka.producer.Partitioner; import kafka.utils.VerifiableProperties; /** * @Date Nov 3, 2016 * * @Author dengjie * * @Note 先 Hash 再取模,得到分區(qū)索引 */ public class CustomerPartitioner implements Partitioner { public CustomerPartitioner(VerifiableProperties props) { }