Flink时间缓冲接收器

问题描述 投票:0回答:2

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

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

apache-flink flink-streaming
2个回答
0
投票

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

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

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

关于从批处理或从流的角度执行Put到HBase的事实,实际上并没有改变操作的复杂性(也可以从对该问题的第一个答案:Is HBase batch put put(List<Put>) faster than put(Put)? What is the capacity of a Put object?中看到)到目前为止,您仍将进行N操作以持久保存N事件。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.