Kafka stream to spark不会减少计数

时间:2017-05-04 04:55:01

标签: apache-spark streaming apache-kafka

我正在尝试从 kafka 流式传输到 spark 的基本示例。我是 spark 的新手,并且没什么经验。

我的程序如下(从apache-spark中的示例中复制):

if (args.length < 4) {
        System.err.println("Usage: JavaKafkaWordCount <zkQuorum> <group> <topics> <numThreads>");
        System.exit(1);
    }

    String zkQuorum = args[0];
    String groupId = args[1];
    String topicsToListen = args[2];
    String numOfThread = args[3];

    StreamingExamples.setStreamingLogLevels();
    SparkConf sparkConf = new SparkConf().setAppName("JavaKafkaWordCount");
    // Create the context with 2 seconds batch size
    JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, new Duration(2000));

    int numThreads = Integer.parseInt(numOfThread);
    Map<String, Integer> topicMap = new HashMap<>();
    String[] topics = topicsToListen.split(",");
    for (String topic : topics) {
        topicMap.put(topic, numThreads);
    }

    JavaPairReceiverInputDStream<String, String> messages =
            KafkaUtils.createStream(jssc, zkQuorum, groupId, topicMap);

    JavaDStream<String> lines = messages.map(Tuple2::_2);

    JavaDStream<String> words = lines.flatMap(x -> Arrays.asList(SPACE.split(x)).iterator());

    JavaPairDStream<String, Integer> wordCounts = words.mapToPair(s -> new Tuple2<>(s, 1))
            .reduceByKey((i1, i2) -> i1 + i2);

    wordCounts.print();
    jssc.start();
    jssc.awaitTermination();

然后我启动 kafka-broker 并通过生成以下命令来运行构建的jar:

  

$ SPARK_HOME / bin / spark-submit --class“JavaKafkaWordCount” - master local [2] PATH_TO_JAR / kafka-spark-streaming-1.0-SNAPSHOT-jar-with-dependencies.jar localhost:2181 test-consumer-小组测试1

当我从 kafka-producer 中产生一些单词时,我希望多次发布的单词计数增加,但我看到的只是单词和计数为每个新发布打印1:

  

(你好,1)

当我多次发布同一个单词时,我期待计数增加,

  

(你好,2)

但这没有发生。究竟我在这里理解错了什么,是否与我通过工作的论据有关,或者这是工作的意图吗?

有人可以提供一些见解吗?

由于 沙比尔

1 个答案:

答案 0 :(得分:0)

在阅读完代码几次后,我设法确定为什么每个单词的计数只为1而不是总计

在以下行中:

// Create the context with 2 seconds batch size
JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, new Duration(2000));

我将来自流的连续读取之间的间隔设置为 2秒。我意识到我在生产者端的(2秒)区间内没有产生足够的相同字符串内容来获得聚合结果。

然而,当我将此间隔增加到 10000 millis (10秒)时,我可以从 kafka-producer <生成多行数据/ strong>即可。这些行由作业正确处理,类似的字符串计数在特定的时间间隔内很好地聚合。

  

(你好,4)

     

(世界,6)

非常感谢 沙比尔