使用Spark Streaming后无输出

时间:2016-04-27 10:08:38

标签: apache-spark apache-kafka spark-streaming

HashMap<String, String> kafkaParams = new HashMap<>();
kafkaParams.put("metadata.broker.list", "localhost:9092");

String topics = "test4";
HashSet<String> topicsSet = new HashSet<String>(Arrays.asList(topics.split(" ")));


JavaDStream<String> stream1 = KafkaUtils.createDirectStream(jssc, String.class, String.class, StringDecoder.class,
    StringDecoder.class, kafkaParams, topicsSet)
    .transformToPair(new Function<JavaPairRDD<String, String>, JavaPairRDD<String, String>>() {
      @Override
      public JavaPairRDD<String, String> call(JavaPairRDD<String, String> rdd) {
        rdd.saveAsTextFile("output");
        return rdd;
      }
    }).map(new Function<Tuple2<String, String>, String>() {
      @Override
      public String call(Tuple2<String, String> kv) {
        return kv._2();
      }
    });
stream1.print();
jssc.start();
jssc.awaitTermination();

交叉检查主题&#34; test4&#34;。

中是否有有效数据

enter image description here

我期待从kafka集群流式传输的字符串在控制台中打印。控制台中没有例外,但也没有输出。 我在这里缺少什么?

2 个答案:

答案 0 :(得分:4)

您是否尝试在流媒体应用程序启动后的主题中生成数据?

默认情况下,直接流使用配置auto.offset.reset = maximum,这意味着当没有初始偏移时它会自动重置为最大偏移量,所以基本上你只能读取输入的新消息流应用程序启动后的主题。

答案 1 :(得分:1)

正如ccheneson所说,可能是因为您遗漏了.start().awaitTermination()

或者可能是因为transformations in Spark are lazy,这意味着您需要添加操作才能获得结果。 e.g。

stream1.print();

或者可能是因为map正在执行程序上执行,因此输出将在执行程序的日志中,而不是驱动程序的日志中。