我在Kafka话题中插入了50条记录,每条记录之间有1秒的延迟,因此50秒内有50条记录。
在使用此主题的记录时,正如您在下面的代码中看到的那样,我将批处理间隔保持为1秒。理想情况下,我应该得到~50个RDD。 我使用foreachRDD批量获取数据,然后处理每个RDD的数据。 在下面的代码中,每次调用“call”方法时,我都在计算每个RDD中的记录。令人惊讶的是,第一个RDD本身显示50条记录,显然后续的RDD显示0条记录。 我不明白这种行为,理想情况下每个RDD应该有1条记录。
有人可以建议我的理解是错的吗?
JavaStreamingContext jssc = new JavaStreamingContext(sparkConf,Durations.seconds(1));
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();
}
});
答案 0 :(得分:2)
这是你所看到的火花的预期行为。如果你开始你的流媒体工作然后用数据填充Kafka主题(每秒说1条记录)你的批量大小将根据你的期望。 (不完全......因为Kafka主题分区)
但是可以通过使用名为max.rate.per.partition
你必须记住,它适用于每个Kafka分区。
示例:
因此,如果您的Kafka主题有3个分区。还有你的batch size is 1 second
。和max.rate.per.partition = 1
在下面提到的配置中,每个RDD批次将获得3个项目。
示例流式上下文:
```
val sparkConf = new SparkConf().
set("spark.streaming.kafka.maxRatePerPartition",
inputParam.maxRatePerPartition)
val ssc = new StreamingContext(sparkConf, inputParam.batchDuration)
```
如果您的Kafka主题有1个分区,那么您将得到您想要的内容。
答案 1 :(得分:0)