关于kafka
- Apache Kafka 是一个开源消息系统, 由 Scala 写成。 是由Apache 软件基金会开发的一个开源消息系统项目。
- Kafka 最初是由 LinkedIn 开发, 并于 2011 年初开源。 2012 年10 月从 Apache Incubator 毕业。 该项目的目标是为处理实时数据提供一个统一、 高通量、 低等待的平台。
- Kafka 是一个分布式消息队列: 生产者、 消费者的功能。 它提供了类似于 JMS 的特性, 但是在设计实现上完全不同, 此外它并不是 JMS 规范的实现。
- Kafka 对消息保存时根据 Topic 进行归类
- 发送消息者称为 Producer, 消息接受者称为 Consumer
- 此外 kafka 集群有多个 kafka 实例组成, 每个实例(server)称为broker。
- 无论是 kafka 集群, 还是 producer 和 consumer 都依赖zookeeper 集群保存一些 meta 信息,来保证系统可用性
kafka的核心组件
- Topic : 消息根据 Topic 进行归类
- Producer: 发送消息者
- Consumer: 消息接受者
- broker: 每个 kafka 实例(server)
- Zookeeper: 依赖集群保存 meta 信息。
Kafka集群的安装与使用
前期准备
本次搭建3台机器的kafka集群, 准备3个虚拟机node1, node2, node3
安装好JDK和zookeeper集群, 配置好hosts文件, 设置好互相之间的ssh免密登录
提前写一个zookeeper集群的一键启动脚本以备之后使用:
#!/bin/bash
for host in node1 node2 node3
do
{
echo $host start
ssh $host "source /etc/profile;/export/server/zookeeper-3.4.7/bin/zkServer.sh start"
echo "$host zk is running"
}
done
开始安装配置
-
下载安装包
kafka由scala语言编写
根据scala的版本提供了两个下载包,下载对应Scala2.11的版本。 -
解压
tar -zxvf kafka_2.11-1.0.0.tgz -C /export/servers/
并将文件夹重命名kafka
-
修改配置文件
进入kafka根目录查看目录结构:[root@node1 kafka]# ll total 52 drwxr-xr-x. 3 root root 4096 Oct 28 2017 bin drwxr-xr-x. 2 root root 4096 Oct 28 2017 config drwxr-xr-x. 2 root root 4096 Sep 25 02:43 libs -rw-r--r--. 1 root root 28824 Oct 27 2017 LICENSE -rw-r--r--. 1 root root 336 Oct 27 2017 NOTICE drwxr-xr-x. 2 root root 4096 Oct 28 2017 site-docs
修改config下的server.properties文件
(1) 修改broker.id, broker.id 标识了kafka集群中一个唯一broker
broker.id=0
(2) 数据存放目录(需要创建目录:mkdir -p /export/data/kafka)
存放生产者生产的数据 数据一般以topic的方式存放
log.dirs=/export/data/kafka
(3) 修改zookeeper的连接信息
zookeeper.connect=node1:2181,node2:2181,node2:2181
(4) 开启删除topic权限
如果不添加在删除时只是标记删除或者直接重启
delete.topic.enable=true
-
分发到node2和node3
scp -r /export/server/kafka root@node2:/export/server/
scp -r /export/server/kafka root@node3:/export/server/然后修改node2,node3上的server.properties文件将broker.id分别改为1和2
-
启动kafka集群,启动三个broker(要先启动zookeeper)
分别在node1,node2,node3上启动:/export/server/kafka/bin/kafka-server-start.sh /export/server/kafka/config/server.properties
或者设置一键启动脚本后台启动:
#!/bin/bash for host in node1 node2 node3 do { echo $host start ssh $host "source /etc/profile;nohub /export/server/kafka/bin/kafka-server-start.sh /export/server/kafka/config/server.properties > /dev/null 2>&1 &" echo "$host kafka is running" } done
使用
- 一些简单的命令
-
查看当前服务器中的所有 topic
bin/kafka-topics.sh --list --zookeeper node1:2181
-
创建 topic
bin/kafka-topics.sh --create --zookeeper node1:2181 --replication-factor 1 --partitions 1 --topic test
-
删除 topic
bin/kafka-topics.sh --delete --zookeeper node1:2181 --topic test
(需要 server.properties 中设置 delete.topic.enable=true 否则只是标记删除或者直接重启)
-
通过 shell 命令发送消息
bin/kafka-console-producer.sh --broker-list node1:9092 --topic test
-
通过 shell 消费消息
bin/kafka-console-consumer.sh --zookeeper node1:2181 --from-beginning --topic test
-
查看消费位置
bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeeper node1:2181 --group testGroup
-
查看某个 Topic 的详情
bin/kafka-topics.sh --topic test --describe --zookeeper node1:2181
-
对分区数进行修改
bin/kafka-topics.sh --zookeeper node1 --alter --partitions 2 --topic test
- [举个栗子] 通过控制台操作
-
创建topic(Created topic “order”)
bin/kafka-topics.sh --create --zookeeper node1:2181 --replication-factor 1 --partitions 1 --topic order
-
查看当前服务器中的topic
bin/kafka-topics.sh --list --zookeeper node1:2181
显示结果:
order
-
创建生产者,通过控制台输入数据
bin/kafka-console-producer.sh --broker-list node1:9092 --topic order
[root@node2 kafka]# bin/kafka-console-producer.sh --broker-list node1:9092 --topic order >test1 >test2 >
-
创建消费者,消费数据
bin/kafka-console-consumer.sh --zookeeper node1:2181 --from-beginning --topic order
[root@node3 kafka]# bin/kafka-console-consumer.sh --zookeeper node1:2181 --from-beginning --topic order Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper]. test1 test2
- [举个栗子] 通过Java API操作
参见Kafka官网例子: http://kafka.apache.org/0110/documentation.html#api