SparkStreaming+Kafka的两种模式Receiver模式和Direct模式


SparkStreming + Kafka Receiver模式理解

Kafka的Receiver模式

Receiver模式理解

在SparkStreaming程序运行起来后,Executor中会有Receiver Tasks接收Kafka推送过来的数据。数据会被持久化,默认级别为MEMORY_AND_DISK_SER_2,这个级别也可以修改。Receiver Task对接收过来的数据进行存储和备份,这个过程会有节点之间的数据传输。备份完成后去ZooKeeper中更新消费偏移量,然后向Driver中的Receiver Tracker汇报数据的位置。最后Driver根据数据本地化将Task分发到不同节点上执行。

Receiver模式中存在的问题

当Driver进程挂掉后,Driver下的Executor都会被杀掉,当更新完ZooKeeper消费偏移量的时候,Driver如果挂掉了,就会存在找不到数据的问题,相当于丢失数据。

如何解决这个问题?

开启WAL(write ahead log)预写日志机制,在接受过来数据备份到其他节点的时候,同时备份到HDFS上一份(我们需要将接收来的数据的持久化级别降级到MEMORY_AND_DISK),这样就能保证数据的安全性。不过,因为写HDFS比较消耗性能,要在备份完数据之后才能进行更新ZooKeeper以及汇报位置等,这样会增加job的执行时间,这样对于任务的执行提高了延迟度。

注意

  1. 开启WAL之后,接受数据级别要降级,有效率问题
  2. 开启WAL要checkpoint
  3. 开启WAL(write ahead log),往HDFS中备份一份数据

SparkStreming + Kafka Receiver模式理解

Kafka的Direct模式

  1. 简化数据处理流程
  2. 自己定义offset存储,保证数据0丢失,但是会存在重复消费问题。(解决消费等幂问题)
  3. 不用接收数据,自己去Kafka中拉取

文章作者: 谢舟
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 谢舟 !
  目录