- kafka 相关术语:
术语 | 含义 |
---|---|
producer,产生消息 | 消息生产者,发布消息到 kafka 集群的终端或服务。 |
consumer,消费消息 | 从 kafka 集群中消费消息的终端或服务。 |
topic,主题,在主题里分布消息 | 每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic 的。 |
broker,服务器 | kafka 集群中包含的服务器。 |
Consumer group | high-level consumer API 中,每个 consumer 都属于一个 consumer group,每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group 消费。 |
partition | partition 是物理上的概念,每个 topic 包含一个或多个 partition。kafka 分配的单位是 partition。 |
replica | partition 的副本,保障 partition 的高可用。 |
leader | replica 中的一个角色, producer 和 consumer 只跟 leader 交互。 |
follower | replica 中的一个角色,从 leader 中复制数据。 |
controller | kafka 集群中的其中一个服务器,用来进行 leader election 以及 各种 failover。 |
zookeeper | kafka 通过 zookeeper 来存储集群的 meta 信息。 |
- kafka 相关命令:
相关命令 | 说明 |
---|---|
bin/zookeeper-server-start.sh config/zookeeper.properties | 启动kafka自带zookeeper |
bin/kafka-server-start.sh config/server.properties & | 再启动kafka |
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test | 创建一个名为“test”的Topic,只有一个分区和一个备份 |
bin/kafka-topics.sh --list --zookeeper localhost:2181 | 查看所有创建的topic列表 |
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic | 查看某个topic的具体信息 |
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test | 生成消息 |
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning | 消费信息 |
sudo bin/connect-standalone.sh config/connect-standalone.properties config/connect-file-source.properties config/connect-file-sink.properties | 用Connect连接器从文件导入数据到Kafka topic,再从Kafka topic导出数据到文件。注意:1.如果不能写入文件,可能是没权限,命令前面加上sudo;2.启动Connect时还没有创建topic,那么topic将自动创建(使用默认的分区和副本) |
cat file-input.txt | bin/kafka-console-producer.sh --broker-list localhost:9092 --topic streams-file-input |
bin/kafka-run-class.sh org.apache.kafka.streams.examples.wordcount.WordCountDemo | 运行远端java文件(不用自己写) |
- kafka 安装、启动、使用
更多详细内容(包括模拟集群),查看出处:http://orchome.com/6
==================过程开始
Step 1: 下载代码
下载0.10.0.0版本并且解压它。
> tar -xzf kafka_2.11-0.10.0.0.tgz
> cd kafka_2.11-0.10.0.0
Step 2: 启动服务
运行kafka需要使用Zookeeper,所以你需要先启动Zookeeper,如果你没有Zookeeper,你可以使用kafka自带打包和配置好的Zookeeper。
> bin/zookeeper-server-start.sh config/zookeeper.properties
[2013-04-22 15:01:37,495] INFO Reading configuration from: config/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig)
...
现在启动kafka服务
> bin/kafka-server-start.sh config/server.properties &
[2013-04-22 15:01:47,028] INFO Verifying properties (kafka.utils.VerifiableProperties)
[2013-04-22 15:01:47,051] INFO Property socket.send.buffer.bytes is overridden to 1048576 (kafka.utils.VerifiableProperties)
...
Step 3: 创建一个主题(topic)
创建一个名为“test”的Topic,只有一个分区和一个备份:
> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
创建好之后,可以通过运行以下命令,查看已创建的topic信息:
> bin/kafka-topics.sh --list --zookeeper localhost:2181
test
或者,除了手工创建topic外,你也可以配置你的broker,当发布一个不存在的topic时自动创建topic。
Step 4: 发送消息
Kafka提供了一个命令行的工具,可以从输入文件或者命令行中读取消息并发送给Kafka集群。每一行是一条消息。
运行producer(生产者),然后在控制台输入几条消息到服务器。
> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
This is a message
This is another message
Step 5: 消费消息
Kafka也提供了一个消费消息的命令行工具,将存储的信息输出出来。
> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
This is a message
This is another message
如果你有2台不同的终端上运行上述命令,那么当你在运行生产者时,消费者就能消费到生产者发送的消息。
==================过程结束
-
Kafka集群保持所有的消息,直到它们过期, 无论消息是否被消费了。
-
消费者所持有的仅有的元数据就是这个偏移量,也就是消费者在这个log中的位置。 这个偏移量由消费者控制:正常情况当消费者消费消息的时候,偏移量也线性的的增加。但是实际偏移量由消费者控制,消费者可以将偏移量重置为更老的一个偏移量,重新读取消息。 可以看到这种设计对消费者来说操作自如, 一个消费者的操作不会影响其它消费者对此log的处理。
-
每个分区有一个leader,零或多个follower。Leader处理此分区的所有的读写请求,而follower被动的复制数据。如果leader宕机,其它的一个follower会被推举为新的leader。 一台服务器可能同时是一个分区的leader,另一个分区的follower。
-
通常来讲,消息模型可以分为两种, 队列和发布-订阅式。 队列的处理方式是 一组消费者从服务器读取消息,一条消息只有其中的一个消费者来处理。在发布-订阅模型中,消息被广播给所有的消费者,接收到消息的消费者都可以处理此消息。Kafka为这两种模型提供了单一的消费者抽象模型: 消费者组 (consumer group)。 消费者用一个消费者组名标记自己。 一个发布在Topic上消息被分发给此消费者组中的一个消费者。 假如所有的消费者都在一个组中,那么这就变成了queue模型。 假如所有的消费者都在不同的组中,那么就完全变成了发布-订阅模型。
-
相同的消费者组中不能有比分区更多的消费者,否则多出的消费者一直处于空等待,不会收到消息。
相同的消费者组中不能有比分区更多的消费者,否则多出的消费者一直处于空等待,不会收到消息。 -
如果启动Kafka Connect时还没有创建topic,那么topic将自动创建(使用默认的分区和副本),这可能不是最合适的(因为kafka可不知道业务需要,只能根据默认参数创建)。
-
报错:org.apache.kafka.connect.errors.DataException: JsonDeserializer with schemas.enable requires "schema" and "payload" fields and may not contain additional fields
解决:https://rmoff.net/2017/09/06/kafka-connect-jsondeserializer-with-schemas-enable-requires-schema-and-payload-fields/