Flink异步IO关联Hbase维度表

本文详细介绍了在Flink流处理中使用异步IO以提高性能的需求和实现方式,包括Flink的异步IOAPI、线程池工具类的封装、维度查询工具类的实现以及JDBC工具类的封装。通过DimAsyncFunction抽象类,实现了与Phoenix数据库的异步交互,并在主程序中展示了如何调用异步IO代码来处理维表查询,以降低通信延迟并提升处理吞吐量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.对于异步IO的需求

2.异步IO API

3.封装线程池工具类

4.封装维度查询工具类(使用redis进行热点key缓存)

5.封装JDBC工具类(使用Phoenix连接)

6.封装DimAsyncFunction抽象类

7.主程序调用异步IO代码


1.对于异步IO的需求

       在与外部系统交互(用数据库中的数据扩充流数据)的时候,需要考虑与外部系统的通信延迟对整个流处理应用的影响。

       简单地访问外部数据库的数据,比如使用MapFunction,通常意味着同步交互:MapFunction向数据库发送一个请求然后一直等待,直到收到响应。在许多情况下,等待占据了函数运行的大部分时间。

        与数据库异步交互是指一个并行函数实例可以并发地处理多个请求和接受多个响应。这样,函数在等待的时间可以发送其他请求和接收其他响应。至少等待的时间可以被多个请求摊分。大多数情况下,异步交互可以大幅度提高流处理的吞吐量。

详解 Flink 弿­¥ IO

         注意:仅仅提高MapFunction的并行度(parallelism)在有些情况下也可以提升吞吐量,但是这样做通常会导致非常高的资源消耗:更多的并行MapFunction实例意味着更多的Task、更多的线程、更多的Flink内部网络连接、更多的与数据库的网络连接、更多的缓冲和更多程序内部协调的开销。

2.异步IO API

        Flink的异步IO API允许用户在流处理中使用异步请求客户端。API处理与数据流的集成,同时还能处理好顺序、事件时间和容错等。

        在具备异步数据库客户端的基础上,实现数据流转换操作与数据库的异步IO交互需要以下三部分:

  •         实现分发请求的AsyncFunction
  •         获取数据库交互的结果并发送给ResultFuture的回调函数
  •         将异步IO操作应用于DataStream作为DataStream的一次转换操作

重要提示:第一次调用ResultFunction.complete后ResultFuture就完成了。后续的complete调用都将被忽略。

下面两个参数控制异步操作:

  •         Timeout:超时参数定义了异步请求发出多久后未得到响应即被认定为失败。它可以防止一直等待得不到响应的请求。
  •         Capacity:容量参数定义了可以同时进行的异步请求数。即使异步IO通常带来更高的吞吐量,执行异步IO操作的算子仍然可能成为流处理的瓶颈。限制并发请求的数量可以确保算子不会持续累积待处理的请求进而造成积压,而是在容量耗尽时触发反压。

结果的顺序

        AsyncFunction发出的并发请求经常以不确定的顺序完成,这取决于请求得到响应的顺序,Flink提供两种模式控制结果记录以何种顺序发出。

  •         无序模式:异步请求一结束就立刻发出结果记录。流中记录的顺序在经过异步IO算子之后发生了改变。当使用处理时间作为基本时间特征时,这个模式具有最低的延迟和最少的开销。此模式使用AsyncDataStream.unorderedWait(...)方法。
  •         有序模式:这种模式保持了流的顺序。发出结果记录的顺序与触发异步请求的顺序(记录输入算子的顺序)相同。为了实现这一点,算子将缓冲一个结果记录直到这条记录前面的所有记录都发出(或超时)。由于记录或者结果要在checkpoint的状态中保存更长的时间,所以与无序模式相比,有序模式通常会带来一些额外的延迟和checkpoint开销。此模式使用AsyncDataStream.orderedWait(...)方法。

3.封装线程池工具类

pu
Flink关联Hbase可以通过自己护索引的方式来实现。由于FlinkSQL的Hbase connector不会处理索引,我们可以在Hbase中创建一个索引,将需要关联的字段作为索引,并将索引与原始进行关联。这样,在查询时可以通过索引快速定位到需要的数据,而不需要进行全扫描。\[1\] 另外,在开发Flink时,我们可以将固定的度信息存储在Hbase或者Redis等第三方库中,以便与流进行关联查询输出。可以通过本地搭建一个Hbase环境,并构建一个Hbase公共调用类异步调用Hbase的公共代码来实现这一功能。\[2\] 在异步IO访问Hbase时,可以编写一个工具类,通过继承RichAsyncFunction抽象类来实现异步IO操作。该工具类可以根据传入的rowKey来查询Hbase某个的数据,并返回查询结果集。\[3\]这样,我们就可以在Flink中使用该工具类来实现Hbase关联操作。 #### 引用[.reference_title] - *1* [FlinkSQL流式关联Hbase方案(走二级索引)](https://blog.csdn.net/qq_32068809/article/details/122862330)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Flink查询关联Hbase输出](https://blog.csdn.net/Aaron_ch/article/details/123113871)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值