基于时间戳同步Apache Flink流

时间:2018-04-27 05:25:58

标签: apache-flink

我有几个用例,我需要根据时间戳同步多个流。

这是一个例子,我想要同步交易条和报价栏,例如我从原始交易和报价中生成这样的报价,我汇总了:

val tradeBars: DataStream[TradeBar] = trades
  .assignAscendingTimestamps(_.epochMillis)
  .keyBy("key")
  .window(TumblingEventTimeWindows.of(Time.minutes(5)))
  .process(new TimeTradeBar(new DownTick()))

val quotesWithFlow = quotes
  .assignAscendingTimestamps(_.epochMillis)
  .keyBy("key")
  .countWindow(2, 1)
  .reduce((previousQuote, quote) => Quote.localOrderFlow(previousQuote, quote))
  .assignAscendingTimestamps(_.epochMillis)
  .keyBy("key")

val quoteBars: DataStream[QuoteBar] = quotesWithFlow
  .assignAscendingTimestamps(_.epochMillis)
  .keyBy("key")
  .window(TumblingEventTimeWindows.of(Time.minutes(5)))
  .process(new QuoteBars.TimeQuoteBar())

val joined: JoinedStreams[TradeBar, QuoteBar]#Where[LocalDateTime]#EqualTo = tradeBars
  .join(quoteBars)
  .where(_.start).equalTo(_.start)
  // need a window here, just want to sync on same time window

我尝试使用Flink的窗口连接功能,但显然现在需要一个窗口函数,然后我可以执行一个apply方法。我想要的是在同一时间窗口同步流。我怀疑这不是join方法的意图。

我有一个使用Flink流连接方法的工作实现。我将它应用于交易栏流和原始报价流,但这要求我自己编写一个非常混乱的CoProcessFunction

CoProcessTradeBarsAndQuotes() extends CoProcessFunction[TradeBar, Quote, (TradeBar, QuoteBar)]
{}

这非常混乱,因为我必须跟踪缓冲区中的引号并小心地执行process1和process2函数的聚合。我想必须有一个更简单的方法,我只是没有看到它。感谢任何帮助和想法。

1 个答案:

答案 0 :(得分:1)

你没有提到你用来决定加入哪两个股票(很可能很多)的逻辑,但总的来说我通过从第一个窗口生成输出记录来解决这个问题。函数(open,high,low,close,stock),附加字段表示窗口的时间(截断为小时),然后键入该时​​间字段并执行另一个窗口操作以创建所需股票的连接