Spark Streaming作业因ReceiverDisconnectedException类而失败

时间:2019-11-14 03:39:54

标签: apache-spark spark-streaming azure-eventhub

我有Spark Streaming作业,该作业从Azure Eventhub捕获近乎实时的数据并以24/7的速度运行。 更有趣的是,我的工作每天至少失败2次,并出现以下错误。如果我搜索到此错误,Microsoft文档会给我“如果两个或多个PartitionReceiver实例连接到具有不同历元值的同一分区,则会抛出此异常”。。我不担心数据丢失,因为当我重新启动作业时,Spark Checkpointing会自动处理数据,但是我的问题是为什么Spark Streaming作业每天会失败2-3次,并出现相同的错误。

任何人都面临相同的问题,是否有任何解决方案/变通办法。任何帮助将非常感激。

错误: enter image description here

1 个答案:

答案 0 :(得分:0)

如果两个或多个 Partitions Receiver 实例连接到具有不同历元值的同一分区,则会引发此异常。

什么是分区接收器?

这是从EventHub分区接收的逻辑表示。

PartitionReceiver绑定到ConsumerGroup + Partition组合。如果您要创建基于纪元的PartitionReceiver(即PartitionReceiver.Epoch!= 0),则每个ConsumerGroup + Partition组合的活动接收器不能超过一个。每个ConsumerGroup + Partition组合中可以有多个接收器,而非时间段接收器。

听起来您正在运行两个应用程序实例,两个并发类或两个使用相同事件中心使用者组的应用程序。事件中心使用者组实际上是指向事件流上某个时间点的指针。如果尝试使用指向两个代码实例的一个消费者组,那么您将遇到与看到的冲突。

任何一个:

  1. 确保您一次只有一个实例读取使用者组。
  2. 当您需要两个单独的程序或功能集来同时处理事件中心时,请使用两个使用者组。
  3. 如果要并行化性能,请查看事件中心分区以及如何利用独立处理每个分区的优势。

还有另一种方案,其中将事件中心分区作为事件中心内部负载平衡的一部分切换到另一台主机。在这种情况下,您可能会看到收到的错误。在这种情况下,只需登录并继续。

有关更多详细信息,请参阅“ Features and terminology in Azure Event Hubs”和“ Event Hubs Receiver Epoch”。

希望这会有所帮助。