【发布时间】:2017-06-08 16:27:09
【问题描述】:
我正在消费 Kafka 主题。本主题有 3 个分区。 我正在使用 foreachRDD 处理每个批次 RDD(使用 processData 方法处理每个 RDD,并最终从中创建一个 DataSet)。
现在,您可以看到我有计数变量,并且我在“processData”方法中增加了这个计数变量,以检查我处理了多少实际记录。 (我明白,每个 RDD 都是 kafka 主题记录的集合,数量取决于批间隔大小)
现在,输出是这样的:
1 1 1 2 3 2 4 3 5 ....
这让我觉得这是因为我可能有 3 个消费者(因为我有 3 个分区),并且每个消费者都将分别调用“foreachRDD”方法,所以相同的计数被打印不止一次,因为每个消费者可能已缓存其计数副本。
但我得到的最终输出数据集包含所有记录。
那么,Spark 会在内部合并所有数据吗?它如何确定要联合的内容? 我正在尝试理解这种行为,以便形成我的逻辑
int 计数 = 0;
messages.foreachRDD(new VoidFunction<JavaRDD<ConsumerRecord<K, String>>>() {
public void call(JavaRDD<ConsumerRecord<K, V>> rdd) {
System.out.println("NUmber of elements in RDD : "+ rdd.count());
List<Row> rows = rdd.map(record -> processData(record))
.reduce((rows1, rows2) -> {
rows1.addAll(rows2);
return rows1;
});
StructType schema = DataTypes.createStructType(fields);
Dataset ds = ss.createDataFrame(rows, schema);
ds.createOrReplaceTempView("trades");
ds.show();
}
});
【问题讨论】:
标签: apache-spark spark-streaming