Flink' timeWindow'操作不为PopularPlacesFromKafka示例文件

时间:2017-09-19 17:51:14

标签: apache-flink

我正在阅读来自dataArtisans的Flink教程资料,当我到达示例文件PopularPlacesFromKafka.scala时出于某种原因 我没有将任何输出发送到stdout。

...
// find popular places
val popularSpots = rides
  // match ride to grid cell and event type (start or end)
  .map(new GridCellMatcher)
  // partition by cell id and event type
  .keyBy( k => k )
  // build sliding window
  .timeWindow(Time.minutes(15), Time.minutes(5))
  // count events in window
  .apply{ (key: (Int, Boolean), window, vals, out: Collector[(Int, Long, Boolean, Int)]) =>
    out.collect( (key._1, window.getEnd, key._2, vals.size) )
  }

// print result on stdout
    popularSpots.print()
...

我已经确认数据是从Kafka中提取出来的,而且当它尝试执行“时间窗口”时似乎已经出现了问题。我得不到输出的操作。如果我删除' timeWindow'操作我可以看到' keyBy'输出数据。我有什么明显的遗失吗?

3 个答案:

答案 0 :(得分:1)

如果有人遇到同样的问题,这就是我的问题。

我的kafka主题有多个分区,但是将所有测试数据生成到一个分区(0),一旦我有> 1个Kafka消费者,除了分配给分区0的消费者之外的所有消费者都没有接收任何数据,因此不向运营商链发送任何水印 - 导致窗口功能停止发送数据(这也是为什么它在这些情况下与ProcessingTime一起工作的原因)。这是关于它的相关JIRA:

https://issues.apache.org/jira/browse/FLINK-5479

答案 1 :(得分:0)

您是否为源配置了适当的加速?默认情况下(没有加速因子),源模拟原始数据,即它以与最初生成的速率相同的速率发出记录。这意味着生成1分钟的数据需要1分钟。

窗口操作员在最后15分钟的数据中每5分钟聚合一次。因此,窗口操作员产生第一个结果需要5分钟。

如果您将加速因子设置为600,您将在1秒内获得10分钟的数据。

答案 2 :(得分:0)

一般来说,Flink作业可能不会产生任何输出有几个原因,但一个非常常见的原因与水印有关。 Flink的事件时钟仅在当前水印前进时前进,因此没有水印,事件时间窗口将永远不会触发。

对于Flink训练演习,出租车来源为您制作水印。但是现在您正在使用Kafka源代码,您必须实现时间戳提取器和水印生成器,然后在您的流上调用assignTimestampsAndWatermarks(请参阅documentation)。延迟与写入Kafka的作业配置的延迟匹配的BoundedOutOfOrdernessTimestampExtractor将运行良好。