即使在寻求偏移<number>之后,spark-executor- <groupid> <topic> 0也有错误的记录

时间:2018-01-08 20:21:36

标签: apache-spark spark-streaming kafka-consumer-api

我的Spark工作会抛出异常,如下所示:

Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost, executor driver): java.lang.AssertionError: assertion failed: Got wrong record for spark-executor-test-local-npp_consumer_grp_3 <topic> 0 even after seeking to offset 29599
    at scala.Predef$.assert(Predef.scala:170)

我已禁用auto.com(enable.auto.commit=false)并使用Kafka API提交偏移量

((CanCommitOffsets) messages.inputDStream()).commitAsync(offsetRanges.get());`). 

出现此类错误的原因是什么? 是否由于Kafka消费者方面的问题或由于我的spark-kafka消费者计划而发生此错误?*

在研究CachedKafkaConsumer source code之后我认为这应该是由于连续缓冲未命中(我的缓冲区大小是默认大小 - 65536 - receive.buffer.bytes = 65536)但是我看不到缓冲区错过消息 - 我的日志中的Buffer miss for $groupId $topic $partition $offset

所以,我想知道这是否是由缓冲区大小造成的?

我尝试将receive.buffer.bytes增加到655360,但我的spark-kafka消费者失败并出现同样的错误。 这个错误可能是由于我的Kafka源由于大量数据而发送

3 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,并在spark-streaming的类CachedKafkaCounsumer中找到了以下源代码。 这显然是由于消费者民意调查的偏差和消费者寻求的偏差不相等。

我重现了这个问题,发现一个topicAndPartition的偏移在Kafka中是不连续的

def get(offset: Long, timeout: Long): ConsumerRecord[K, V] = {
logDebug(s"Get $groupId $topic $partition nextOffset $nextOffset requested $offset")
if (offset != nextOffset) {
  logInfo(s"Initial fetch for $groupId $topic $partition $offset")
  seek(offset)
  poll(timeout)
}

if (!buffer.hasNext()) { poll(timeout) }
assert(buffer.hasNext(),
  s"Failed to get records for $groupId $topic $partition $offset after polling for $timeout")
var record = buffer.next()

if (record.offset != offset) {
  logInfo(s"Buffer miss for $groupId $topic $partition $offset")
  seek(offset)
  poll(timeout)
  assert(buffer.hasNext(),
    s"Failed to get records for $groupId $topic $partition $offset after polling for $timeout")
  record = buffer.next()
  assert(record.offset == offset,
    s"Got wrong record for $groupId $topic $partition even after seeking to offset $offset")
}

nextOffset = offset + 1
record
}

答案 1 :(得分:0)

当我从使用事务生产者填充的主题中读取时,我遇到了同样的问题here。此问题是由事务标记(提交/中止)引起的,spark-streaming-kafka无法读取。当您在此主题上使用--print-offsets选项运行SimpleConsumerShell时,您应该看到偏移之间的“间隙”。

我现在看到的唯一解决方案是禁用事务生成器,因为尚未实现更新的spark-streaming-kafka。

答案 2 :(得分:0)

我也遇到了这个问题,并且遇到了这个链接: http://apache-spark-user-list.1001560.n3.nabble.com/quot-Got-wrong-record-after-seeking-to-offset-quot-issue-td30609.html

此问题已在2.4.0版中解决:https://issues.apache.org/jira/browse/SPARK-17147

我正在使用压缩主题(压缩的)中的消息,并使用无法处理压缩的spark-streaming-kafka-0-10_2版本2.3.0。

通过转到spark-streaming-kafka-0-10_2 2.4.0版,我得以解决: org.apache.spark:spark-streaming-kafka-0-10_2.11:2.4.0

我还需要配置: spark.streaming.kafka.allowNonConsecutiveOffsets = true

我的Submit命令如下:

  

spark-submit --class com.streamtest.Main --master spark:// myparkhost:7077 --packages   org.apache.spark:spark-streaming-kafka-0-10_2.11:2.4.0,org.apache.spark:spark-streaming_2.11:2.3.0,org.apache.spark:spark-core_2.11: 2.3.0   --conf spark.streaming.kafka.allowNonConsecutiveOffsets = true /work/streamapp/build/libs/streamapp.jar