【Flink】没有设置窗口的延迟,但是滚动窗口依然会延迟计算

在练习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个算子。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值