一、官网部分介绍
Kafka官网:http://kafka.apache.org/
Kafka的四个核心API:
- The Producer API :允许一个应用发布Records到一个或者多个Topic中;
- The Consumer API :允许一个应用订阅一个或者多个Topic,并处理所订阅Topic中的Record
- The Streams API :允许一个应用消费处理来自一个或多个主题的输入流并产生到一个或多个输出主题的输出流。
- The Connector API :将现有应用活数据系统与Kafka topics连接。例如可以与DB连接,可以捕获对每个表的修改。
Topic:
- Topic是发布记录的类别或订阅源名称。 Kafka的Topic总是多用户。也就是说,一个主题可以有零个,一个或多个消费者订阅它的数据。
- Topic中的Partition是物理上的分组,一个topic可以分为多个Partition,每个Partition是一个有序、不可变的用来存Record的序列,Record是往里面追加的。
- Partition中的每个Record都分配了一个称为offset的顺序ID号,它可以唯一地标识Partition中的每个Record。
- Kafka集群持久保存所有已发布的Record,无论它是否已使用,但是可以配置Record的保留期。 例如,如果保留策略设置为两天,则在发布记录后的两天内,它可供使用,之后将被丢弃以释放空间。 Kafka的性能在数据大小方面实际上是恒定的,因此长时间存储数据不是问题。
- 基于每个消费者保留的唯一元数据是该消费者在Partition中的偏移量offset。 这种偏移由消费者控制:通常消费者在读取记录时线性增加其偏移量,但事实上,由于该位置由消费者控制,因此它可以按照自己喜欢的任何顺序消费记录。 例如,消费者可以设置一个旧一些的偏移量去重新处理之前的数据,或者跳到最近的记录并从“现在”开始消费。
Producer:
- Record的生产者。
- Producer将数据发布到他们选择的Topic中。它负责选择分配给Topic中哪个Partition。 这可以使用轮询方式,但是这仅仅是为了负载均衡,或者可以根据一些语义分区功能(例如基于记录中的某些键)来完成。
Consumer:
- Record的消费者,
- Consumer使用consumer group name来标记自己,Producer发布到Topic的每个Record会被订阅此Topic的消费者组中的一个Consumer实例消费。 Consumer实例可以在单独的进程中,也可以在不同的机器上。
- 如果所有的Consumer都拥有的是同一个consumer group name,那么需要被消费的Record会通过负载均衡到一个Consumer实例且被消费。
- 如果所有的Consumer都拥有不同的consumer group name,那么需要被消费的Record会在所有的Consumer实例中进行广播。
- 至于Partition和Consumer的对应关系,可以参考:https://www.jianshu.com/p/6233d5341dfe
二、kafka的安装及简单使用
下载安装:
4.下载好之后拷贝到服务器上。此处用的是 Ubuntu 18.04 LTS。
5.使用以下命令解压即可。
tar -xzf kafka_2.11-2.0.0.tgz
启动:
6.Kafka使用到了ZooKeeper,所以在启动kafka之前需要先启动ZooKeeper服务器。可以使用kafka包中的zookeeper脚本快速的启动一个Zookeeper单节点,或者也可以单独再去下载Zookeeper部署一套。
bin/zookeeper-server-start.sh config/zookeeper.properties
[2018-11-17 19:20:06,150] INFO Reading configuration from: config/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig)
[2018-11-17 19:20:06,164] INFO autopurge.snapRetainCount set to 3 (org.apache.zookeeper.server.DatadirCleanupManager)
……
7.启动kafka
bin/kafka-server-start.sh config/server.properties
[2018-11-17 17:51:01,257] INFO Registered kafka:type=kafka.Log4jController MBean (kafka.utils.Log4jControllerRegistration$)
[2018-11-17 17:51:01,903] INFO starting (kafka.server.KafkaServer)
……
创建Topic:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
Created topic "test".
查看Topic:
bin/kafka-topics.sh --list --zookeeper localhost:2181
test
或者,不通过手动创建Topic,而通过在配置文件中设置,可以实现发布不存在的Topic时自动创建Topic。
创建Consumer:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
通过这个命令可以创建一个订阅Topic是test的consumer,并将此topic中的Record在界面输出,(--from beginning是将此topic中的消息从头输出一下,如果这个topic之前有消息)。这个命令之后会发现光标在控制台一直闪烁,除非你此时也有一个producer往这个topic发布消息。所以我们需要创建一个producer来配一下演出。
创建Producer:
保持刚才的consumer不要动,打开一个新的终端。输入命令:
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
>this is the first message!
>this is the second message!
>
它将从输入的消息发送到Kafka集群。 默认情况下,每一行都将作为单独的消息发送。上面的例子就发送了两条消息。
再看consumer那边的终端,就会将这两条消息显示在控制台上。