Kafka整合Spark Streaming之Receive模式

Kafka整合Spark Streaming的两种模式:Receiver模式Direct直连模式。本篇先来介绍Receiver模式,讲述Receiver模式的原理,以及Receiver模式存在的问题和相关的解决办法。虽然在生产中,一般都会选择Direct直连模式来进行Kafka和Spark Streaming的整合,甚至在新版中已经将Receiver模式拿掉了,但了解一下总归是没有坏处的。如果想直接了解Direct模式,请看下篇 Kafka整合Spark Streaming之Direct模式

1. 原理

Kafka整合Spark Streaming —— Receiver模式

  1. 在Spark Streaming程序运行起来后,会开启一个单独的receiver tasks接收Kafka推送过来的数据

  2. 接收Kafka推送过来的数据会被拆分并分发到其他子节点上,用作task数据的读取源

  3. 分发完成之后会向Zookeeper写入消费者组offsets,更新消费偏移量

  4. 更新Zookeeper完成之后向Driver中的receiver tracker汇报数据的位置

  5. Driver会分发任务到数据节点上,数据节点开启task读取本地被receiver tasks分发过来的数据并开始执行。

2. 问题

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

3. 解决

开启WAL(write ahead log)预写日志机制

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

相关文章: