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 }

为什么需要消息队列?

  1. 解耦 - 只专注于存储数据
  2. 冗余 - 不可避免有一些数据无法立即消费的现象,消息队列就相当于缓冲
  3. 拓展性 - 解耦了处理信息的过程,就可以单独设置
  4. 灵活性&峰值处理能力
  5. 可恢复性 - 降低了进程之间的耦合性,加入队列中的数据仍然可以在系统回复后被处理
  6. 顺序保证 - 一个Partition内的消息是有序的
  7. 缓冲
  8. 异步通讯 - 不想立即处理

前期使用指南查询

这里不利用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
  1. 创建logs文件夹 [root@node1 kafka] mkdir logs
  2. 修改配置文件 [root@node1 kafka] vim /config/server.properties 其他详见:kafka官方指南
# 其中一共有两处需要修改(不然跑不起来)还有很多自定义修改的内容,详见官网
# broker的全局唯一编号,不能重复
broker.id=0
# 配置集群地址(node 是集群内其他主机的地址)
zookeeper.connect=node1:2181,node2:2181,node3:2181
  1. 配置环境变量 vim /etc/profile 增加
export KAFKA_HOME=/opt/modules/kafka
export PATH=$PATH:$KAFKA_HOME/bin
  1. 分发安装包
[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
  1. 分别修改node2和node3 broker.id=1 & broker.id=2
  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 有任何不足或问题请一定留言让我知道,我会及时改正!