在练习Flink时,遇到了一个问题:
我明明没有设置窗口的延迟,但是滚动窗口依然会延迟计算,我在Kafka的Produce中使用了这些数据:
1,1,1633713600000
2,1,1633713601000
3,2,1633713602000
4,3,1633713603000
5,2,1633713604000
6,4,1633713605000
7,3,1633713606000
8,4,1633713607000
9,5,1633713608000
10,5,1633713609000
11,1,1633713610000
12,2,1633713611000
13,3,1633713612000
14,4,1633713613000
15,2,1633713614000
代码如下:
import org.apache.flink.api.common.eventtime.{SerializableTimestampAssigner,WatermarkStrategy}
import org.apache.flink.api.common.functions.MapFunction
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.assigners.TumblingEventTimeWindows
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer
import java.util.Properties
object ProduceFiveMinute {
def main(args: Array[String]): Unit = {
val environment = StreamExecutionEnvironment.getExecutionEnvironment
val pros = new Properties()
pros.setProperty("bootstrap.servers", "localhost:9092")
val stream = environment
.addSource(new FlinkKafkaConsumer[String]("ProduceRecord", new SimpleStringSchema(), pros))
.map(new MapFunction[String, Product] {
override def map(value: String): Product = {
val fields = value.split(",")
Product(fields(0).trim.toLong, fields(1).trim.toLong, fields(2).trim.toLong)
}
})
.assignTimestampsAndWatermarks(WatermarkStrategy.forMonotonousTimestamps[Product]().withTimestampAssigner(new SerializableTimestampAssigner[Product] {
override def extractTimestamp(element: Product, recordTimestamp: Long): Long = element.timestamp
}))
.keyBy(_.device_id)
.window(TumblingEventTimeWindows.of(Time.seconds(1)))
.sum(1)
.print()
environment.execute()
}
}
为了方便测试我把滑动窗口设置成了每秒一次,但是,当数据进行到5,2,1633713604000时,第一个时间窗口才会进行聚合计算。
原因:ExecutionEnvironment的Parallelism没有设置为 1。
解决方法,添加
environment.setParallelism(1)
问题成功解决。
问题的原因可能是在通常情况下,Flink 会根据作业的需求自动推荐合适的并行度。如果需要手动设置 Parallelism,应该确保设置的并行度符合应用程序的数据流特征和资源限制。所以,当出现类似问题时,你需要考虑什么样的并行度更适合你的应用程序,并相应地进行调整。因为没有手动设置Parallelism的值,所以导致并行度是Flink提供的推荐值,如果Parallelism的推荐值是16,那么将同时运行16个算子。