下载
Apache kafka各版本下载地址:https://mirror.bit.edu.cn/apache/kafka/
CDH 官方提供的kafka http://archive.cloudera.com/kafka/kafka/4/
kafka_2.11-2.2.1-kafka-4.1.0.jar
中版本号意思,第一个是scala1.12 、kafka 2.2.1、cdh4.1.0
安装部署
-
添加hadoop 用户 useradd hadoop
-
切换到hadoop 用户目录下 su - hadoop
-
创建文件夹 mkdir app software tmp log data script sourcecode lib
-
cd software 上传压缩包,解压并配置软连接 ln -s kafka_2.11-2.2.1-kafka-4.1.0 kafka
-
修改kafka配置文件,进入config 文件夹下 vi server.properties
# 设置brokerid broker.id=0 # 配置主机名 host.name=bigdata01 # 配置端口号 port=9092 # 设置log文件目录 log.dirs=/home/hadoop/tmp/kafka-logs # 设置ZK目录 zookeeper.connect=bigdata01:2181,bigdata02:2181,bigdata03:2181/kafka
启动kafka
进入到bin目录
./kafka-server-start.sh -daemon ../config/server.properties
基础概念
producer 生产者 flume
consumer 消费者 ss
broker 消息处理节点
topic 主题 一个相同属性的数据 放到一起
partition 是topic物理的分组,一个topic至少1个partition, 其实每个partition是一个【有序】的队列 ,其实就是一个Linux文件夹/目录而已,opic名称-序号
replication 副本数 就是一个分区文件夹 复制几份,和HDFSblock的副本设计思想是一致的。 为了高容错
常用命令
a.创建topic
./kafka-topics.sh \
--create \
--zookeeper bigdata01:2181,bigdata01:2182,bigdata01:2183 \
--partitions 3 \
--replication-factor 3 \
--topic g8
b.查看哪些topic
./kafka-topics.sh \
--list \
--zookeeper bigdata01:2181,bigdata02:2181,bigdata03:2181/kafka
c.查看指定topic的状况
./kafka-topics.sh \
--describe \
--zookeeper bigdata01:2181,bigdata02:2181,bigdata03:2181/kafka \
--topic g8
Topic: g8 PartitionCount:3 ReplicationFactor:3 Configs:
Topic: g8 Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: g8 Partition: 1 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: g8 Partition: 2 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
Leader:【读写】
g8-0分区 提供读写的节点是 第一台broker(brokerid=0)
g8-1分区 提供读写的节点是 第二台broker(brokerid=1)
g8-2分区 提供读写的节点是 第三台broker(brokerid=2)
Replicas:复制该分区数据的节点列表
g8-0分区 有 第一台 第二台 第三台 复制
Isr: in-sync replicas 当前活跃的副本列表 是有可能成为leader
ack 机制
ack = 0 producer生产数据之后不会等待server端收到消息的回复
ack = 1 producer生产数据之后会等待leader发送确认保存好的回复
ack = all prodcuer生茶数据之后会等待所有的节点保存好数据的回复
判断你的kafka集群是否正常
启动一个console的一个producer
# 生产者是broker-list
./kafka-console-producer.sh \
--broker-list bigdata01:9092,bigdata02:9092,bigdata03:9092 \
--topic g8
启动一个console的consumer
# 下面的消费者是bootstrap-list
./kafka-console-consumer.sh \
> --bootstrap-server bigdata01:9092,bigdata02:9092,bigdata03:9092 \
> --topic g8 \
> --from-beginning
使用producer生产数据查看消费者能够正常消费
顺序问题
关于kafka消费的有序问题
比如采集mysql的binlog日志,先insert 一条数据,在对这条数据进行update为2,update为3,update为5,再delete,这样如果消费binlog数据的时候保证不了全局有序就会出现错误,有可能导致insert 数据之后直接delete掉,那么怎么解决这个问题呢?
1.我们知道kafka的每个parition中是有序的,所以这里可以设置一个partition来控制全局有序,但是这样做的后果是kafka没有了吞吐,kafka 之后一个分区,这个分区的数据只能被一个消费者组的一个消费者消费,这样必然导致吞吐很低
2.将数据按照表名和主键进行分区,同一个表的数据发送到一个parition中再根据时间字段进行排序,如果没有时间字段可以使用kafka的时间戳字段
3.分组排序
在这组里根据时间戳排序(业务字段有最好;但是没有这个字段咋办–》只能使用kafka数据的时间戳)