Flink时间缓冲接收器

时间:2019-09-26 20:25:15

标签: apache-flink flink-streaming

我正试图编写一个Flink应用程序,该应用程序从Kafka读取事件,从MySQL丰富这些事件,并将此数据写入HBase。我正在RichFlatMapFunction中进行MySQL扩充,现在正试图找出如何最好地写入HBase。我想批量写入HBase,因此我目前正在考虑使用WindowAll,然后使用标识apply(仅返回到DataStream),然后编写{ {1}},它获取记录列表,并将HBaseSink批处理到Puts

这是做事的正确方法吗?使用HBaseWindowAll只是为了进行基于时间的缓冲,这感觉很奇怪。

2 个答案:

答案 0 :(得分:1)

根据我在Jira上使用FLINK-2055看到的内容,我认为当前最好的选择是使用Flink Streaming的support for Async I/O,并在该自定义函数中处理缓冲。似乎棘手的问题来自(a)正确处理检查点/重试(原子放置)和(b)避免HBase区域服务器超载。但是,如果您不担心一次支持,并且可以将设置调整到HBase设置,那么这应该很简单。

答案 1 :(得分:0)

处理HBase时最重的操作实际上是打开与它的连接(也如文档https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Connection.html中所述)。

我的建议是实现另一个RichFlatMapFunction,以便您在每个任务中只能打开一次连接,然后在每次需要事件时对HBase执行Put坚持。 到目前为止,您与当前方法的不同之处在于:

  • 您不需要使用WindowAll
  • 您不会每次在HBaseSink
  • 中打开与HBase的新连接

关于从批次或从流的角度执行Put到HBase的事实,实际上并没有改变操作的复杂性(正如您从该问题的第一个答案中也可以看到的那样,{ {3}}),到目前为止,您仍将执行N个操作来持久保存N个事件。