Apache spark 在按键进行结构化流式重新分区时,如何保留每个键的事件顺序?
我想编写一个结构化spark streaming Kafka consumer,它从一个单分区Kafka主题读取数据,按“键”将传入数据重新分区到3个spark分区,同时保持消息按键排序,并将它们写入另一个具有3个分区的Kafka主题 我使用了Apache spark 在按键进行结构化流式重新分区时,如何保留每个键的事件顺序?,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,我想编写一个结构化spark streaming Kafka consumer,它从一个单分区Kafka主题读取数据,按“键”将传入数据重新分区到3个spark分区,同时保持消息按键排序,并将它们写入另一个具有3个分区的Kafka主题 我使用了Dataframe.repartition(3,$“key”),我相信它使用的是HashPartitioner。代码如下所示 当我使用固定的批处理间隔触发器类型执行查询时,我直观地验证了输出消息是否符合预期顺序。我的假设是,在生成的分区上不能保证顺序。我希
Dataframe.repartition(3,$“key”)
,我相信它使用的是HashPartitioner。代码如下所示
当我使用固定的批处理间隔触发器类型执行查询时,我直观地验证了输出消息是否符合预期顺序。我的假设是,在生成的分区上不能保证顺序。我希望在spark code repo或文档中的代码指针方面得到一些肯定或否决
我还尝试使用了Dataframe.sortWithinPartitions
,但是在没有聚合的流式数据帧上似乎不支持这一点
我尝试的一个选项是将数据帧转换为RDD,并应用repartitionandsortwithartitions
,根据给定的分区器对RDD进行重新分区,并在每个生成的分区内按键对记录进行排序。但是,我无法在query.writestream操作中使用此RDD将结果写入输出Kafka主题
case class KVOutput(key: String, ts: Long, value: String, spark_partition: Int)
val df = spark.readStream.format("kafka")
.option("kafka.bootstrap.servers", kafkaBrokers.get)
.option("subscribe", Array(kafkaInputTopic.get).mkString(","))
.option("maxOffsetsPerTrigger",30)
.load()
val inputDf = df.selectExpr("CAST(key AS STRING)","CAST(value AS STRING)")
val resDf = inputDf.repartition(3, $"key")
.select(from_json($"value", schema).as("kv"))
.selectExpr("kv.key", "kv.ts", "kv.value")
.withColumn("spark_partition", spark_partition_id())
.select($"key", $"ts", $"value", $"spark_partition").as[KVOutput]
.sortWithinPartitions($"ts", $"value")
.select($"key".cast(StringType).as("key"), to_json(struct($"*")).cast(StringType).as("value"))
val query = resDf.writeStream
.format("kafka")
.option("kafka.bootstrap.servers", kafkaBrokers.get)
.option("topic", kafkaOutputTopic.get)
.option("checkpointLocation", checkpointLocation.get)
.start()
当我提交此申请时,它失败了
8/11/08 22:13:20 ERROR ApplicationMaster: User class threw exception: org.apache.spark.sql.AnalysisException: Sorting is not supported on streaming DataFrames/Datasets, unless it is on aggregated DataFrame/Dataset in Complete output mode;;
感谢Michal嵌入这些图像。我的帖子看起来好多了:)