我目前正在使用V2 API实现两个自定义阅读器,以执行Spark结构化的流作业。作业运行约30-60分钟后,它会炸弹:
Caused by: java.lang.RuntimeException: Offsets committed out of order: 608799 followed by 2982
我重新使用this中发现的示例,它在第206行受到轰炸。
我没有使用示例中提供的twitter流,而是为JMS和SQS实现了它。
我的问题是:有人遇到过此问题吗?还是该实现有问题?
代码段:
override def commit(end: Offset): Unit = {
internalLog(s"** commit($end) lastOffsetCommitted: $lastOffsetCommitted")
val newOffset = TwitterOffset.convert(end).getOrElse(
sys.error(s"TwitterStreamMicroBatchReader.commit() received an offset ($end) that did not " +
s"originate with an instance of this class")
)
val offsetDiff = (newOffset.offset - lastOffsetCommitted.offset).toInt
if (offsetDiff < 0) {
sys.error(s"Offsets committed out of order: $lastOffsetCommitted followed by $end")
}
tweetList.trimStart(offsetDiff)
lastOffsetCommitted = newOffset
}
我找不到平常的网点答案。但是,我确实看到了{{3}}。提出的一点是删除检查点数据-在生产系统中这似乎不是可行的解决方案。另一个是源系统不维护偏移信息吗?我的印象是,spark将自己处理偏移信息。如果第二点是问题,那么我如何确保源系统处理此范例。
请告知我是否可以提供更多信息。
编辑:看着MicroBatchReader界面,提交文档显示:
/**
* Informs the source that Spark has completed processing all data for offsets less than or
* equal to `end` and will only request offsets greater than `end` in the future.
*/
void commit(Offset end);
问题就变成了,为什么星火会向我发送已经提交的提交偏移量?
答案 0 :(得分:0)
回答我自己的问题,以防有人帮忙
我应该为该问题添加更多信息-该作业正在EMR上运行,并且正在使用EFS来检查点数据。
当我使用Amazon的amazon-efs-utils
挂载EFS时发生了问题。由于某种原因,每个工作人员都看不到其他工作人员的读写-好像没有挂载EFS。
解决方案是切换到nfs-utils
来挂载EFS(按照AWS指令),以便每个工作人员都可以准确地读取检查点数据。