kafka简介和Streaming-kafka

本文介绍了Kafka作为高吞吐分布式消息系统的特点,包括解耦合、峰值压力缓冲、持久性和分布式等。详细讲解了Kafka的架构组成、消息队列特点以及集群搭建过程。接着探讨了SparkStreaming与Kafka结合的Receiver和Direct模式,分析了两种模式的数据丢失、并行度优化及消费者offset管理策略。

kafka简介和Streaming-kafka

高吞吐的分布式消息系统,默认存储磁盘,默认保存7天

​ 时间策略删除,kafka和很多消息系统不一样,很多消息系统是消费完了我就把它删掉,而kafka是根据时间策略删除,而不是消费完就删除,在kafka里面没有一个消费完这么个概念,只有过期这样一个概念

特点

​ 系统之间解耦合

​ 峰值压力缓冲

​ 异步通信(消息队列)

​ 生产者消费者模式,FIFO

​ 高性能 吞吐量大

​ 持久性 磁盘,顺序读写

​ 分布式 副本,可扩展

​ 时间/offset灵活 7天,读取位置

消息队列特点

可靠性:

​ 自己不丢数据–不经过内存直接存入磁盘(0拷贝),保存数据7天

​ 消费者不丢数据–至少一次

架构组成

producer 消息生产者,两种机制,1基于轮询,2key的Hash,若key为空则只能轮询写

broker 组成kafka集群的节点,broker间没有主从关系,依赖于ZK协调

​ broker负责消息的读写和存储,每个broker可以管理多个partition

topic 一类消息/消息队列

​ 每个topic是由多个partition组成,可指定数量

partition 组成topic的单元,直接接触磁盘,消息是append到每个partition上的

​ 每个partition内部消息是强有序的FIFO,每个消息都有一个序号-offset

​ 创建partition可以指定副本

​ 一个partition只对应一个broker

consumer 每个consumer都有自己的消费者组

​ 每个消费者组在同一个topic消费时,该topic中数据只能被消费一次

​ 不同的消费者组消费同一个topic时互不影响

​ 0.8前由zk管理offset 0.8之后由kafka自身管理

zookeeper 存储元数据,broker,topic,partition…(offset)

集群搭建

命令

启动Kafka集群后启动kafka
​ bin/kafka-server-start.sh config/server.properties

创建topic:
​ bin/kafka-topics.sh --zookeeper sxt002:2181,sxt003:2181,sxt004:2181 --create --replication-factor 2 --partitions 3 --topic testflume
​ bin/kafka-topics.sh --zookeeper sxt002:2181,sxt003:2181,sxt004:2181 --create --replication-factor 2 --partitions 1 --topic LogError

查看topic
​ bin/kafka-topics.sh --zookeeper sxt002:2181,sxt003:2181,sxt004:2181 --list

启动消费者:
​ bin/kafka-console-consumer.sh --zookeeper sxt002:2181,sxt003:2181,sxt004:2181 --from-beginning --topic testflume

启动生产者
​ bin/kafka-topics.sh --zookeeper sxt002:2181,sxt003:2181,sxt004:2181 --create --replication-factor 2 --partitions 1 --topic mylog_cmcc
​ bin/kafka-console-consumer.sh --zookeeper sxt002:2181,sxt003:2181,sxt004:2181 --from-beginning --topic mylog_cmcc

删除
​ 1 bin/kafka-topics.sh --zookeeper sxt002:2181,sxt003:2181,sxt004:2181 --delete --topic xxxx
​ 2 在日志文件中找到相关topic xxxx删除文件夹 rm -rf ./xxxx/
​ 3 取ZK删除元数据进入bin/zkCli.sh ./zkCli.sh ls /
​ ls /brokers/topics rmr /brokers/topics/xxxx
​ ls /
​ ls /config/topics rmr /config/topics/xxxx
​ ls /
​ ls /adimn/delete_topics rmr /adimn/delete_topics/xxxx

Streaming+kafka

SparkStreaming+kafka Receiver模式

在这里插入图片描述

SparkStreaming+ kafka receiver模式:

