kafka流式读取第一批本身的所有数据

时间:2017-06-08 15:03:59

标签: apache-spark spark-streaming

我在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();
            }
        });

2 个答案:

答案 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)

Spark Streaming使用&#34;微批处理&#34;也就是说,在batch interval数据到达或收集期间。

在每个批处理间隔截止日期,到达该时刻的数据将被发送到Spark处理。如果流媒体处理开始时,所有数据都已在Kafka上接收,则所有数据将在第一个时间间隔内立即处理。

enter image description here

在那一刻之后到达的最终新数据将是进一步的间隔过程。