Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 什么是「;偏移量从X更改为0“;Spark结构化流媒体中KafkaSource出错?_Apache Spark_Apache Kafka_Offset_Spark Structured Streaming_Spark Kafka Integration - Fatal编程技术网

Apache spark 什么是「;偏移量从X更改为0“;Spark结构化流媒体中KafkaSource出错?

Apache spark 什么是「;偏移量从X更改为0“;Spark结构化流媒体中KafkaSource出错?,apache-spark,apache-kafka,offset,spark-structured-streaming,spark-kafka-integration,Apache Spark,Apache Kafka,Offset,Spark Structured Streaming,Spark Kafka Integration,我在Spark结构化流媒体应用程序中得到了一个错误“偏移量从X更改为0,一些数据可能丢失了”,该应用程序带有检查点,但它似乎实际上没有引起任何问题。我想弄清楚这个错误的真正含义 我的设置如下 我让Kafka(0.10.1.0)在docker容器中运行,在/tmp/Kafka日志上安装了一个命名卷,以便在重启之间保存日志 我在另一个docker容器中有一个Spark Structured Streaming(2.1.1)应用程序。这些流使用来自卡夫卡的数据。它们还在再次装入命名卷的位置使用检查点

我在Spark结构化流媒体应用程序中得到了一个错误“偏移量从X更改为0,一些数据可能丢失了”,该应用程序带有检查点,但它似乎实际上没有引起任何问题。我想弄清楚这个错误的真正含义

我的设置如下

  • 我让Kafka(0.10.1.0)在docker容器中运行,在/tmp/Kafka日志上安装了一个命名卷,以便在重启之间保存日志

  • 我在另一个docker容器中有一个Spark Structured Streaming(2.1.1)应用程序。这些流使用来自卡夫卡的数据。它们还在再次装入命名卷的位置使用检查点,以确保元数据在重启之间保持不变

  • 我使用一个实现接口的自定义接收器,这意味着我必须实现我自己的已处理版本日志,以便在一切重新启动时,我可以告诉Spark Streaming不要重新处理已处理的内容

所有这些都很好,数据从Kafka正确地使用,我的自定义接收器正确地处理数据

现在,如果我关闭Spark Streaming应用程序,让Kafka中的数据堆积起来,然后重新启动Spark Streaming,它将抛出以下错误,表明某些数据在Kafka中不再可用

ERROR StreamExecution: Query [id = cd2b69e1-2f24-439a-bebc-89e343df83a8, runId = d4b3ae65-8cfa-4713-912c-404623710048] terminated with error

Java.lang.IllegalStateException: Partition input.clientes-0's offset
 was changed from 908 to 0, some data may have been missed.

Some data may have been lost because they are not available in Kafka
 any more; either the data was aged out by Kafka or the topic may have 
 been deleted before all the data in the topic was processed. If you 
 don't want your streaming query to fail on such cases, set the source 
 option "failOnDataLoss" to "false".

