flume+kafka篇

本文深入探讨了Kafka的理解,包括其分布式、日志系统特性,以及与Spark Streaming、Hive的整合。同时,介绍了Flume如何确保数据可靠性,Kafka的数据管理和消费机制,以及如何保证消息有序和避免数据丢失。Kafka的高吞吐量实现、分区策略和消费者分配策略也被详细阐述。最后,提到了Kafka与传统消息传递的区别及其在解决数据积压和写入性能优化方面的策略。
摘要由CSDN通过智能技术生成

问题1、谈谈对kafka的理解

  • kafka是最初由linkedin公司开发的,使用scala语言编写,kafka是一个分布式,分区的,多副本的,多订阅者的日志系统(分布式MQ系统),可以用于搜索日志,监控日志,访问日志等。

  • apache kafka是一个分布式发布-订阅消息系统和一个强大的队列,可以处理大量的数据,并使能够将消息从一个端点传递到另一个端点,kafka适合离线和在线消息消费。kafka消息保留在磁盘上,并在集群内复制以防止数据丢失。kafka构建在zookeeper同步服务之上。它与apache和spark非常好的集成,应用于实时流式数据分析。

  • Broker:kafka集群中包含一个或者多个服务实例,这种服务实例被称为Broker

  • Topic:每条发布到kafka集群的消息都有一个类别,这个类别就叫做Topic

    • kafka将消息以topic为单位进行归类
      topic特指kafka处理的消息源(feeds of messages)的不同分类。
      topic是一种分类或者发布的一些列记录的名义上的名字。kafka主题始终是支持多用户订阅的;也就是说,一 个主题可以有零个,一个或者多个消费者订阅写入的数据。
      在kafka集群中,可以有无数的主题。
      生产者和消费者消费数据一般以主题为单位。更细粒度可以到分区级别。
  • Partition:Partition是一个物理上的概念,每个Topic包含一个或者多个Partition

  • Producer:负责发布消息到kafka的Broker中。

  • Consumer:消息消费者,向kafka的broker中读取消息的客户端

  • Consumer Group:每一个Consumer属于一个特定的Consumer Group(可以为每个Consumer指定 groupName)
    : 消费组: 由一个或者多个消费者组成,同一个组中的消费者对于同一条消息只消费一次。

问题2、Kafka和sparkStreaming的整合,手动提交的offset调用了什么方法?

问题3、hive怎么消费kafka的数据的

问题4、kafka如何管理自身的offset

  • offset有两种存放地点,一种是存入一个topic中,该topic被分成50个分区。还有一种是存入zookeeper中,这种方式在javaApi中已经实现了

问题5、flume 如何保证数据的可靠性?

  • Channel提供两种:memory Channel、file Channel。file Channel能把event持久化到磁盘,避免数据丢失
  • Flume 使用事务的办法来保证 event 的可靠传递。Source 和 Sink 分别被封装在事务中,这些事务由保存 event 的存储提供或者由 Channel 提供。这就保证了 event 在数据流的点对点传输中是可靠的。

问题6、kafka如何保证数据不会出现丢失或者重复消费的情况?

  • 保证数据不丢失可以从三方面考虑
    • 生产者数据不丢失:
      • kafka的ack机制可以保证数据发送不丢失,它有三个值 0 1 -1
        • 0:生产者只负责发送数据,不关心数据是否丢失,响应的状态码为0
        • 1:partition的leader收到数据,响应的状态码为1
        • -1:所有的从节点都收到数据,响应的状态码为-1
      • 从数据发送方面考虑的话。有异步和同步发送的方式
        • 在同步的情况下:发送一批数据给kafka后,等待kafka返回结果(默认方式)
          • 生产者等待10s,如果broker没有给出ack相应,就认为失败。生产者重试3次,如果还没有相应,就报错
        • 异步:发送一批数据给kafka,只是提供一个回调函数。(在消息不是很重要的话,用异步)
          • 先将数据保存在生产者端的buffer中。buffer大小是2万条
          • 满足数据阈值或者数量阈值其中的一个条件就可以发送数据。
          • 发送一批数据的大小是500条
      • broker保证数据不丢失
        • 主要是通过副本因子(冗余),防止数据丢失
      • 消费者消费数据不丢失
        • 只要每个消费者记录好offset值即可,就能保证数据不丢失。
  • 保证不出现重复消费的话,要从消费者提交offset考虑(重复消费:consumer有些消息处理了,但是没来得及提交offset。等重启之后,少数消息就会再次消费一次。)
    • 那么我们就需要从幂等性角度考虑了。幂等性,我通俗点说,就一个数据,或者一个请求,无论来多次,对应的数据都不会改变的,不能出错。
    • 比如某个数据要写库,你先根据主键查一下,如果数据有了,就别插入了,update一下好吧
    • 比如你是写redis,那没问题了,反正每次都是set,天然幂等性
    • 对于消息,我们可以建个表(专门存储消息消费记录)
      • 生产者,发送消息前判断库中是否有记录(有记录说明已发送),没有记录,先入库,状态为待消费,然后发送消息并把主键id带上。
      • 消费者,接收消息,通过主键ID查询记录表,判断消息状态是否已消费。若没消费过,则处理消息,处理完后,更新消息记录的状态为已消费。

问题7、kafka消费数据是怎么消费的,用的是什么方式?

  • 自动提交offset(At-most-once(最多一次))
    • 客户端收到消息后,在处理消息前自动提交,这样kafka就认为consumer已经消费过了,偏移量增加。
//设置enable.auto.commit为true
props.put("enable.auto.commit", "true"); 
  • 手动提交offset(At-least-once(最少一次))
    • 可能出现消息处理完了,在提交offset前,网络中断或者程序挂了,那么kafka认为这个消息还没有被consumer消费,产生重复消息推送。
    //关闭自动提交确认选项
    props.put("enable.auto.commit",  "false");
    /
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值