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

news2024/9/29 20:35:27

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 中: 顺便还设置的 ttl
    asyncCommand.setex(key, Constant.TWO_DAY_SECONDS, dim.toJSONString());
    
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何学习Linux性能优化?

你是否也曾跟我一样&#xff0c;看了很多书、学了很多Linux性能工具&#xff0c;但在面对Linux性能问题时&#xff0c;还是束手无策&#xff1f;实际上&#xff0c;性能分析和优化始终是大多数软件工程师的一个痛点。但是&#xff0c;面对难题&#xff0c;我们真的就无解了吗&a…

2.11键盘事件

目录 实验原理 实验代码 实验结果 实验原理 简单、常用的键盘事件是等待按键事件&#xff0c;它由 waitKey 函数来实现。无论是刚开始学习 OpenCV&#xff0c;还是使用 OpenCV 进行开发调试&#xff0c;都可以看到waitKey 函数的身影&#xff0c;然而基础的东西往往容易忽略…

[Java]MyBatis轻松拿下

介绍 在业务开发过程中, 都是使用java程序完成数据库的操作, 目前最主流的技术就是MyBatis MyBatis是一款优秀的 持久层 框架&#xff0c;用于简化JDBC的开发。 官网: https://mybatis.org/mybatis-3/zh/index.htmlmybatis是Apache的一个开源项目iBatis, 2010年迁移到了googl…

Day00_场景题

文章目录 资料项目经历技能清单自我介绍QPS和TPS?如何设计一个排行榜的功能?如何解决大文件上传问题延时任务处理场景如何设计一个秒杀系统?分布式幂等性如何设计?如果你的系统的QPS 突然提升10倍你会怎么设计?如何从零搭建 10 万级QPS 大流量、高并发优惠券系统?高 QPS,…

OpenCV绘图函数(9)填充多边形函数fillPoly()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 填充一个或多个多边形轮廓所包围的区域。 函数 cv::fillPoly 填充由若干个多边形轮廓所包围的区域。该函数可以填充复杂的区域&#xff0c;例如带…

【大模型】GPT系列模型基础

前言&#xff1a;GPT整体上与transformer结构相似&#xff0c;但只用了decoder部分。 目录 1. GPT2. GPT23. GPT34. 知识补充4.1 下游任务实现方式4.2 sparse attention 1. GPT 预训练&#xff1a;无监督&#xff0c;根据前k个词预测下一个词的概率。微调&#xff1a; 有监督&a…

AI嵌入式人工智能开发 --- 【1】初始RKNPU

目录 一、NPU的由来 二、RKNPU介绍 三、RKNPU单核框架 3.1 AHB/AXI 接口 3.2 卷积神经网络加速单元&#xff08;CNA&#xff09; 3.3 数据处理单元&#xff08;Data Processing Unit&#xff0c;DPU&#xff09; 3.4 平面处理单元&#xff08;Planar Processing Unit&a…

#驱动开发

内核模块 字符设备驱动 中断、内核定时器 裸机开发和驱动开发的区别&#xff1f; 裸机开发 驱动开发&#xff08;基于内核&#xff09; 相同点 都能够控制硬件&#xff08;本质&#xff1a;操作寄存器&#xff09; 不同点 用C语言给对应的地址里面写值 按照一定的框架格式…

【DSP+FPGA】基于DSP+FPGA XC7K325T与TMS320C6678的通用信号处理平台

DSP FPGA 协同处理架构板载 1 个TMS320C6678 多核DSP处理节点板载 1 片 XC7K325T FPGA处理节点板载 1 个FMC 接口板载4路SFP光纤接口FPGA 与 DSP 之间采用高速Rapid IO互联 基于FPGA与DSP协同处理架构的通用高性能实时信号处理平台&#xff0c;该平台采用1片TI的KeyStone系列多…

CSS3 文本效果(text-shadow,box-shadow,white-space等)

一 text-shadow text-shadow 属性是 CSS3 中用于为文本添加阴影效果的工具。它可以增强文本的可读性和视觉吸引力&#xff0c;提供丰富的视觉效果 1 语法 text-shadow: offset-x offset-y blur-radius color;offset-x&#xff1a;阴影相对于文本的水平偏移量。可以是正值&am…

