我正试图编写一个Flink应用程序,该应用程序从Kafka读取事件,从MySQL丰富这些事件,并将此数据写入HBase。我正在RichFlatMapFunction
中进行MySQL扩充,现在正试图找出如何最好地写入HBase。我想批量写入HBase,因此我目前正在考虑使用WindowAll
,然后使用标识apply
(仅返回到DataStream
),然后编写{ {1}},它获取记录列表,并将HBaseSink
批处理到Puts
。
这是做事的正确方法吗?使用HBase
和WindowAll
只是为了进行基于时间的缓冲,这感觉很奇怪。
答案 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
关于从批次或从流的角度执行Put
到HBase的事实,实际上并没有改变操作的复杂性(正如您从该问题的第一个答案中也可以看到的那样,{ {3}}),到目前为止,您仍将执行N
个操作来持久保存N
个事件。