我正在尝试编写一个Flink应用程序,该应用程序从Kafka读取事件,从MySQL丰富这些事件,并将此数据写入HBase。我正在RichFlatMapFunction
中进行MySQL扩充,现在正试图找出如何最好地写入HBase。我想批量写入HBase,因此我目前正在考虑使用WindowAll
,然后使用标识apply
(仅返回到DataStream
),然后编写使用列表的HBaseSink
记录并从Puts
批处理到HBase
。
这是做事的正确方法吗?使用WindowAll
和apply
只是在进行基于时间的缓冲,这感觉很奇怪。
处理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
事件。
根据我在Jira上看到的FLINK-2055,我认为当前最好的选择是使用Flink Streaming的support for Async I/O,并在该自定义函数中处理缓冲。似乎棘手的问题来自(a)正确处理检查点/重试(原子放置)和(b)避免HBase区域服务器超载。但是,如果您不担心一次支持,并且可以将设置调整到HBase设置,那么这应该非常简单。