如何在scala中编写代码时在DStream上应用RDD函数

时间:2014-08-30 11:57:55

标签: scala apache-spark spark-streaming

我正在尝试在Scala中编写一个简单的Spark代码。

这里我得到了一个DStream。我成功地打印了这个DStream。但是当我试图在这个DStream上做任何类型的“foreach”,“foreachRDD”或“转换”功能时,那么在执行我的程序时我的控制台就会被冻结。在这里,我没有收到任何错误,但控制台只是在我手动终止eclipse控制台操作之前变得无响应。我在这里附上代码。请告诉我,我做错了什么。

我的主要目标是在DStream上应用RDD操作,为了按照我的知识进行操作,我需要使用“foreach”,“foreachRDD”或“transform”函数将我的DStream转换为RDD。

我已经通过使用Java实现了相同的功能。但是在scala中我遇到了这个问题。

还有其他人面临同样的问题吗?如果没有,那么请帮助我。感谢

我在这里写一个示例代码

object KafkaStreaming {
    def main(args: Array[String]) {
        if (args.length < 4) {
            System.err.println("Usage: KafkaWordCount <zkQuorum> <group> <topics> <numThreads>")
            System.exit(1)
        }

        val Array(zkQuorum, group, topics, numThreads) = args
                val ssc =  new StreamingContext("local", "KafkaWordCount", Seconds(2))
        val topicpMap = topics.split(",").map((_,numThreads.toInt)).toMap
        val lines = KafkaUtils.createStream(ssc, zkQuorum, group, topicpMap).map(_._2)
        val splitLines:DStream[String] = lines.flatMap(_.split("\n"))

        val pairAlarm = splitLines.map(

                x=>{
                            //Some Code
                            val alarmPair = new Tuple2(key, value)
                            alarmPair
                }

                )


            //pairAlarm.print


            pairAlarm.foreachRDD(x=>{
            println("1 : "+x.first)
            x.collect                           // When the execution reaching this part its getting freeze
            println("2: "+x.first)
            })


                ssc.start()
                ssc.awaitTermination()
    }
}

1 个答案:

答案 0 :(得分:3)

我不知道这是不是你的问题,但我有一个类似的问题。我的程序在几次迭代后才停止打印。没有例外等只是在5-6次打印后停止打印。

更改此内容:

val ssc =  new StreamingContext("local", "KafkaWordCount", Seconds(2))

到此:

val ssc =  new StreamingContext("local[2]", "KafkaWordCount", Seconds(2))

解决了这个问题。 Spark需要运行至少2个线程,文档示例也会产生误导,因为它们只使用local

希望这有帮助!