我正在阅读来自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'输出数据。我有什么明显的遗失吗?
答案 0 :(得分:1)
如果有人遇到同样的问题,这就是我的问题。
我的kafka主题有多个分区,但是将所有测试数据生成到一个分区(0),一旦我有> 1个Kafka消费者,除了分配给分区0的消费者之外的所有消费者都没有接收任何数据,因此不向运营商链发送任何水印 - 导致窗口功能停止发送数据(这也是为什么它在这些情况下与ProcessingTime一起工作的原因)。这是关于它的相关JIRA:
答案 1 :(得分:0)
您是否为源配置了适当的加速?默认情况下(没有加速因子),源模拟原始数据,即它以与最初生成的速率相同的速率发出记录。这意味着生成1分钟的数据需要1分钟。
窗口操作员在最后15分钟的数据中每5分钟聚合一次。因此,窗口操作员产生第一个结果需要5分钟。
如果您将加速因子设置为600,您将在1秒内获得10分钟的数据。
答案 2 :(得分:0)
一般来说,Flink作业可能不会产生任何输出有几个原因,但一个非常常见的原因与水印有关。 Flink的事件时钟仅在当前水印前进时前进,因此没有水印,事件时间窗口将永远不会触发。
对于Flink训练演习,出租车来源为您制作水印。但是现在您正在使用Kafka源代码,您必须实现时间戳提取器和水印生成器,然后在您的流上调用assignTimestampsAndWatermarks
(请参阅documentation)。延迟与写入Kafka的作业配置的延迟匹配的BoundedOutOfOrdernessTimestampExtractor
将运行良好。