如何在Kafka Direct Stream中使用Spark Structured Streaming?

时间:2016-09-01 15:39:46

标签: scala apache-spark apache-kafka spark-structured-streaming

我遇到Structured Streaming with Spark,它有一个从S3存储桶继续消耗并将处理结果写入MySQL数据库的示例。

// Read data continuously from an S3 location
val inputDF = spark.readStream.json("s3://logs")

// Do operations using the standard DataFrame API and write to MySQL
inputDF.groupBy($"action", window($"time", "1 hour")).count()
       .writeStream.format("jdbc")
       .start("jdbc:mysql//...")

如何与Spark Kafka Streaming一起使用?

val stream = KafkaUtils.createDirectStream[String, String](
  ssc,
  PreferConsistent,
  Subscribe[String, String](topics, kafkaParams)
)

有没有办法在不使用stream.foreachRDD(rdd => {})的情况下合并这两个示例?

2 个答案:

答案 0 :(得分:11)

  

有没有办法在不使用的情况下组合这两个例子   stream.foreachRDD(rdd => {})?   

还没有。 Spark 2.0.0没有Kafka sink支持结构化流。这是一个应该出现在Spark 2.1.0 according to Tathagata Das中的功能,它是Spark Streaming的创建者之一。 Here is the relevant JIRA issue

编辑:(29/11/2018)

是的,可以使用Spark 2.2版开始。

stream
  .writeStream // use `write` for batch, like DataFrame
  .format("kafka")
  .option("kafka.bootstrap.servers", "brokerhost1:port1,brokerhost2:port2")
  .option("topic", "target-topic1")
  .start()

查看此SO post(read and write on Kafka topic with Spark streaming)了解更多信息。

编辑:(2016年12月6日)

结构化流媒体的Kafka 0.10集成现在是expiramentaly supported in Spark 2.0.2

val ds1 = spark
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("subscribe", "topic1")
  .load()

ds1
  .selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .as[(String, String)]

答案 1 :(得分:3)

我有一个类似的问题,他从Kafka来源读书并写信给Cassandra水槽。在这里创建了一个简单的项目kafka2spark2cassandra,分享以防它对任何人都有帮助。