Apache flink Flink interval联接不输出

Apache flink Flink interval联接不输出,apache-flink,Apache Flink,我们有一个Flink任务,它有两个流,两个流都使用来自卡夫卡的事件。下面是示例代码 val articleEventStream: DataStream[ArticleEvent] = env.addSource(articleEventSource) .assignTimestampsAndWatermarks(new ArticleEventAssigner) val feedbackEventStream: DataStream[FeedbackEvent] = env.addSou

我们有一个Flink任务,它有两个流,两个流都使用来自卡夫卡的事件。下面是示例代码

val articleEventStream: DataStream[ArticleEvent] = env.addSource(articleEventSource)
  .assignTimestampsAndWatermarks(new ArticleEventAssigner) 
val feedbackEventStream: DataStream[FeedbackEvent] = env.addSource(feedbackEventSource)
  .assignTimestampsAndWatermarks(new FeedbackEventAssigner) 

articleEventStream
    .keyBy(article => article.id)
    .intervalJoin(feedbackEventStream.keyBy(feedback => feedback.article.id))
    .between(Time.seconds(-5), Time.seconds(10))
    .process(new ProcessJoinFunction[ArticleEvent, FeedbackEvent, String] {
        override def processElement(left: ArticleEvent, right: FeedbackEvent, ctx: ProcessJoinFunction[ArticleEvent, FeedbackEvent, String]#Context, out: Collector[String]): Unit = {
         out.collect(left.name + " got feedback: " + right.feedback); 
        }
      });
});

class ArticleEventAssigner extends AssignerWithPunctuatedWatermarks[ArticleEvent] {
  val bound: Long = 5 * 1000

  override def checkAndGetNextWatermark(lastElement: ArticleEvent, extractedTimestamp: Long): Watermark = {
    new Watermark(extractedTimestamp - bound)
  }

  override def extractTimestamp(element: ArticleEvent, previousElementTimestamp: Long): Long = {
    element.occurredAt
  }
}

class FeedbackEventAssigner extends AssignerWithPunctuatedWatermarks[FeedbackEvent] {
  val bound: Long = 5 * 1000

  override def checkAndGetNextWatermark(lastElement: FeedbackEvent, extractedTimestamp: Long): Watermark = {
    new Watermark(extractedTimestamp - bound)
  }

  override def extractTimestamp(element: FeedbackEvent, previousElementTimestamp: Long): Long = {
    element.occurredAt
  }
}

但是,我们没有看到任何连接输出。我们检查了每个流是否连续发射带有时间戳和适当水印的元素。有人知道可能的原因吗?

在检查了不同的部分(时间戳/水印、触发器)后,我注意到我犯了一个错误,即我使用的窗口大小

介于(时间.秒(-5),时间.秒(10))

太小,无法从两个流中找到要连接的元素。这听起来可能很明显,但由于我对弗林克还不熟悉,我不知道去哪里查。 因此,我的经验是,如果联接没有输出,可能需要检查窗口大小。
谢谢大家的评论

您可以扩展您的代码示例吗?时间戳分配是否正确?@Dominikowsiński感谢您的评论!我更新了示例代码。除非您的时间戳从未出现问题,否则这将生成可以倒转的水印,这是不允许的。我不确定弗林克是否能保护自己不受此影响。@DavidAnderson在这种情况下,弗林克只会忽略比以前发出的水印低的水印。我不确定标点水印是否正确,但你是对的,我在TimestampsandSparketedWatermarksOperator中找到了这一检查。所以这不是问题所在。