Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 在按键进行结构化流式重新分区时,如何保留每个键的事件顺序?_Apache Spark_Spark Structured Streaming - Fatal编程技术网

Apache spark 在按键进行结构化流式重新分区时,如何保留每个键的事件顺序?

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。代码如下所示 当我使用固定的批处理间隔触发器类型执行查询时,我直观地验证了输出消息是否符合预期顺序。我的假设是,在生成的分区上不能保证顺序。我希

我想编写一个结构化spark streaming Kafka consumer,它从一个单分区Kafka主题读取数据,按“键”将传入数据重新分区到3个spark分区,同时保持消息按键排序,并将它们写入另一个具有3个分区的Kafka主题

我使用了
Dataframe.repartition(3,$“key”)
,我相信它使用的是HashPartitioner。代码如下所示

当我使用固定的批处理间隔触发器类型执行查询时,我直观地验证了输出消息是否符合预期顺序。我的假设是,在生成的分区上不能保证顺序。我希望在spark code repo或文档中的代码指针方面得到一些肯定或否决

我还尝试使用了
Dataframe.sortWithinPartitions
,但是在没有聚合的流式数据帧上似乎不支持这一点

我尝试的一个选项是将数据帧转换为RDD,并应用
repartitionandsortwithartitions
,根据给定的分区器对RDD进行重新分区,并在每个生成的分区内按键对记录进行排序。但是,我无法在query.writestream操作中使用此RDD将结果写入输出Kafka主题

  • 是否有数据帧重新分区API帮助在流上下文中对重新分区的数据进行排序
  • 还有其他选择吗
  • 微批处理执行的默认触发器类型或固定间隔触发器类型是否提供任何类型的消息排序保证
  • 传入数据:

    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嵌入这些图像。我的帖子看起来好多了:)