如何分离/关闭JavaDStream和TwitterUtils.createStream(...)

时间:2016-06-10 17:55:33

标签: apache-spark spark-streaming

我有一个SPARK应用程序,它使用TwitterUtils来读取Twitter流,并在流上使用地图和foreachRDD将Twitter消息放入数据库。一切都很好。

我的问题:一旦所有内容运行,从Twitter流中分离的最合适方式是什么。假设我只想收集1000条消息或运行该集合60秒。

代码如下:

SparkConf sparkConf = new SparkConf().setAppName("Java spark twitter stream");
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf, new Duration(1000));
JavaDStream<Status> tweets = TwitterUtils.createStream(ssc, filters);

JavaDStream<String> statuses = tweets.map(
        new Function<Status, String>() {
            public String call(Status status) {
                //combine the strings here.
                GeoLocation geoLocation = status.getGeoLocation();
                if (geoLocation != null) {
                    String text = status.getText().replaceAll("[\r\n]", " ");
                    String line = geoLocation.getLongitude() + ",,,,"
                           + geoLocation.getLatitude() + ",,,,"
                           + status.getCreatedAt().getTime()
                           + ",,,," + status.getUser().getId()
                           + ",,,," + text;
                    return line;
                } else {
                    return null;
                }
            }
        }
        ).filter(new Function<String, Boolean>() {
            public Boolean call(String input) {
                return input != null;
            }
        });
        statuses.print();


statuses.foreachRDD(new Function2<JavaRDD<String>, Time, Void>() {
        @Override
        public Void call(JavaRDD<String> rdd, Time time) {
            SQLContext sqlContext 
                     = JavaSQLContextSingleton
                           .getInstance(rdd.context());
            sqlContext.setConf("spark.sql.tungsten.enabled", "false");

            JavaRDD<Row> tweetRowRDD 
                     = rdd.map(new TweetMapLoadFunction());

            DataFrame statusesDataFrame 
                     = sqlContext
                            .createDataFrame(
                                tweetRowRDD,
                                tweetSchema.createTweetStructType());
            return null;
        }
    });

    ssc.start();
    ssc.awaitTermination();

1 个答案:

答案 0 :(得分:0)

直接来自 the documentation

  

可以使用streamingContext.stop()手动停止处理。

     

要记住的要点:

     
      
  • 一旦启动了上下文,就无法设置或添加新的流式计算。
  •   
  • 上下文停止后,无法重新启动。
  •   
  • 同时只能在JVM中激活一个StreamingContext。
  •   StreamingContext上的
  • stop()也会停止SparkContext。要仅停止StreamingContext,请将名为stopSparkContext的stop()的可选参数设置为false。
  •   
  • 只要在创建下一个StreamingContext之前停止前一个StreamingContext(不停止SparkContext),就可以重复使用SparkContext创建多个StreamingContexts。
  •