Apache spark 来自Kafka的火花流错误导致数据丢失
我有一个用Python编写的Spark streaming应用程序,它从Kafka收集数据并存储在文件系统中。当我运行它时,我看到收集到的数据中有很多“漏洞”。在分析日志后,我意识到302000个作业中有285000个失败,但都有相同的例外:Apache spark 来自Kafka的火花流错误导致数据丢失,apache-spark,pyspark,apache-kafka,spark-streaming,Apache Spark,Pyspark,Apache Kafka,Spark Streaming,我有一个用Python编写的Spark streaming应用程序,它从Kafka收集数据并存储在文件系统中。当我运行它时,我看到收集到的数据中有很多“漏洞”。在分析日志后,我意识到302000个作业中有285000个失败,但都有相同的例外: Job aborted due to stage failure: Task 4 in stage 604348.0 failed 1 times, most recent failure: Lost task 4.0 in stage 604348.0
Job aborted due to stage failure: Task 4 in stage 604348.0 failed 1 times,
most recent failure: Lost task 4.0 in stage 604348.0 (TID 2097738, localhost):
kafka.common.OffsetOutOfRangeException
at sun.reflect.GeneratedConstructorAccessor26.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at kafka.common.ErrorMapping$.exceptionFor(ErrorMapping.scala:86)
at org.apache.spark.streaming.kafka.KafkaRDD$KafkaRDDIterator.handleFetchErr(KafkaRDD.scala:184)
at org.apache.spark.streaming.kafka.KafkaRDD$KafkaRDDIterator.fetchBatch(KafkaRDD.scala:193)
at org.apache.spark.streaming.kafka.KafkaRDD$KafkaRDDIterator.getNext(KafkaRDD.scala:208)
at org.apache.spark.util.NextIterator.hasNext(NextIterator.scala:73)
at scala.collection.Iterator$class.foreach(Iterator.scala:727)
at org.apache.spark.util.NextIterator.foreach(NextIterator.scala:21)
at org.apache.spark.api.python.PythonRDD$.writeIteratorToStream(PythonRDD.scala:452)
at org.apache.spark.api.python.PythonRunner$WriterThread$$anonfun$run$3.apply(PythonRDD.scala:280)
at org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1741)
at org.apache.spark.api.python.PythonRunner$WriterThread.run(PythonRDD.scala:239)
我知道当试图访问卡夫卡中不存在的偏移量时会发生这种异常。我的卡夫卡主题有1个小时的保留时间,我认为我的工作不知何故被卡住了一个多小时,在发布之后,卡夫卡队列中的数据不再可用。我无法在小范围内重现这个问题,即使保留率很低,我想知道这些工作是否真的会像我想象的那样被卡住和释放(我如何才能避免),或者我需要从一个完全不同的方向看。他们不必被卡住,他们也可能落后,无法赶上。在这种情况下,您可能从最早的偏移量开始。您的作业可能在代理上的清理线程第一次运行时失败。一个想法是确保您的组中有与分区一样多的使用者实例,以最大化并行性。如果已经具备了,请考虑对应用程序进行一些性能调整。你可以通过观察你的应用程序运行时消费者的延迟是否会缩小来验证。听起来像是一个计划。有没有一种方法可以验证清理线程导致了故障,然后是延迟?此外,这是否真的会导致我所描述的数据中出现“漏洞”?我认为更像是延迟,我没有看到实时延迟,只有丢失的块…如果你看到延迟增长,然后突然缩小,这是一个很好的迹象,表明你由于清理而丢失了一些数据。使用者公开JMX metics,您可以使用它来监视滞后,或者您可以使用consume group命令输出到文件中,反复监视它作为时间序列。我没有看到滞后的增长和收缩。我看到的是数据突然没有被写入,当它再次写入时,会出现一个间隙(这意味着我没有看到在停止期间到达的数据,我在日志中看到了上述异常)。