我正在尝试从 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)
但这没有发生。究竟我在这里理解错了什么,是否与我通过工作的论据有关,或者这是工作的意图吗?
有人可以提供一些见解吗?
由于 沙比尔
答案 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)
非常感谢 沙比尔