1.Kafka基本了解
(1)他是一个消息中间件,又叫分布式流平台,类似的还有MQ(消息队列),Redis等
(2)
Kafka:下面是三个进程 Flume:下面三者一个进程
生产者 source
broker:表示机器的kafka进程 channel
消费者 sink
(3)正常部署的就是broker进程,用来管理数据。一般流程就是Flume---->Kafka----->SparkStreaming
2.为什么需要Kafka或者其他的消息中间件呢?
主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达MySQL,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。
3.Kafka三大功能
(1)PUBLISH和SUBSCRIBE(发布和订阅):像消息传递系统一样读写数据流。
(2)PROCESS(处理):编写实时响应事件的可伸缩流处理应用程序。
(3)STORE:将数据流安全地存储在分布式、复制、容错的集群中。
4.部署
(1)注意分布式部署Zookeeper,开学回来记得搞得云主机来玩玩。
(2)ln -s(软连接):ln -s 物理文件夹/文件 快捷的文件夹/文件
软连接的作用:1)当你误删除了快捷方式,物理文件夹还在的,提高了架构的安全系数。
2)当你的大数据组件的版本更新的时候,不需要再去改其他的依赖组件的配置文件,只需要改的软连接就好。
(3)硬链接:1个文件有几个文件名(用ln命令实现多个文件名),我们就说该文件的链接数为几。由定义可知,此链接数可以是1, 这表明该文件只有一个文件名。总之,硬链接就是让多个不在或者同在一个目录下的文件名,同时能够修改同一个文件,其中一个修改后,所有与其有硬链接的文件都一起修改了。
(4)scp命令回顾:scp 要送的文件 目的机器目录(要么你配置了ssh无密码登陆,要么你知道目的机器的账户密码。)
5.启动Kafka
(1)先启动Zk:./zkServer.sh start
(2)启动kafka:nohup ./kafka-server-start.sh ../config/server.properties &
(3)tpoic:用来表示数据的类别
创建topic:./kafka-topics.sh --create --zookeeper 192.168.137.251:2181 --replication-factor 1 --partitions 1 --topic test
--replication-factor:每一个分区下的副本数量,保证高容错,高可靠
--partitions:分区数量
(4)模拟生产者消费者:
生产者:
./kafka-console-producer.sh --broker-list 192.168.137.251:9092 --topic test //9092kafka节点间通信的默认端口
消费者:
./kafka-console-consumer.sh --bootstrap-server 192.168.137.251:9092 --topic test
(5)查看toic的详细信息:
命令:./kafka-topics.sh --describe --zookeeper 192.168.137.251:2181 --topic test
由于我的是单机,不好分析,就用老师的数据来学习
Topic:test PartitionCount:3 ReplicationFactor:3 Configs:
Topic: test Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: test Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
Topic: test Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2
Replicas:表示正在同步的副本数目,在那些partition上面
Isr:表示leader的排序,如果1挂了2就上,以此类推
杀死相关进程:kill -9 $(pgrep -f kafka)
重启进程快捷方法:!pid(history 前面出现的数字)
(6)修改topic分区
命令:./kafka-topics.sh --describe --zookeeper 192.168.137.251:2181 --topic test
作用:用于高并发时候,机器扛不住了,加机器缓解读写压力,增加加分区不会重新平衡的,数据默认的保存期是7天
(7)配置zk的问题
--zookeeper 192.168.137.251:2181,这是我的配置,由于在zk上没有创建目录,如果kafka出了问题或重装,要删掉,我就得慢慢删除这一堆文件,但是如果192.168.137.251:2181/kafka 加个文件夹,就不用这么麻烦了
(8)干净删除topic(这个就有点麻烦了,不然删不干净)
1)将要删除的topic表示为待删除
bin/kafka-topics.sh --delete \
--zookeeper yws85:2181,yws86:2181,yws87:2181/kafka \
--topic test
2)去zk中删除对面的元数据,有下面三个admin,config,brokers
rmr /kafka/admin/delete_topics/test
rmr /kafka/config/topics/test
rmr /kafka/brokers/topics/test
3)在每台机器中,在自己设置logs下面删除所有的分区信息xxx-*
rm -rf logs/test-*
6.Kafka分区有序的问题
(1)Kafka单个分区读写有序
(2)Kafka多个分区无序在生产上如何保证多个分区消费有序呢?
首先,了解无序读的弊端,假如MySQL执行下面的语句,在写入BINLOG是有序的,然后拉进Kafka
MySQL BINLOG 日志文件 按顺序----有序-----》Kafka test 3个分区
ruozedata.stu
id name age
insert into stu values(1,'jepson',18);
insert into stu values(2,'ruoze',28);
update stu set age=26 where id=1;
delete from stu where id=1;
拉进Kafka之后如下
test-0:
insert into stu values(1,'jepson',18);
test-1:
insert into stu values(2,'ruoze',28);
delete from stu where id=1;
test-2:
update stu set age=26 where id=1;
消费时,顺序不同,这种就会报错!!
insert into stu values(2,'ruoze',28);
delete from stu where id=1;
insert into stu values(1,'jepson',18);
update stu set age=26 where id=1;
解决这一问题的核心点: 共性数据发送到同一个topic的1个分区(自定义分区策略,改变生产者的key值)
拼装的Key: ruozedata_stu_id=1 代码 hash(ruozedata_stu_id=1 ) 取模 0,1,2
value: sql
test-0:
insert into stu values(1,'jepson',18);
update stu set age=26 where id=1;
delete from stu where id=1;
test-1:
insert into stu values(2,'ruoze',28);