Apache flink 弗林克时间缓冲水槽

Apache flink 弗林克时间缓冲水槽,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我正在尝试编写一个Flink应用程序,它从Kafka读取事件,从MySQL丰富这些事件,并将这些数据写入HBase。我正在RichFlatMapFunction中进行MySQL扩展,现在我正试图找出如何最好地写入HBase。我想批量写入HBase,所以我目前正在考虑使用WindowAll,然后使用identity apply,只返回数据流,然后编写一个HBasink,它获取记录列表并批量放入HBase 这是正确的做事方式吗?使用WindowAll和apply只是为了进行基于时间的缓冲,感觉很奇怪

我正在尝试编写一个Flink应用程序,它从Kafka读取事件,从MySQL丰富这些事件,并将这些数据写入HBase。我正在RichFlatMapFunction中进行MySQL扩展,现在我正试图找出如何最好地写入HBase。我想批量写入HBase,所以我目前正在考虑使用WindowAll,然后使用identity apply,只返回数据流,然后编写一个HBasink,它获取记录列表并批量放入HBase


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

在处理HBase时,最繁重的操作实际上是打开到它的连接,文档中也解释了这一点:

我建议您实现另一个RichFlatMapFunction,这样您就可以在每个任务中只打开一个连接一次,然后在每次需要持久化事件时执行对HBase的Put。 到目前为止,与您当前方法的区别在于:

您不需要使用WindowAll 您不会每次都在HBaseSink中打开到HBase的新连接
关于从批处理或流式处理的角度执行Put-to-HBase的事实,实际上并没有改变操作的复杂性,正如您从这个问题的第一个答案中所看到的:到目前为止,您仍将执行N个操作来持久化N个事件。

从我在Jira上看到的,我认为目前最好的选择是使用Flink流,并在自定义函数中处理缓冲。看起来棘手的部分来自于正确处理检查点/重试原子puts和避免HBase区域服务器过载。但是,如果您不担心一次性支持,并且可以根据您的HBase设置调整设置,那么这应该非常简单。

很有趣,谢谢。我也可以使用RichSink函数,对吗?这也让我可以重写open方法,并且我只能在其中打开一次连接。我不知道具体是什么,但是如果您想实现与RichFlatMapFunction相同但完全异步的功能,然后,您可以使用@kkrugler建议的RichAsyncFunction,您可以检查位于的文档,然后您可以在open方法的覆盖中打开到HBase的连接。