Flink并行流中watermark机制无法触发窗口计算原因分析结果输出到PrintSink。CREATETABLEsourceTable(messageSTRING,time_ltzASTO_TIMESTAMP_LTZ(CAST(JSON_VALUE(JSON_VALUE(message,'$.request_body'),'$.clickTime')ASINTEGER),0),WATERMARKFORtime_ltzAStime_ltz-INTERVAL'3'SECOND)WITH('connector'='kafka','topic'='matrix_json_click_log_test','properties.bootstrap.servers'='xxxxxxxxx:9527','properties.group.id'='flinkTestGroup','scan.startup.mode'='latest-offset','format'='json');CREATETABLEsinkTable(window_startTIMESTAMP(3),window_endTIMESTAMP(3),click_pvBIGINT)WITH('connector'='print');INSERTINTOsinkTable(window_start,window_end,click_pv)选择window_start,window_end,COUNT(*)FROMTABLE(TUMBLE(TABLEsourceTable,DESCRIPTOR(time_ltz),INTERVAL'10'SECOND))GROUPBYwindow_start,window_end;运行上面的FlinkSQL后,我们发现数据流是正常的,但是没有触发窗口计算,也没有结果输出。watermarkwatermark用于处理乱序事件。流处理从事件产生,到流经源头,再到算子,是有一个过程和时间的。虽然在大多数情况下,流向算子的数据是按照事件发生的时间顺序来的,但也不排除由于网络等原因,部分数据可能会迟到,导致乱序。对于迟到的数据,我们不能无限期地等待,所以我们需要一种机制来衡量事件时间的进度,以保证在特定时间后必须触发窗口进行计算。这种特殊机制就是水印。对于并行流中的水印,源的每个子任务通常独立生成水印。当水印经过算子时,会提前算子处的当前事件时间,算子会为下游生成新的水印。在多并行的情况下,水印对齐将取所有通道中最小的水印。并行流watermark成因分析由于目标topic只有一个partition,sourceparallelism设置为2,只有一个线程可以处理partition,另一个线程无法获取数据,所以没有获取到最小watermark。最后,不能一直触发窗口计算。解决方案可以通过手动设置并行度来解决,保证源的并行度<=目标TopicPartition的分区数。这里设置sourceparallelism为1后,可以正常输出结果。并行度设置为1正常输出
