我正在寻找类似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()
的预期代码字。
答案 0 :(得分:2)
您可以通过以下方式获得相同的结果:
dstream.window(...).transform(rdd=> rdd.combineByKey(...))
虽然您会错过Reducer提供的窗口中数据大小的优化。