我有以下代码:
//Set basic spark parameters
val conf = new SparkConf()
.setAppName("Cartographer_jsonInsert")
val sc = new SparkContext(conf)
val ssc = new StreamingContext(sc, Seconds(2))
val messagesDStream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder, Tuple4[String, Int, Long, String]](ssc, getKafkaBrokers, getKafkaTopics("processed"), (mmd: MessageAndMetadata[String, String]) => {
(mmd.topic, mmd.partition, mmd.offset, mmd.message().toString)
})
getKafkaBrokers和getKafkaTopics调用一个API,在我们将它们添加到系统时检查数据库中的特定新主题。 SSC在每次迭代时运行更新变量吗?那么每次都会使用新变量重新创建messageDStream吗?
它看起来不像,有什么办法可以实现吗?
答案 0 :(得分:1)
Spark Streaming的创造者之一Tathagata Das在Spark User List中回答了有关现有DStream
修改的类似问题。
目前,Spark Streaming在流式上下文启动后不支持添加/删除/修改DStream。 您也无法重新启动已停止的流式上下文。 此外,多个火花上下文(因此多个流上下文)不能在同一JVM中同时运行。
我没有看到使用Spark Streaming实现此功能的直接方法,因为您无法更新图表。您需要比当前可用的更多控制。也许基于Reactive Kafka的解决方案,Kafka的Akka Streams连接器。或者您控制源的任何其他基于流的解决方案。
答案 1 :(得分:0)
任何原因你没有使用Akka Graph with reactive-kafka(https://github.com/akka/reactive-kafka)。构建反应流非常容易,其中源可以被赋予主题,流可以处理消息并下沉到接收结果。
我构建了一个示例应用程序正在使用相同的https://github.com/asethia/akka-streaming-graph