美文网首页
【大数据技术】kafka简介和底层实现

【大数据技术】kafka简介和底层实现

作者: 江澈_SIMON | 来源:发表于2020-12-15 00:21 被阅读0次

    一、Kafka的三大组件:Producer、Server、Consumer

     

    1、Kafka的Producer写入消息

    producer采用push(推)模式将消息发布到broker,每条消息,都被追加到分区中(顺序写到磁盘,比随机写内存效率高)。

    kafka单partition的写入的流程  

    · 分区的作用:方便容量扩展,可以多并发读写数据,所以我们会指定多个分区进行数据存储。

    · 一般根据 event_key的hash  % numPartitions来确定写入哪个分区,如果写入时没有指定key,则轮询写入每个分区;因此导致每个partition中消息是有序的,整体无序。

    kafka多partition的写入的流程  

    每条event数据写入partitionA中,并且只会写入partitionA_leader,当partitionA_leader写入完成后partitionA_flower节点再去partitionA_leader上异步拉取数据;默认ack为1,表示不会等待partitionA_flowers写入完成;如果设置ack为副本数或ack=-1,则等待副本全部写完,再写入下一条数据。


    2、kafka的broker——保存消息

    1、 创建topic,并指定分区和副本数

    2、每个分区(partition)有一个leader,多个follower,pull数据时先寻找leader,只会读leader上的数据,leader和follower不会在一个节点上,leader节点宕机后,其中一个follower变成leader

    3、 消息数据存在每个分区中,默认配置每条消息保存7天 或 分区达到1GB 后删除数据


    3、Kafka的Consumer消费数据:

    1、consumer采用pull(拉)模式从broker中读取数据。

    2、如果一个消费者来消费同一个topic下不同分区的数据,会读完一个分区再读下一个分区

    生产者(producer)API只有一套;  但是消费者(consumer)API有两套(高级API和低级API

    一、高级API:

    Zookeeper管理offset(默认从最后一个开始读新数据,可以配置从开头读)

    kafka server(kafka服务)管理分区、副本

    二、低级API:

    开发者自己控制offset,想从哪里读就从哪里读

    // SimpleConsumer是Kafka用来读数据的类

    // 通过send()方法获取元数据找到leader

    TopicMetadataResponse metadataResponse = simpleConsumer.send(request);  //通过metadataResponse获取topic元数据,在获取topic中每个分区的元数据

    // fetch 抓取数据

    FetchResponse response = simpleConsumer.fetch(fetchRequest);

    // 解析抓取到的数据

    ByteBufferMessageSet messageAndOffsets = response.messageSet(topic, partition);


    二、数据、broker状态,consumer状态的存储

    一、在本地存储原始消息数据:

    1、hash取模得分区、kafka中每条消息有一个Key,用来确定 每条数据存储到哪个分区中

    2、轮询

    3、自定义分区

    first主题(topic)的第0分区的数据格式  

    二、在zookeeper存储kafka的元数据

    first_topic的某个partition在zookeeper上的数据, 对应下图   kafka元数据的目录结构图

    三、存储consumer的offset数据

    每个consumer有一个Key(broker+Topic+partition)的hash,再取模后 用来确定offset存到哪个系统文件中,Value是partitionMetaData。

    1、使用zookeeper启动,zookeeper来存储offset

    消费者 消费消息时,offset(消费到的下标)会保存在consumer本地和zookeeper中(由本地上传到zookeeper中,所以本地会保存offset)

    使用zookeeper存储offset,对应下图 kafka元数据的目录/consumer结构图

    2、使用bootstrap启动,本地存储offset(在本地可以减少两节点交互),zookeeper存储其他数据

    按consumer线程的序号对50取模,存到不同分区中

    三、某Flume对接Kafka案例

    某Flume对接Kafka案例

    相关文章

      网友评论

          本文标题:【大数据技术】kafka简介和底层实现

          本文链接:https://www.haomeiwen.com/subject/hxkigktx.html