​ 处理数据采用了receiver接收器的模式,需要一个 task一直处于占用接收数据

​ 接收来的数据存储级别: MEMORY AND_ DISK SER_2

​ 这种模式几乎没有用的。因为存在数据丢失问题

丢失数据

当接收完消息后,更新完zokeeper offset后,如果Driver挂掉,Driver 下的Executor也会被klled ,在Executor内存中的数据多少会有丢失

解决丢失数据

开启WAL ( Write Ahead Log )预写日志机制。当Executor备份完数据之后,向HDFS中也备份- -份数据,备份完成之后,再去更新消费者offset。如果开启WAL机利,可以将接收来的数据存储级别降级,例如: MEMORY AND DISK_ SER。开启WAL机制要设置checkpoint

开启WAL机制,带来了新的问题

必须数据备份到HDFS完成之后,才会更新offset,下一步才会汇报数据位置,再发task处理数据, 会造成数据处理的延迟加大

Receiver模式的并行度

[每一批次生成的DStream中的RDD的分区数]

spark. streaming blockInterval = 200ms。在batchInterval 内每隔200ms ,将接收来的数据封装到一个block中, batchInterval时间内生成的这些block组成了当前这个batch。假设batchInterval = 5s , 5s内生成的一个batch中就有25个block。RDD- >batch RDD-> partition,batch-> block,这里每一个block就是对应RDD中的一个个的partition

提高RDD的并行度

当在batchInterval时间一定情兄下,减少spark.streaming blockInterval值;建议这个值不要低于50ms

SparkStreaming+ kafka Receiver模式

1.存在丢失数据问题,不常用

2.就算开启WAL机制解决了丢失数据问题,带来了新的问题,数据处理延迟大

3.receiver模式底层消费kafka , 采用的是High Level Consumer API实现,不关心消费者offset,无法从每批次中获取消费者offset和指定从某个offset继续消费数据

4.Receiver模式采用zookeeper来维护消费者offset

SparkStreaming+ kafka Direct模式

在这里插入图片描述

SparkStreaming + kafka Direct模式:

​ 不需要一个task一直接收数据,当前批次处理数据时,直接读取数据处理。 Direct模式并行度与读取的topic中partition的个数一对一

​ Direct模式使用Spark自 已来维护消费者offset ,默认offset存储在内存中,如果设置了checkpoint ,在checkpoint中也有一份

​ Direct模式可以做到手动维护消费者offset

提高并行度

1增大读取的topic的partition个数

2.读取过来DStream之后,可以重新分区

Direc模式相对于Receiver模式

1.简化了并行度。默认的并行度与读取的kafka中topic的partition个数一对一

2.Receiver模式采用zookeeper来维护消费者offset,Direct模式使用Spark自已来维护消费者offset

3.Receiver模式采用消费kafka的High Level Consumer API实现, Direct模式采用的是读取kafka的Simple

Consumer API可以做到手动维护offset

SparkSteaming+kafka维护消费者offset

1.使用checkpoint管理肖费者offset(Spark1.6+ Spark2.3)

1).如果业务逻辑不变,可以使用checkpoint来管理消费者offset。使用StreamingContext. getOrCreate ( checkpoint目录, StreamingContext) 首先从checkpoint目录中恢复Streaming配置信息、逻辑、offset。 如果业务逻辑改变了,使用这种方式不会执行新的业务逻辑,恢复offset的同时,把旧的逻辑也恢复过来了

2),如果业务逻辑不变,使用checkpoint维护消费者offset ,存在重复消费数据问题,自己要保证后面处理数据的幂等性

2.依赖与kafka维护消费者offset(Spark2.3)

1).设置enable.auto.commit = false 关闭自动向Kafka自动提交offset

2).在保证业务完全处理完之后手动异步的向Kakfa中更新消费者offset

3.手动维护消费者offset(Spark1.6+ Spark2.3)

存储在redis中,首先从redis获取消费者上次保存的offset ->告诉SparkSteaming接着这个位置消费数据->每一批次将读取到的offset位置更新redis

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值