Flink优化之--旁路缓存和异步IO

Apache Flink 是一个开源流处理框架,以其高吞吐量、低延迟和事件驱动的处理能力著称。随着大数据和实时处理需求的不断增加,Flink 在许多行业和应用场景中得到了广泛应用,如金融风控、物联网数据处理、实时数据分析等。然而,随着数据规模和业务复杂度的提升,Flink 应用的性能优化问题也变得愈发重要。在实际应用中,Flink 的性能直接影响到系统的响应速度和资源利用效率。因此,如何高效地优化 Flink 的性能,成为了大数据工程师和开发者们关注的焦点。性能优化不仅可以提高系统的处理能力,还能降低硬件资源的消耗 ,从而降低运营成本。

性能优化主要包括任务并行度调整、资源分配优化、数据传输和序列化的优化、状态管理优化、垃圾回收调整等多个方面。每个优化点都需要根据具体应用场景和系统配置进行细致的调优,以达到最佳的性能表现。本次背景研究旨在深入探讨 Apache Flink 性能优化的各种策略和方法,帮助开发者更好地理解和应用这些优化技巧,以提升实际业务系统的性能和稳定性,今天我们要介绍的是在实时数仓架构中对读取的数据进行旁路缓存和异步IO

旁路缓存优化

在本案例实时数仓的搭建中,我们是将数仓中的维度数据存储在Hbase中,外部数据源的查询常常是流式计算的性能瓶颈。以本程序为例,每次查询都要连接 HBase,数据传输需要做序列化、反序列化,还有网络传输,严重影响时效性。可以通过旁路缓存对查询进行优化。

旁路缓存模式是一种非常常见的按需分配缓存模式。所有请求优先访问缓存,若缓存命中,直接获得数据返回给请求者。如果未命中则查询数据库,获取结果后,将其返回并写入缓存以备后续请求使用。

1)旁路缓存策略应注意两点

(1)缓存要设过期时间,不然冷数据会常驻缓存,浪费资源。

(2)要考虑维度数据是否会发生变化,如果发生变化要主动清除缓存。

2)缓存的选型

一般两种:堆缓存或者独立缓存服务(memcache,redis)

堆缓存,性能更好,效率更高,因为数据访问路径更短。但是难于管理,其它进程无法维护缓存中的数据。

独立缓存服务(redis,memcache),会有创建连接、网络IO等消耗,较堆缓存略差,但性能尚可。独立缓存服务便于维护和扩展,对于数据会发生变化且数据量很大的场景更加适用,此处选择独立缓存服务,将 redis 作为缓存介质。

3)实现步骤

(1)查询时

从缓存中获取数据。

Ø 如果查询结果不为null,则返回结果。

Ø 如果缓存中获取的结果为null,则从HBase表中查询数据。

Ø 如果结果非空则将数据写入缓存后返回结果。

Ø 否则提示用户:没有对应的维度数据

Ø 注意:缓存中的数据要设置超时时间,本程序设置为1天。此外,如果原表数据发生变化,要删除对应缓存。

为了实现此功能,需要对维度分流程序做如下修改:

(2)维度变更时

Ø 如果维度数据的变更类型为insert,则对缓存无影响。

Ø 如果维度数据的变更类型为update或delete,则清除缓存。

旁路缓存图解

异步IO

在Flink 流处理过程中,经常需要和外部系统进行交互,如通过维度表补全事实表中的维度字段。

默认情况下,在Flink 算子中,单个并行子任务只能以同步方式与外部系统交互:将请求发送到外部存储,IO阻塞,等待请求返回,然后继续发送下一个请求。这种方式将大量时间耗费在了等待结果上。

为了提高处理效率,可以有两种思路。

(1)增加算子的并行度,但需要耗费更多的资源。

(2)异步 IO。

Flink在1.2中引入了Async I/O,将IO操作异步化。在异步模式下,单个并行子任务可以连续发送多个请求,按照返回的先后顺序对请求进行处理,发送请求后不需要阻塞式等待,省去了大量的等待时间,大幅提高了流处理效率。

Async I/O 是阿里巴巴贡献给社区的特性,呼声很高,可用于解决与外部系统交互时网络延迟成为系统瓶颈的问题。

异步查询实际上是把维表的查询操作托管给单独的线程池完成,这样不会因为某一个查询造成阻塞,因此单个并行子任务可以连续发送多个请求,从而提高并发效率。对于涉及网络IO的操作,可以显著减少因为请求等待带来的性能损耗。

异步IO+旁路缓存部分代码示例

(1)所须依赖

Jedis不支持异步读取Redis,所以我们使用支持异步查询的Redis客户端:lettuce。此处需要引入lettuce相关依赖,如下。

<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId>
</dependency>

(2)在Redis方法中中补充异步查询相关方法

