Apache spark Spark Kafka流媒体正在取得进展,但没有可使用的数据
我有一个简单的Spark结构化流媒体作业,它使用Kafka 0.10 API从Kafka读取数据并写入S3存储。从日志中,我可以看到,对于触发的每个批次,流式处理应用程序都在进行,并且正在从源数据中消耗数据,因为内偏移量大于startOffset,并且对于每个批次,两者都始终在增加。但是numInputRows始终为零,并且没有写入S3的行 为什么偏移量会逐渐增加,但spark批处理不会消耗任何数据Apache spark Spark Kafka流媒体正在取得进展,但没有可使用的数据,apache-spark,apache-kafka,spark-streaming,Apache Spark,Apache Kafka,Spark Streaming,我有一个简单的Spark结构化流媒体作业,它使用Kafka 0.10 API从Kafka读取数据并写入S3存储。从日志中,我可以看到,对于触发的每个批次,流式处理应用程序都在进行,并且正在从源数据中消耗数据,因为内偏移量大于startOffset,并且对于每个批次,两者都始终在增加。但是numInputRows始终为零,并且没有写入S3的行 为什么偏移量会逐渐增加,但spark批处理不会消耗任何数据 19/09/10 15:55:01 INFO MicroBatchExecution: Stre
19/09/10 15:55:01 INFO MicroBatchExecution: Streaming query made progress: {
"id" : "90f21e5f-270d-428d-b068-1f1aa0861fb1",
"runId" : "f09f8eb4-8f33-42c2-bdf4-dffeaebf630e",
"name" : null,
"timestamp" : "2019-09-10T15:55:00.000Z",
"batchId" : 189,
"numInputRows" : 0,
"inputRowsPerSecond" : 0.0,
"processedRowsPerSecond" : 0.0,
"durationMs" : {
"addBatch" : 127,
"getBatch" : 0,
"getEndOffset" : 0,
"queryPlanning" : 24,
"setOffsetRange" : 36,
"triggerExecution" : 1859,
"walCommit" : 1032
},
"stateOperators" : [ ],
"sources" : [ {
"description" : "KafkaV2[Subscribe[my_kafka_topic]]",
"startOffset" : {
"my_kafka_topic" : {
"23" : 1206926686,
"8" : 1158514946,
"17" : 1258387219,
"11" : 1263091642,
"2" : 1226741128,
"20" : 1229560889,
"5" : 1170304913,
"14" : 1207333901,
"4" : 1274242728,
"13" : 1336386658,
"22" : 1260210993,
"7" : 1288639296,
"16" : 1247462229,
"10" : 1093157103,
"1" : 1219904858,
"19" : 1116269615,
"9" : 1238935018,
"18" : 1069224544,
"12" : 1256018541,
"3" : 1251150202,
"21" : 1256774117,
"15" : 1170591375,
"6" : 1185108169,
"24" : 1202342095,
"0" : 1165356330
}
},
"endOffset" : {
"my_kafka_topic" : {
"23" : 1206928043,
"8" : 1158516721,
"17" : 1258389219,
"11" : 1263093490,
"2" : 1226743225,
"20" : 1229562962,
"5" : 1170307882,
"14" : 1207335736,
"4" : 1274245585,
"13" : 1336388570,
"22" : 1260213582,
"7" : 1288641384,
"16" : 1247464311,
"10" : 1093159186,
"1" : 1219906407,
"19" : 1116271435,
"9" : 1238936994,
"18" : 1069226913,
"12" : 1256020926,
"3" : 1251152579,
"21" : 1256776910,
"15" : 1170593216,
"6" : 1185110032,
"24" : 1202344538,
"0" : 1165358262
}
},
"numInputRows" : 0,
"inputRowsPerSecond" : 0.0,
"processedRowsPerSecond" : 0.0
} ],
"sink" : {
"description" : "FileSink[s3://my-s3-bucket/data/kafka/my_kafka_topic]"
}
}
spark代码的简化版本如下所示
val df = sparkSession
.readStream
.format"kafka")
.options(Map(
"kafka.bootstrap.servers" -> "host:1009",
"subscribe" -> "my_kafka-topic",
"kafka.client.id" -> "my-client-id",
"maxOffsetsPerTrigger" -> 1000,
"fetch.message.max.bytes" -> 6048576
))
.load()
df
.writeStream
.partitionBy("date", "hour")
.outputMode(OutputMode.Append())
.format("parquet")
.options(Map("checkpointLocation" -> "checkpoint", "path" -> "data"))
.trigger(Trigger.ProcessingTime(Duration("5m")))
.start()
.awaitTermination()
编辑:在执行每个批之前,我从日志中也看到了这些
19/09/11 02:49:42 INFO Fetcher: [Consumer clientId=my_client_id, groupId=spark-kafka-source-5496988b-3f5c-4342-9361-917e4f3ece51-1340785812-driver-0] Resetting offset for partition my-topic-5 to offset 1168959116.
19/09/11 02:49:42 INFO Fetcher: [Consumer clientId=my_client_id, groupId=spark-kafka-source-5496988b-3f5c-4342-9361-917e4f3ece51-1340785812-driver-0] Resetting offset for partition my-topic-1 to offset 1218619371.
19/09/11 02:49:42 INFO Fetcher: [Consumer clientId=my_client_id, groupId=spark-kafka-source-5496988b-3f5c-4342-9361-917e4f3ece51-1340785812-driver-0] Resetting offset for partition my-topic-8 to offset 1157205346.
19/09/11 02:49:42 INFO Fetcher: [Consumer clientId=my_client_id, groupId=spark-kafka-source-5496988b-3f5c-4342-9361-917e4f3ece51-1340785812-driver-0] Resetting offset for partition my-topic-21 to offset 1255403059.
您能检查一下,下面链接中提到的输出目录和检查点位置是否适用于您的情况吗
您能否检查以下链接中提到的与输出目录和检查点位置相关的情况是否适用于您的情况
当我清理检查点位置以重新启动流,但使用旧的目标位置(未清除)写入流数据时,我遇到了更新偏移量但没有输入行的确切问题。在清理(更改)检查点和写入位置后,它工作正常
在这个特殊的例子中,当我清除检查点位置时,偏移量得到了正确的更新。但因为我没有清除目标位置(因为它有5-6个月连续流媒体的数据,即100到1000个小文件要删除)但显然spark会检查spark元数据,当它在其中发现旧数据时,它不会使用任何新数据。当我清理检查点位置以重新开始流式传输,但使用旧目标位置(未清除)写入流式传输数据时,这一问题与更新偏移量有关,但没有输入行发生在我身上。在清理(更改)检查点和写入位置后,它工作正常
在这个特殊的例子中,当我清除检查点位置时,偏移量得到了正确的更新。但是因为我没有清除目标位置(因为它有5-6个月连续流媒体的数据,即100个或1000个小文件要删除),但显然是火花检查火花元数据,当它在其中发现旧数据时,它没有使用任何新数据。你的
检查点设置是什么?你能为readStream
写一个示例代码吗?@SanBan我刚刚用简化版的spark代码更新了这个问题。当我将内核数设置为1时,我遇到了这样一个问题。但是我的代码是用Java编写的,我不确定pyspark是否正确。增加内核的数量解决了这个问题,因为一个内核专用于管理来自Kafka的输入数据。@epcpu在您的案例中,偏移量是不是在每个微批次中逐渐增加,spark没有处理任何数据?事实上,我没有检查偏移量,这是我在前面的评论中提到的怀疑的主要来源。但是你可以试试看它是否有用。你的检查点设置是什么?你能为readStream
写一个示例代码吗?@SanBan我刚刚用简化版的spark代码更新了这个问题。当我将内核数设置为1时,我遇到了这样一个问题。但是我的代码是用Java编写的,我不确定pyspark是否正确。增加内核的数量解决了这个问题,因为一个内核专用于管理来自Kafka的输入数据。@epcpu在您的案例中,偏移量是不是在每个微批次中逐渐增加,spark没有处理任何数据?事实上,我没有检查偏移量,这是我在前面的评论中提到的怀疑的主要来源。但是你可以试试看它是否有用。