【问题标题】:spark streaming failed batches火花流失败的批次
【发布时间】:2016-10-02 08:53:28
【问题描述】:

我在我的 spark 流应用程序中看到一些失败的批次,因为与内存相关的问题,例如

无法计算拆分,未找到块 input-0-1464774108087

,我想知道是否有一种方法可以在不干扰当前正在运行的应用程序的情况下重新处理这些批次,一般来说,不必是完全相同的例外。

提前致谢 普雷迪普

【问题讨论】:

  • 在执行过程中你不是已经对它们进行了重新处理吗?你在检查日志吗?
  • 当我看到 spark UI 时,在流媒体下,我看到了一些活动批次,当我点击其中一些时,我看到了上述异常,这意味着这些批次在处理时出错了流式应用程序,这些批处理是我要处理和清理的批处理,并且不会因为异常而丢失任何数据。希望对您有所帮助。
  • 您的流媒体工作“落后”了吗?您的“计划延迟”和“活动任务”如何?
  • 另外,您使用的是什么流媒体源?
  • 调度延迟非常小,有问题,我们知道为什么,但是如何重新处理它们是个问题。来源是apache NIFI

标签: apache-spark spark-streaming


【解决方案1】:

这可能发生在您对 spark 的数据摄取率高于分配的内存或可以保留的情况下。您可以尝试将StorageLevel 更改为MEMORY_AND_DISK_SER,这样当内存不足时,Spark 可以将数据溢出到磁盘。这将防止您的错误。

另外,我不认为这个错误意味着任何数据在处理过程中丢失,而是你的块管理器添加的输入块在处理开始之前就超时了。

Spark User list上查看类似问题。

编辑:

数据没有丢失,只是不在任务预期的位置。根据Spark docs

您可以使用 persist() 或 cache() 将 RDD 标记为持久化 方法就可以了。第一次在动作中计算时,它将是 保存在节点上的内存中。 Spark 的缓存是容错的——如果有的话 RDD 的分区丢失,它会自动使用重新计算 最初创建它的转换。

【讨论】:

  • 谢谢阿米特,真的,我做到了,现在我没有看到像上面这样的任何异常,但是对于你所说的“另外,我不认为这个错误意味着任何数据在处理过程中丢失,但是你的块管理器添加的输入块在处理开始之前就超时了。”上面有这个异常,是块根本没有处理,对吧?数据没有被流式丢失,它进入了Spark,没有被Spark处理,因此丢失了?
  • 谢谢阿米特,所以你的意思是,即使由于异常而没有计算块,也会使用原始方式重新计算块,并再次提供给执行程序进行处理?
  • 是的,你可以进一步利用 Spark 中的 checkpoint,确保即使驱动程序崩溃也不会丢失数据。
  • 谢谢阿米特,在我接受/赞成投票之前需要验证块的东西。是的,我知道检查点,这对我的情况没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
  • 2017-04-27
相关资源
最近更新 更多