kafka 详细入门指南
避免浪费时间 == > 本篇定义Kafka 安装及入门实操,不涉及原理,后续会另一篇详解
kafka标签
- 开源的消息系统,scala和java是实现的
- kafka最初由LinkedIn开发,2012年10月Apache Incubator毕业
- 一个分布式的消息队列,按照topic进行分类,利用producer进行发送消息,Consumer来进行消费接收.一个kafka实例就是一个kafka服务器,每个实例称之broker
- 依赖zookeeper集群保存一些meta信息,来保证高可用
- kafka => apache旗下的顶级项目
如何判断是否是顶级项目?if (项目 is 顶级项目) { you can visit the website by 项目名.apache.org } else { you can't }
为什么需要消息队列?
- 解耦 - 只专注于存储数据
- 冗余 - 不可避免有一些数据无法立即消费的现象,消息队列就相当于缓冲
- 拓展性 - 解耦了处理信息的过程,就可以单独设置
- 灵活性&峰值处理能力
- 可恢复性 - 降低了进程之间的耦合性,加入队列中的数据仍然可以在系统回复后被处理
- 顺序保证 - 一个Partition内的消息是有序的
- 缓冲
- 异步通讯 - 不想立即处理
前期使用指南查询
这里不利用kafka自带的zookeeper套件,所以事先自己启动好zookeeper
kafka一旦开启,后台一直都在收集Log日志,那么如何在后台运行并且日志不输出在命令行?
这条命令表示 将日志输出到 config/server.properties 目录下的nohup.out(注意这条命令是在Kafka一级目录执行的,即/config/server.properties是相对目录)nohup bin/kafka-server-start.sh config/server.properties &
(node1为你用来测试的hostname 公司内一般都是域名和spark等合体,自行修改)
安装kafka
目前 kafka 已经更新到2.0版本,喜欢的可以自己去下,这里用的0.10版本 1)解压
[root@node1 ~] tar -zxvf kafka_2.11-0.10.0.0.tgz -C /opt/modules/
[root@node1 ~] mv kafka_2.11-0.10.0.0/ kafka
- 创建logs文件夹
[root@node1 kafka] mkdir logs
- 修改配置文件
[root@node1 kafka] vim /config/server.properties
其他详见:kafka官方指南
# 其中一共有两处需要修改(不然跑不起来)还有很多自定义修改的内容,详见官网
# broker的全局唯一编号,不能重复
broker.id=0
# 配置集群地址(node 是集群内其他主机的地址)
zookeeper.connect=node1:2181,node2:2181,node3:2181
- 配置环境变量 vim /etc/profile 增加
export KAFKA_HOME=/opt/modules/kafka
export PATH=$PATH:$KAFKA_HOME/bin
- 分发安装包
[root@node1 modules] scp /etc/profile root@node2:/etc/
[root@node1 modules] scp /etc/profile root@node3:/etc/
[root@node1 modules] scp -r kafka/ root@node2:$PWD
[root@node1 modules] scp -r kafka/ root@node3:$PWD
- 分别修改node2和node3 broker.id=1 & broker.id=2
- 启动集群
# 以下方法会不停收集日志,打印到命令行,不想输出到控制台的,参见 前期使用指南查询
[root@node1 kafka]# bin/kafka-server-start.sh config/server.properties &
[root@node1 kafka]# bin/kafka-server-start.sh config/server.properties &
[root@node1 kafka]# bin/kafka-server-start.sh config/server.properties &
操作kafka
参数说明
– replication 备份数量
– partition 分区数量
– topic 相当与项目的名称(自取)
创建 topic replication的Num不能大于broker的Num
bin /kafka-topics.sh --create --zookeeper node1:2181,node2:2181,node3:2181 --replication-factor 3 --partition 1 --topic test
查看 topic
bin/kafka-topics.sh --list --zookeeper node1:2181,node2:2181,node3:2181
删除 topic
bin/kafka-topics.sh --delete --zookeeper node1:2181 --topic test
此时查看topic发现 (marked for deletion 因为没有配置config.service.properites delete.topic.enable =true这样就会立即删除,不然只会在重启后才能删除)(0.10版本中delete.topic.enable默认是false的,新版本中默认是true)
玩一玩
发消息
[root@node01 kafka]# bin/kafka-console-producer.sh --broker-list node01:9092 --topic test
hello world
is anybody there?
消费消息 ==> 先启动消费信息,然后发消息,才会收到
[root@node01 kafka]# bin/kafka-console-consumer.sh --broker-list node01:2181 --topic test
hello world
is anybody there?
查看topic详细信息
[root@node01 kafka]# bin/kafka-topics.sh --topic test --describe --zookeeper node01:2181
zookeeper中查看
ls /
ls /brokers/topics/partitions
kafka java系伪代码入口
Producer API
0 准备kafka集群的配置信息
指定kafka的地址列表
指定是否需要确认
指定重试的次数
指定批次大小
指定linger的使劲按
指定缓存的大小
指定key的序列化类
指定value的序列化类
指定的特定的分区器 (Produce.config.Partitioner_class_config,"全路径")
1 根据配置信息创建一个生产者 kafkaProducer继承了Producer
不断生产消息 topic key value
发送消息
2 释放资源
Consumer API
0 创建配置信息
1 封装配置信息
指定kafka的地址列表
指定消费组id(同一个消费者组里的消费者消费同一个数据)
自动确认offset
自动确认offset的时间间隔
key反序列化使用的类
value反序列化使用的类
1 根据配置信息创建一个消费者
2 设置需要消费的topic
3 从kafka上去拉取数据
消费者订阅主题
此外还有自定义分区器,可以实现数据清洗等操作
详见 kafka 所有的JAVA API 有任何不足或问题请一定留言让我知道,我会及时改正!