Spark structured streaming 如何使用spark结构化流媒体从kafka连续传输数据?

Spark structured streaming 如何使用spark结构化流媒体从kafka连续传输数据?,spark-structured-streaming,spark-streaming-kafka,Spark Structured Streaming,Spark Streaming Kafka,我正在尝试将我的数据流api迁移到结构化流媒体,并反复思考如何等待或无法将微博客与结构化流媒体关联起来 在下面的代码中,我创建了直接流并永远等待,这样我就可以无限期地使用卡夫卡消息 如何在结构化流媒体中实现同样的效果 sparkSession.streams.WaitingAnyTermination是否足够 我在下面的流媒体和结构化流媒体中都添加了一个示例代码。任何指点都会很有帮助的。谢谢 val kafkaParams = Map[String, Object]( "boot

我正在尝试将我的数据流api迁移到结构化流媒体,并反复思考如何等待或无法将微博客与结构化流媒体关联起来

在下面的代码中,我创建了直接流并永远等待,这样我就可以无限期地使用卡夫卡消息

如何在结构化流媒体中实现同样的效果

sparkSession.streams.WaitingAnyTermination是否足够

我在下面的流媒体和结构化流媒体中都添加了一个示例代码。任何指点都会很有帮助的。谢谢

val kafkaParams = Map[String, Object](
        "bootstrap.servers" -> "localhost:9092",
        "key.deserializer" -> classOf[StringDeserializer], 
        "value.deserializer" -> classOf[StringDeserializer],
        "auto.offset.reset" -> "latest",
        "max.poll.records" -> "1",
        "group.id" -> "test",
        "enable.auto.commit" -> (true: java.lang.Boolean))
val ssc = new StreamingContext(sparkSession.sparkContext, Seconds(10))
      val stream = KafkaUtils.createDirectStream[String, String](ssc,  PreferConsistent,Subscribe[String, String]("mytopic",kafkaParams))

performRddComputation(stream, sparkSession)

 ssc.start()
 ssc.awaitTermination()

结构化流媒体等价物


我将发布一个适合我的版本:

val df = sparkSession
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "localhost:9092")
  .option("kafkfa.offset.strategy","latest")
  .option("subscribe", "mytopic")
  .load()
  //df.printSchema()

  val tdf = df.selectExpr("CAST(value AS STRING)")
    .select("value")
    .writeStream
    .outputMode("append")
    .format("console")
    .option("truncate","false")
    .start()
  tdf.awaitAnyTermination()

它应该适合你

我将发布一个适合我的版本:

val df = sparkSession
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "localhost:9092")
  .option("kafkfa.offset.strategy","latest")
  .option("subscribe", "mytopic")
  .load()
  //df.printSchema()

  val tdf = df.selectExpr("CAST(value AS STRING)")
    .select("value")
    .writeStream
    .outputMode("append")
    .format("console")
    .option("truncate","false")
    .start()
  tdf.awaitAnyTermination()

它应该适用于您

如果您只有一个查询,只需在查询中使用
即可:

val df = sparkSession
      .readStream
      .format("kafka")
      .option("kafka.bootstrap.servers", "localhost:9092")
      .option("kafkfa.offset.strategy","latest")
      .option("subscribe", "mytopic")
      .load()
      df.printSchema()

val tdf = df.selectExpr("CAST(value AS STRING)").as[String]
    .select("value")
    .map(record =>  {//do something})
    .writeStream
    .format("console")
    .option("truncate","false")
    .start()

// do something

tdf.awaitTermination()
waittermination
是一个阻塞调用,因此在此之后编写的任何内容都将仅在查询终止后调用

如果需要处理多个查询,可以在
StreamingQueryManager
上使用
等待任何终止

sparkSession.streams.awaitAnyTermination()

如果您想在其中一个查询失败的情况下保持应用程序运行,则在循环中调用
waitanytermination()
,然后调用
resetTerminated()

如果只有一个查询,只需对查询使用

val df = sparkSession
      .readStream
      .format("kafka")
      .option("kafka.bootstrap.servers", "localhost:9092")
      .option("kafkfa.offset.strategy","latest")
      .option("subscribe", "mytopic")
      .load()
      df.printSchema()

val tdf = df.selectExpr("CAST(value AS STRING)").as[String]
    .select("value")
    .map(record =>  {//do something})
    .writeStream
    .format("console")
    .option("truncate","false")
    .start()

// do something

tdf.awaitTermination()
waittermination
是一个阻塞调用,因此在此之后编写的任何内容都将仅在查询终止后调用

如果需要处理多个查询,可以在
StreamingQueryManager
上使用
等待任何终止

sparkSession.streams.awaitAnyTermination()
如果您想在其中一个查询失败的情况下保持应用程序运行,则在循环中调用
waitanytermination()
,然后调用
resetTerminated()