如何在Spark Streaming中对窗口操作执行combineByKey()

时间:2016-06-20 19:01:35

标签: apache-spark spark-streaming

我正在寻找类似combineByKeyAndWindow()的内容,但这不可用。有没有办法使用combineByKey()foreachRDD模仿其功能?

编辑:

object DirectKafkaWordCount {
def main(args: Array[String]) {
if (args.length < 2) {
  System.err.println(s"""
    |Usage: DirectKafkaWordCount <brokers> <topics>
    |  <brokers> is a list of one or more Kafka brokers
    |  <topics> is a list of one or more kafka topics to consume from
    |
    """.stripMargin)
  System.exit(1)
}

val Array(brokers, topics) = args

val sparkConf = new SparkConf().setAppName("DirectKafkaWordCount")
val ssc = new StreamingContext(sparkConf, Seconds(5))

val topicsSet = topics.split(",").toSet
val kafkaParams = Map[String, String]("metadata.broker.list" -> brokers)
val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
  ssc, kafkaParams, topicsSet)

val lines = messages.map(_._2)

var counter = 0
lines.window(Seconds(10),Seconds(5)).foreachRDD { (rdd : RDD[String], time : Time) =>

    val wc = rdd.flatMap(_.split(" ")).map(x => (x,1)).reduceByKey(_+_)
    wc.coalesce(1).saveAsTextFile("file:///home/vdep/output/temp"+counter)
    counter = counter + 1
} 

ssc.checkpoint("/home/vdep/kafkaOutput/kafkachkpt/") 
ssc.start()
ssc.awaitTermination()
}
}

上面是一个简单的wordCount程序,使用.window()&amp; .foreachRDD()。我将结果保存到每次迭代(RDD)的文件中。但是只有temp0保存在输出文件夹中。

lines是Kafka DirectStream。

但是没有.window()的预期代码字。

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以通过以下方式获得相同的结果:

dstream.window(...).transform(rdd=> rdd.combineByKey(...))

虽然您会错过Reducer提供的窗口中数据大小的优化。