at org.apache.spark.sql.kafka010.KafkaSource.org$apache$spark$sql$kafka010$KafkaSource$$reportDataLoss(KafkaSource.scala:329)
at org.apache.spark.sql.kafka010.KafkaSource$$anonfun$8.apply(KafkaSource.scala:283)
at org.apache.spark.sql.kafka010.KafkaSource$$anonfun$8.apply(KafkaSource.scala:281)
at scala.collection.TraversableLike$$anonfun$filterImpl$1.apply(TraversableLike.scala:248)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at scala.collection.TraversableLike$class.filterImpl(TraversableLike.scala:247)
at scala.collection.TraversableLike$class.filter(TraversableLike.scala:259)
at scala.collection.AbstractTraversable.filter(Traversable.scala:104)
at org.apache.spark.sql.kafka010.KafkaSource.getBatch(KafkaSource.scala:281)
at org.apache.spark.sql.execution.streaming.StreamExecution$$anonfun$org$apache$spark$sql$execution$streaming$StreamExecution$$runBatch$2$$anonfun$apply$6.apply(StreamExecution.scala:452)
at org.apache.spark.sql.execution.streaming.StreamExecution$$anonfun$org$apache$spark$sql$execution$streaming$StreamExecution$$runBatch$2$$anonfun$apply$6.apply(StreamExecution.scala:448)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
at org.apache.spark.sql.execution.streaming.StreamProgress.foreach(StreamProgress.scala:25)
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
at org.apache.spark.sql.execution.streaming.StreamProgress.flatMap(StreamProgress.scala:25)
at org.apache.spark.sql.execution.streaming.StreamExecution$$anonfun$org$apache$spark$sql$execution$streaming$StreamExecution$$runBatch$2.apply(StreamExecution.scala:448)
at org.apache.spark.sql.execution.streaming.StreamExecution$$anonfun$org$apache$spark$sql$execution$streaming$StreamExecution$$runBatch$2.apply(StreamExecution.scala:448)
at org.apache.spark.sql.execution.streaming.ProgressReporter$class.reportTimeTaken(ProgressReporter.scala:262)
at org.apache.spark.sql.execution.streaming.StreamExecution.reportTimeTaken(StreamExecution.scala:46)
at org.apache.spark.sql.execution.streaming.StreamExecution.org$apache$spark$sql$execution$streaming$StreamExecution$$runBatch(StreamExecution.scala:447)
at org.apache.spark.sql.execution.streaming.StreamExecution$$anonfun$org$apache$spark$sql$execution$streaming$StreamExecution$$runBatches$1$$anonfun$1.apply$mcV$sp(StreamExecution.scala:255)
at org.apache.spark.sql.execution.streaming.StreamExecution$$anonfun$org$apache$spark$sql$execution$streaming$StreamExecution$$runBatches$1$$anonfun$1.apply(StreamExecution.scala:244)
at org.apache.spark.sql.execution.streaming.StreamExecution$$anonfun$org$apache$spark$sql$execution$streaming$StreamExecution$$runBatches$1$$anonfun$1.apply(StreamExecution.scala:244)
at org.apache.spark.sql.execution.streaming.ProgressReporter$class.reportTimeTaken(ProgressReporter.scala:262)
at org.apache.spark.sql.execution.streaming.StreamExecution.reportTimeTaken(StreamExecution.scala:46)
at org.apache.spark.sql.execution.streaming.StreamExecution$$anonfun$org$apache$spark$sql$execution$streaming$StreamExecution$$runBatches$1.apply$mcZ$sp(StreamExecution.scala:244)
at org.apache.spark.sql.execution.streaming.ProcessingTimeExecutor.execute(TriggerExecutor.scala:43)
at org.apache.spark.sql.execution.streaming.StreamExecution.org$apache$spark$sql$execution$streaming$StreamExecution$$runBatches(StreamExecution.scala:239)
at org.apache.spark.sql.execution.streaming.StreamExecution$$anon$1.run(StreamExecution.scala:177)
但在抛出错误后,我看到流正常启动。Spark Streaming将在Kafka中堆积的数据正确地推送到我的自定义接收器中,达到预期版本。然后,我的接收器继续并正确处理新数据

因此,该错误表明某些数据在卡夫卡中不再可用,但它仍然能够通过Spark流正确使用

如果我重新启动Spark流媒体应用程序,即使没有数据被推送到Kafka,我也会再次遇到同样的错误。如果我开始将新数据推送到卡夫卡,系统将继续正确处理这些数据


有人知道这里会发生什么吗?我解释错误了吗?

/tmp/kafka logs
是kafka的日志目录,其中存储了所有偏移量、主题信息。如果它已损坏或某些数据被删除,则需要在
SparkProcessContext
的Kafka选项中设置选项
failOnDataLoss:false
,然后重新启动Spark作业

Option  : failOnDataLoss
Value   : true or false
Default : TRUE

含义:当数据可能丢失(例如,主题被删除或偏移量超出范围)时,是否使查询失败。这可能是虚惊一场。当它不能按预期工作时,您可以禁用它。

这似乎是旧版kafka客户端库中的一个已知错误

描述说

由于,当Kafka源尝试获取最新偏移量时,它可能会获取最早的偏移量,然后在下一批中获取正确的最新偏移量时,它将重新处理已处理的消息

总而言之,引用开发人员的话:

“这是卡夫卡中的一个已知问题,请参阅卡夫卡-7703。这在SPARK-26267的2.4.1和3.0.0中已修复。请将SPARK升级到更高版本。另一种可能是将卡夫卡升级到2.3.0,其中卡夫卡方面已修复。”

“卡夫卡-7703仅存在于卡夫卡1.1.0及以上版本中,因此可能的解决方法是使用没有此问题的旧版本。这不会影响Spark 2.3.x及以下版本,因为默认情况下我们使用卡夫卡0.10.0.1。”

在我们的案例中,我们在HDP3.1平台上面临同样的问题。我们有Spark 2.3.2和Spark sql kafka库(),但是它使用kafka客户机2.0.0。这意味着由于后续条件,我们将面临此错误:

  • 我们的火花<2.4.1
  • 1.1.0<我们的卡夫卡<2.3.0
可能的变通解决方案 我们能够通过删除包含
0
偏移量的批号“offset”子文件夹中的检查点文件来“解决”这个问题

删除此文件时,请确保子文件夹“提交”和“偏移”中的检查点文件中的批次号在删除后仍然匹配


这到目前为止还不是一个理想的解决方案,特别是对于生产环境。但是,如果您不能轻松地更新库,这可能会有所帮助。

您的代码中有任何偏移处理吗?这意味着您的Spark流正在阅读卡夫卡的内容,然后您停止,它没有提交该位置,也没有在Zookepr或其他阶段提交。当它到达卡夫卡时,它询问位置0,但ZK知道你到达了位置908。这并没有真正的帮助。错误原因尚不清楚。此问题的原因未知/未记录,我可以推测的是卡夫卡或Spark end的数据丢失。