/*** 获取到 redis 的异步连接** @return 异步链接对象*/
public static StatefulRedisConnection<String, String> getRedisAsyncConnection() {RedisClient redisClient = RedisClient.create("redis://hadoop102:6379/2");return redisClient.connect();
}/*** 关闭 redis 的异步连接** @param redisAsyncConn*/
public static void closeRedisAsyncConnection(StatefulRedisConnection<String, String> redisAsyncConn) {if (redisAsyncConn != null) {redisAsyncConn.close();}
}/*** 异步的方式从 redis 读取维度数据* @param redisAsyncConn 异步连接* @param tableName 表名* @param id id 的值* @return 读取到维度数据,封装的 json 对象中*/
public static JSONObject readDimAsync(StatefulRedisConnection<String, String> redisAsyncConn,String tableName,String id) {RedisAsyncCommands<String, String> asyncCommand = redisAsyncConn.async();String key = getKey(tableName, id);try {String json = asyncCommand.get(key).get();if (json != null) {return JSON.parseObject(json);}} catch (Exception e) {throw new RuntimeException(e);}return null;
}/*** 把维度异步的写入到 redis 中* @param redisAsyncConn  到 redis 的异步连接* @param tableName 表名* @param id id 的值* @param dim 要写入的维度数据*/
public static void writeDimAsync(StatefulRedisConnection<String, String> redisAsyncConn,String tableName,String id,JSONObject dim) {// 1. 得到异步命令RedisAsyncCommands<String, String> asyncCommand = redisAsyncConn.async();String key = getKey(tableName, id);// 2. 写入到 string 中: 顺便还设置的 ttlasyncCommand.setex(key, Constant.TWO_DAY_SECONDS, dim.toJSONString());}

这就是flink的简单优化,综合来看,旁路缓存和异步IO的引入不仅解决了传统计算中存在的瓶颈问题,还为系统的可扩展性和稳定性提供了坚实的保障。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/417040.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【基础算法总结】BFS_拓扑排序问题

目录 一&#xff0c; 拓扑排序简介1. 有向无环图(DAG图)2. AOV 网3. 拓扑排序4. 如何实现拓扑排序 二&#xff0c;算法原理和代码实现207.课程表201.课程表IILCR114.火星词典 三&#xff0c;算法总结 一&#xff0c; 拓扑排序简介 1. 有向无环图(DAG图) 入度&#xff1a;针对一…

详解GPU服务器与普通服务器之间的差异

GPU服务器与普通服务器之间的差异&#xff0c;犹如赛车与家用车的对比&#xff0c;不仅在于表面的速度与力量&#xff0c;更深入到其核心技术与应用场景的广泛适应性。以下是对这些差异的深度剖析与美化呈现&#xff1a; 一、硬件配置&#xff1a;架构的革新 普通服务器&#…

Linux下的MySQL8.0报错:[Err]1055

Linux下的MySQL8.0报错&#xff1a;[Err]1055 报错信息解决办法 报错信息 在Linux环境下的MySQL里执行SQL语句报如下错误&#xff1a;[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column information_schema.PROFIL…

Linux下使用crontab配置定时任务

文章目录 Linux使用crontab安装crontab启动crontab查看定时任务创建定时任务配置案例配置语法位置含义符号含义 注意 取消定时任务 Linux使用crontab crontab为Linux下的计划任务程序&#xff0c;对应的服务为crond。crond是一个守护进程&#xff0c;每分钟会定期检查是否有要…

涨幅超过了90%,心动网络股价成V字后,TapTap找到流量源了吗?

心动公司发布了截至2024年6月30日止六个月的中期业绩。 在2024年上半年&#xff08;24H1&#xff09;&#xff0c;公司实现总营收22.21亿元&#xff0c;较去年同期增长了26.7%。归属于母公司的净利润达到2.05亿元&#xff0c;同比激增127.4%。经调整后&#xff0c;归属于母公司…

# 利刃出鞘_Tomcat 核心原理解析(十)-- Tomcat 性能调优--1

利刃出鞘_Tomcat 核心原理解析&#xff08;十&#xff09;-- Tomcat 性能调优–1 一、Tomcat专题 - Tomcat性能调优 - 性能测试 1、tomcat 性能测试&#xff1a; 对于系统性能&#xff0c;用户最直观的感受就是系统的加载和操作时间&#xff0c;即用户执行某项操作的耗时。从…

10 先序遍历创建二叉树

这个代码是使用手动输入的方式创建二叉树 比较直观 #include "stdio.h" #include "stdlib.h"typedef int ElemType; typedef struct node {ElemType data;struct node *lchild;struct node *rchild; } Node;Node *create_node(int value) {Node *node (N…

HTTP代理支持UDP协议吗?

在网络通信中&#xff0c;HTTP代理和UDP协议是两个常见但功能和用途不同的技术。本文将详细探讨HTTP代理是否支持UDP&#xff0c;以及在什么情况下可以实现两者的结合。 HTTP代理的基本概念 HTTP代理是一种代理服务器&#xff0c;用于处理HTTP请求和响应。它在客户端和目标服…

element table 表格 span-method 某一列进行相同合并 支持树结构表格

须知 这是 vue2 版本&#xff0c;不过理论上 vue3 也能参考使用 可以直接打开 codepen 查看代码 效果图 代码 打不开 codepen 或者codepen 失效&#xff0c;查看下面代码参考 <script src"//unpkg.com/vue2/dist/vue.js"></script> <script src&…

驭势科技研究成果入选学术顶会IROS 2024

近日&#xff0c;驭势科技团队关于自动驾驶车辆定位算法的最新研究成果《LiDAR-based HD Map Localization using Semantic Generalized ICP with Road Marking Detection》&#xff0c;创造性地解决了基于LiDAR的实时路标检测和高精地图配准所带来的挑战&#xff0c;成功入选国…

第九届“创客中国”生成式人工智能中小企业创新创业大赛招商推介圆满落幕

金秋九月,丹桂飘香。9月2日晚,第九届“创客中国”生成式人工智能(AIGC)中小企业创新创业大赛招商推介会在南昌高新区艾溪湖畔成功举办。南昌市政府副秘书长、办公室党组成员陈吉炜出席并致辞。市中小企业局党组书记、市工信局党组书记、局长骆军出席。南昌高新区党工委委员、管…

CMU 10423 Generative AI:lec2

文章目录 1 概述2 部分摘录2.1 噪声信道模型&#xff08;Noisy Channel Models&#xff09;主要内容&#xff1a;公式解释&#xff1a;应用举例&#xff1a; 2.2 n-Gram模型1. 什么是n-Gram模型2. 早期的n-Gram模型3. Google n-Gram项目4. 模型规模与训练数据5. n-Gram模型的局…

AI科学家:自动化科研的未来之路

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;AI已经在众多领域中展现了强大的潜力&#xff0c;尤其是在科研方面的应用正在引起广泛关注。最近&#xff0c;Sakana AI与牛津大学和不列颠哥伦比亚大学联合推出了一款被称为“AI科学家”的自动化科研工具&am…

Stable Diffusion抠图插件爬坑经历,StableDiffusion实操案例(附整合资料)

今天给大家分享使用后期处理插件stable-diffusion-webui-rembg实现抠图功能。 &#x1f449;AI绘画必备工具&#x1f448; 温馨提示&#xff1a;篇幅有限&#xff0c;已打包文件夹&#xff0c;获取方式在&#xff1a;文末 &#x1f449;AI绘画基础速成进阶使用教程&#x1f…

聚铭网络入选“2024年南京市工程研究中心”认定名单

为深入实施创新驱动发展战略&#xff0c;因地制宜发展新质生产力充分发挥工程研究中心对推进产业强市的重要支撑作用&#xff0c;根据《南京市工程研究中心管理办法》&#xff0c;南京市发展和改革委员会于2024年5月组织开展了本年度南京市工程研究中心遴选工作。经企业申报、各…

[iBOT] Image BERT Pre-Training with Online Tokenizer

1、目的 探索visual tokenizer编码下的MIM&#xff08;Masked Image Modeling&#xff09; 2、方法 iBOT&#xff08;image BERT pre-training with Online Tokenizer&#xff09; 1&#xff09;knowledge distillation&#xff08;KD&#xff09; distill knowledge from the…

Linux下快速判断当前终端使用的是bash or csh

在Linux下设置环境变量的时候&#xff0c;可能你也遇到过export: Command not found一类的错误。这是因为当前终端使用的不是bash&#xff0c;如何快速判断当前终端使用的是哪种类型的shell呢&#xff1f; echo $0判断shell类型 最简单的方法就是在终端输入echo $0&#xff0…

Linux---文件(2)---文件描述符缓冲区(语言级)

目录 文件描述符 基础知识 文件描述符 对“Linux一切皆文件”的理解 文件描述符分配规则 缓冲区 刷新策略 存放位置 解释一个"奇怪的现象" 格式化输入输出 文件描述符 基础知识 在系统层面上&#xff0c;文件操作都是通过文件描述符来操作的。 程序在启…

leetcode回文链表

leetcode 回文链表 题目 题解 两种方式进行题解 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, Li…

JavaWeb JavaScript 9.正则表达式

生命的价值在于你能够镇静而又激动的欣赏这过程的美丽与悲壮 —— 24.8.31 一、正则表达式简介 正则表达式是描述字符模式的对象。正则表达式用简单的API对字符串模式匹配及检索替换&#xff0c;是对字符串执行模式匹配的强大工具。 1.语法 var pattnew RegExp(pattern,modi…