是否可以实现支持非正常关闭的可靠接收器?

时间:2015-07-29 18:47:07

标签: apache-spark spark-streaming

我很好奇是否绝对必须让Spark流应用程序正常关闭,否则它会冒着通过预写日志导致重复数据的风险。在下面的场景中,我概述了队列接收器与队列交互的步骤序列,需要对消息进行确认。

  1. Spark队列接收器从队列中提取一批消息。
  2. Spark队列接收器将这批消息存储到预写日志中。
  3. 在将ack发送到队列之前终止Spark应用程序。
  4. Spark应用程序再次启动。
  5. 预写日志中的消息通过流应用程序处理。
  6. Spark队列接收器从队列中提取一批已在步骤1中看到的消息,因为它们未被确认为已接收。
  7. ...
  8. 我的理解是否正确应该如何实现自定义接收器,它带来的重复问题,以及需要正常关闭是正常的吗?

1 个答案:

答案 0 :(得分:2)

底线:这取决于您的输出操作。

使用直接API方法introduced on V1.3,消除了Spark Streaming和Kafka之间的不一致,因此Spark Streaming有效地接收每条记录一次,尽管失败,因为Spark Streaming在其检查点内跟踪偏移。

为了实现输出结果的一次性语义,将数据保存到外部数据存储的输出操作必须是幂等的,或者是保存结果和偏移的原子事务。

有关Direct API以及如何使用它的更多信息,请查看Databricks的this blog post