c/c++: function和procedure的区别

https://www.cs.nthu.edu.tw/~ychung/slides/CSC4180/Alfred%20V.%20Aho,%20Monica%20S.%20Lam,%20Ravi%20Sethi,%20Jeffrey%20D.%20Ullman-Compilers%20-%20Principles,%20Techniques,%20and%20Tools-Pearson_Addison%20Wesley%20(2006).pdf 函数与过程的区别&#xff0c;一个…

AI语音识别神器Openai Whisper对中文的支持如何?

文章目录 前言一、资料准备二、Whisper环境搭建第一步&#xff1a;安装whisper第二步&#xff1a;安装ffmpeg 三、Whisper测试总结其他相关 前言 语音识别一直以来都是人工智能领域中一个不容忽视的技术&#xff0c;随着大模型时代的到来&#xff0c;这项技术也发生了质的变化…

解决MAC电脑SVN Android studio不能提交.so文件相关

目录 前言 确认问题原因 修改 SVN 配置文件 验证配置是否生效 其他注意事项 总结 前言 在使用 macOS 进行开发时&#xff0c;可能会遇到通过 SVN 在 Android Studio 中无法提交 .so 文件的问题。这通常是由于 SVN 配置文件中的 global-ignores 设置导致的&#xff0c;…

比特币牛市将至背后

作者&#xff1a;Arthur Hayes 编译&#xff1a;Liam 「此处所表达的任何观点均为作者个人意见&#xff0c;不应作为投资决策依据&#xff0c;也不应被视为参与投资交易的推荐或建议。」 我打破常规&#xff0c;前往南半球滑雪两周&#xff0c;为北半球的暑假画上圆满的句号。我…

03. SpringBoot 项目创建

接下来我们将要完成一个基础的 Springboot 项目的创建&#xff0c;并且将项目上传到 Gitee 1. 查看官网&#xff0c;选择版本 学习任何一门技术&#xff0c;一定要学会从官网了解一手信息&#xff0c;无论是哪个博主的博客都是有时效性的&#xff0c;我们要掌握这样的习惯&…

Runtime Asset Database 运行时资产数据库

运行时资产数据库是一个库,旨在简化Unity应用程序中运行时保存和加载子系统的实现。此库复制并扩展了Unity编辑器中常见的预制件、预制件变体和资源的概念,使其在运行时比以往任何时候都更容易管理和操纵游戏资源,并在运行时动态实现与Unity编辑器类似的工作流。 Unity开发人…

晟鑫商会与家盛资本携手合作,共创金融科技新篇章

在数字化浪潮的推动下,金融科技正成为全球经济发展的新引擎。近日,晟鑫商会与家盛资本宣布达成战略合作伙伴关系,旨在通过创新合作,共同开拓市场新机遇,促进双方在数字经济领域的深入发展。两家机构的联合预示着在金融科技领域将开启一段新的旅程。 晟鑫商会,作为互联网商业合作…

做好价格监测这些点要注意

品牌在进行数据监测时&#xff0c;首要关注点在于数据本身的准确率与覆盖率&#xff0c;而在价格监测方面亦是如此。品牌需高度关注电商价格监测系统输出的价格、促销信息、销量等数据。一旦促销信息出现不准确的情况&#xff0c;到手价必然会受到影响&#xff0c;进而对后端治…

USB PHY——ULPI

ULPI协议的全称是UTMI Low Pin Interface。从名字上就可以看出ULPI是UTMI的Low Pin版本。 ULPI是在UTMI的基础上封装了一层。 ULPI需要读写寄存器&#xff0c;而UTMI只需直接拉高或拉低信号线。 从这张图可以看出 ULPI 是在 UTMI level3 再往上一层 外设参考设计

ssm面向企事业单位的项目申报小程序论文源码调试讲解

2 系统实现的技术支持 2.1微信开发者工具 在传统web浏览器中&#xff0c;在加载htm15页面时先加载视图层的html和css&#xff0c;后加载逻辑层的java script&#xff0c;然后返回数据并在浏览器中展示页面。而微信开发者工具的系统层是基于Native System的&#xff0c;视图层和…