我正在尝试编写一个Flink应用程序,它从Kafka读取事件,从MySQL丰富这些事件并将这些数据写入HBase。我正在RichFlatMapFunction
中进行MySQL丰富,我现在正在尝试弄清楚如何最好地写入HBase。我想批量写入HBase,所以我目前正在考虑使用WindowAll
,后跟标识应用程序
(仅返回DataStream
),然后编写HBaseSink
,它获取记录列表并批处理将
放入HBase
。
这是正确的做事方式吗?仅仅为了进行基于时间的缓冲而使用所有窗口和应用窗口感觉很奇怪。
处理HBase时最繁重的操作实际上是打开与它的连接(在留档:https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Connection.html中也有解释)。
我的建议是实现另一个RichFlatMapFunction,这样您就可以在每个任务中只打开一个连接一次,然后在每次需要持久化事件时都对HBase执行一次Put。到目前为止,与您当前方法的区别在于:
WindowAll
HBaseSink
从批处理或流式处理的角度来看,对HBase执行Put实际上并不会改变操作的复杂性(正如您从这个问题的第一个答案中所看到的那样:HBase是否批处理Put Put(列表
从我在使用FLINK-2055的Jira上看到的情况来看,我认为您目前最好的选择是使用Flink Streaming对异步I/O的支持,并在该自定义函数中处理缓冲。似乎棘手的部分来自(a)正确处理检查点/重试(原子放置)和(b)避免重载HBase区域服务器。但是如果您不担心精确一次支持,并且可以根据您的HBase设置调整设置,那么这应该非常简单。
主要内容:1.时间语义概述,2.水平线 Watermark1.时间语义概述 对于一台机器而言,“时间”自然就是指系统时间。但我们知道,Flink 是一个分布式处理系统。分布式架构最大的特点,就是节点彼此独立、互不影响,这带来了更高的吞吐量和容错性;但有利必有弊,最大的问题也来源于此。 在事件发生之后,生成的数据被收集起来,首先进入分布式消息队列,然后被 Flink 系统中的 Source 算子读取消费,进而向下游的转换算子(窗口算子)传递,最终由窗口算子
Apache Flink缓冲任务的传出,然后将其发送到下一个任务进行处理。缓冲会影响延迟,而且正如我所知,即使缓冲区没有填满,也会有一个缓冲超时,以便将数据发送到下一个任务。 如何更改缓冲超时?我在留档中找不到任何东西。 配置是每个Flink集群还是每个TaskManager?它可以按任务/运算符配置吗? 据我所知,即使任务在同一个TaskManager上,Flink缓冲区也是如此。在这种情况下,
现在我的疑虑是: 1)即使当少数检查点状态大小比其它检查点状态小(70-80%小)时,它也需要几分钟(15-20%的时间),而其它检查点状态则需要5-10秒。 2)缓冲区对齐大小有时会增加到7-8GB,而平均为800MB-1GB,但检查点时间不受此影响。我想它应该需要更多时间,因为它应该等待检查点屏障。 4)很少的子任务在hdfs中需要2-3分钟(5-10%的时间),所以98%的子任务在30-50
我们正在接收来自多个独立数据源的事件,因此,到达我们Flink拓扑(通过Kafka)的数据将是无序的。 我们正在Flink拓扑中创建1分钟的事件时间窗口,并在源操作符处生成事件时间水印(当前事件时间-某些阈值(30秒))。 如果一些事件在设置的阈值之后到达,那么这些事件将被忽略(在我们的例子中这是可以的,因为属于该分钟的大多数事件都已经到达并在相应的窗口中得到处理)。 现在的问题是,如果程序崩溃(
我试图使用process函数对一组事件进行处理。我正在使用事件时间和键控流。我面临的问题是,水印值始终为9223372036854725808。我已经对print语句进行了调试,它显示如下: 时间戳------1583128014000提取时间戳1583128014000当前水印------9223372036854775808 时间戳------1583128048000提取时间戳1583128
在Flink中,我发现了2种设置水印的方法, 第一个是 第二个是 我想知道哪个最终会生效。