数据源V2阅读器(火花结构化流)-偏移不规则

时间:2019-05-22 00:26:42

标签: scala apache-spark amazon-emr spark-structured-streaming amazon-efs

我目前正在使用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);

问题就变成了,为什么星火会向我发送已经提交的提交偏移量?

1 个答案:

答案 0 :(得分:0)

回答我自己的问题,以防有人帮忙

我应该为该问题添加更多信息-该作业正在EMR上运行,并且正在使用EFS来检查点数据。

当我使用Amazon的amazon-efs-utils挂载EFS时发生了问题。由于某种原因,每个工作人员都看不到其他工作人员的读写-好像没有挂载EFS。

解决方案是切换到nfs-utils来挂载EFS(按照AWS指令),以便每个工作人员都可以准确地读取检查点数据。