Spark streaming:如何编写累积输出?

时间:2017-04-13 21:57:29

标签: scala apache-spark spark-streaming spark-dataframe

我必须为我的流媒体作业写一个输出文件。

问题:我的工作什么时候才会停止?我杀死了服务器但没有工作。 我想从命令行停止我的工作(如果可能的话)

代码:

    import org.apache.spark.streaming.StreamingContext
    import org.apache.spark.streaming.StreamingContext._
    import org.apache.spark.streaming.dstream
    import org.apache.spark.streaming.Duration
    import org.apache.spark.streaming.Seconds
    import org.apache.spark._
    import org.apache.spark.SparkContext
    import org.apache.spark.SparkContext._
    import org.apache.spark.SparkConf
    import scala.collection.mutable.ArrayBuffer



    object MAYUR_BELDAR_PROGRAM5_V1 {

    def main(args: Array[String]) {

        val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
        val ssc = new StreamingContext(conf, Seconds(10))

        val lines = ssc.socketTextStream("localhost", args(0).toInt)
        val words = lines.flatMap(_.split(" "))

        val class1 = words.filter(a => a.charAt(0).toInt%2==0).map(a => a).filter(a => a.length%2==0)
        val class2 = words.filter(a => a.charAt(0).toInt%2==0).map(a => a).filter(a => a.length%2==1)
    val class3 = words.filter(a => a.charAt(0).toInt%2==1).map(a => a).filter(a => a.length%2==0)
    val class4 = words.filter(a => a.charAt(0).toInt%2==1).map(a => a).filter(a => a.length%2==1)

    class1.saveAsTextFiles("hdfs://hadoop1:9000/mbeldar/class1","txt")
    class2.saveAsTextFiles("hdfs://hadoop1:9000/mbeldar/class2", "txt")
    class3.saveAsTextFiles("hdfs://hadoop1:9000/mbeldar/class3","txt")
    class4.saveAsTextFiles("hdfs://hadoop1:9000/mbeldar/class4","txt")

    ssc.start()             // Start the computation
    ssc.awaitTermination()
    ssc.stop()

    }
    }

1 个答案:

答案 0 :(得分:1)

根据定义,流没有结束,因此除非您调用停止该方法的方法,否则它不会停止。在我的情况下,我有一个业务条件来告知该过程何时完成,所以到达这一点时,我将调用方法JavaStreamingContext.close()。我还有一个监视器,用于检查该进程在过去几分钟内是否未收到任何数据,在这种情况下,它还会关闭流。

为了累积数据,您必须使用方法updateStateByKey(在PairDStream上)。此方法需要启用检查点。

我检查了Spark代码,发现saveAsTextFiles使用foreachRDD,因此最后它将分别保存每个RDD,因此不会考虑以前的RDD。使用updateStateByKey仍将保存多个文件,但是每个文件都将考虑之前处理过的所有RDD。