Flink 系列第10篇:Flink 分布式缓存详解

Flink - Java篇 文章目录前言一、概述1 Flink是什么2 架构分层3 数据处理流水线4 运行组件TaskManagerJobManagerResourceManagerDispatcher5 其他流式计算框架二、入门与使用1 Flink基本安装1.1 Linux1.2 Java1.3 Scala(待补充)1.4 集群模式2 常用API2.1 DataStream 流处理DataSourceTransformationSink示例一:自定义数据源(SourceFunction)示例二:自定义分区示例三:Socket通信示例 阅读详情

一、分布式缓存概述

Flink 提供的分布式缓存,核心作用是让用户在并行函数中便捷读取本地或远程文件,并将文件同步至所有 TaskManager 节点的本地文件系统,避免 Task 重复拉取文件,提升作业执行效率,降低网络开销。

二、分布式缓存工作机制

Flink 分布式缓存的工作流程可分为以下4个步骤,确保文件高效同步且仅执行一次:

  1. 用户注册文件/目录:可注册本地文件,或远程文件系统(如 HDFS、S3)中的文件/目录;

  2. 通过执行环境注册:借助 ExecutionEnvironment 注册缓存文件,并为其指定一个唯一名称(后续用于查找文件);

  3. 自动同步至 TaskManager:程序执行时,Flink 会自动将注册的文件/目录复制到所有 TaskManager 节点的本地文件系统,该同步操作仅执行一次;

  4. 本地访问文件:用户在并行函数中,通过注册时指定的名称查找文件/目录,从 TaskManager 本地文件系统直接访问,无需重复拉取。

三、代码示例

3.1 注册缓存文件

通过 ExecutionEnvironment 注册缓存文件,支持本地文件或远程文件(如 HDFS),示例如下:

// 1. 获取Flink批处理运行环境(分布式缓存主要用于批处理,流处理需结合特定场景)
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

// 2. 注册缓存文件:第一个参数为文件路径(本地路径/远程路径),第二个参数为缓存名称(唯一标识)
// 示例:注册本地文件,缓存名称为"a.txt"
env.registerCachedFile("/Users/wangzhiwu/WorkSpace/quickstart/text", "a.txt");

3.2 在并行函数中访问缓存文件

需通过继承 RichFunction(如 RichMapFunction),借助 RuntimeContext 读取缓存文件。原因是 RichFunction 提供了 RuntimeContext 实例,可用于获取分布式缓存资源。

// 3. 在RichMapFunction中访问缓存文件
DataSet<String> result = data.map(new RichMapFunction<String, String>() {
    // 用于存储缓存文件中的数据,供后续业务逻辑使用
    private ArrayList<String> dataList = new ArrayList<String>();

    // open方法:在Task启动时执行一次,适合初始化操作(如读取缓存)
    @Override
    public void open(Configuration parameters) throws Exception {
        super.open(parameters);
        // 4. 通过缓存名称"a.txt"获取本地文件
        File myFile = getRuntimeContext().getDistributedCache().getFile("a.txt");
        // 5. 读取文件内容(需导入org.apache.commons.io.FileUtils)
        List<String> lines = FileUtils.readLines(myFile);
        // 6. 将文件内容存入dataList,供map方法使用
        for (String line : lines) {
            this.dataList.add(line);
            System.err.println("分布式缓存内容:" + line);
        }
    }

    // map方法:并行处理每条数据,可直接使用缓存中的dataList
    @Override
    public String map(String value) throws Exception {
        // 打印缓存数据和当前处理的value,便于调试
        System.err.println("使用缓存数据:" + dataList + "------------" + value);
        // 业务逻辑:将缓存数据与当前value拼接返回
        return dataList + ":" + value;
    }
});

// 打印结果(printToErr()用于区分标准输出和错误输出,便于查看缓存相关日志)
result.printToErr();

3.3 完整代码(含注释)

以下为完整可运行代码,包含环境初始化、缓存注册、缓存访问及结果输出,注释详细可直接复用:

import org.apache.flink.api.common.functions.RichMapFunction;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.DataSource;
import org.apache.flink.configuration.Configuration;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class DisCacheTest {

    public static void main(String[] args) throws Exception{
        // 1. 获取Flink批处理运行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        // 2. 注册缓存文件:本地文件路径(可替换为HDFS路径,如hdfs://xxx/text)
        // 备注:缓存文件text中包含4个单词:hello flink hello FLINK
        env.registerCachedFile("/Users/wangzhiwu/WorkSpace/quickstart/text", "a.txt");

        // 3. 构造测试数据源(4条数据:a、b、c、d)
        DataSource<String> data = env.fromElements("a", "b", "c", "d");

        // 4. 利用RichMapFunction访问缓存并处理数据
        DataSet<String> result = data.map(new RichMapFunction<String, String>() {
            // 存储缓存文件内容的集合
            private ArrayList<String> dataList = new ArrayList<String>();

            // Task启动时执行,仅执行一次,用于读取缓存文件
            @Override
            public void open(Configuration parameters) throws Exception {
                super.open(parameters);
                // 通过缓存名称"a.txt"获取TaskManager本地的缓存文件
                File myFile = getRuntimeContext().getDistributedCache().getFile("a.txt");
                // 读取文件所有行(依赖commons-io包,需引入相关依赖)
                List<String> lines = FileUtils.readLines(myFile);
                // 将文件内容存入dataList
                for (String line : lines) {
                    this.dataList.add(line);
                    System.err.println("分布式缓存内容:" + line);
                }
            }

            // 并行处理每条输入数据,可直接使用缓存中的dataList
            @Override
            public String map(String value) throws Exception {
                // 打印缓存数据和当前处理的value,用于调试
                System.err.println("使用缓存数据:" + dataList + "------------" + value);
                // 业务逻辑:将缓存数据与当前value拼接,作为结果返回
                return dataList + ":" + value;
            }
        });

        // 5. 输出结果(使用printToErr(),避免与缓存日志混淆)
        result.printToErr();
    }
}

四、输出结果

运行上述代码后,输出结果如下(包含缓存读取日志和最终处理结果):

分布式缓存内容:hello
分布式缓存内容:flink
分布式缓存内容:hello
分布式缓存内容:FLINK
使用缓存数据:[hello, flink, hello, FLINK]------------a
[hello, flink, hello, FLINK]:a
使用缓存数据:[hello, flink, hello, FLINK]------------b
[hello, flink, hello, FLINK]:b
使用缓存数据:[hello, flink, hello, FLINK]------------c
[hello, flink, hello, FLINK]:c
使用缓存数据:[hello, flink, hello, FLINK]------------d
[hello, flink, hello, FLINK]:d
【Flink实战系列】Flink 的分布式缓存使用 Flink提供了一个分布式缓存,类似于Apache Hadoop,可以在本地访问用户函数的并行实例。此函数可用于共享包含静态外部数据的文件,如字典或机器学习的回归模型。 缓存的工作原理如下。程序在其作为缓存文件的特定名称下注册本地或远程文件系统(如HDFS或S3)的文件或目录ExecutionEnvironment。执行程序时,Flink会自动将文件或目录复制到所有工作程序的本地文件系统。用户函... 阅读详情

相关推荐

【Flink】Flink分布式缓存

适用于批处理, 适用于把使用频率比较高的文件放到本地task内存中, 注意:需要我们缓存的文件在任务运行期间最好是只读状态,否则会造成数据的一致性问题。另外,缓存的文件和数据不宜过大,否则会影响 Task 的执行速度,在极端情况下会造成 OOM。 下面来看下如何进行应用 首先在项目中创建一个本地文件distributedcache.txt,里面添加数据,文件也可放在hdfs上执行 aaa bbb ccc 接下来进行实际的使用 package com.test; import org.

一杯咖啡半杯糖的博客 1548

flink-12 flink分布式缓存

flink分布式缓存概念用法 概念 Flink提供了一个类似于hadoop分布式缓存,可以使用户在并行函数中很方便的读取本地文件。 广播变量是将一些共享的数据放在TaskManager内存中 而Distribute cache是从外部加载一个文件/目录(例如hdfs),然后分别复制到每一个TaskManager的本地磁盘中。 用法 1.使用Flink运行环境调用registerCachedFile注册一个分布式缓存 env.registerCachedFile("hdfs:///path/to/your

a3125504x的博客 920

7-Flink的分布式缓存

分布式缓存 Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取。 此缓存的工作机制如下:程序注册一个文件或者目录(本地或者远程文件系统,例如hdfs或者s3),通过ExecutionEnvironment注册缓存文件并为它起一个名称。 当程序执行,Flink自动将文件或者目录复制到所有task...

微信搜:import_bigdata,大数据领域硬核原创作者 853

快速入门Flink (6) —— Flink的广播变量、累加器与分布式缓存

> **写在前面:** 博主是一名大数据的初学者,昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白,`写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新`。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!个人小站:[http://alices.ibilibili.xyz/](http://alices.ibilibili.xyz/) , 博客主页:[https://alice.blog.youkuaiyun.com/](http

大数据梦想家 4166

Flink分布式缓存Distributed Cache应用案例

转载自:https://blog.youkuaiyun.com/shenshouniu/article/details/84558874 欢迎加入大数据学习群: **Flink学习视频:**http://edu.51cto.com/sd/88e07 1 分布式缓存 Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanag...

微信搜:import_bigdata,大数据领域硬核原创作者 1927

Flink实战案例(十五):Flink的分布式缓存

声明:本系列博客是根据SGG的视频整理而成,非常适合大家入门学习。 《2021年最新版大数据面试题全面开启更新》 分布式缓存   Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取。   此缓存的工作机制如下:程序注册一个文件或者目录(本地或者远程文件系统,例如hdfs或者s3),通过ExecutionEnvironment注册缓存文件并为它起一个名称。   当程序执行,Flink自动将文件或者目

微信搜:import_bigdata,大数据领域硬核原创作者 1463

【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、广播变量)介绍及示例(8) - 完整版

一、Flink 专栏Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。3、Flik Table API和SQL基础系列 本部分介绍Flink Table Api和SQL的基本用法,比如Table API和SQL创建库、表用法、查询、窗口函数、catalog等等内容。4、Flik

alanchanchn的专栏 6万+

在 Windows 上使用 Anaconda 创建 配置 YOLOv8虚拟环境,并更改 pip 源以及以 可编辑模式 安装ultralytics

前往 NVIDIA cuDNN 下载页面,下载与您安装的 CUDA 版本匹配的 cuDNN 版本。:根据您的系统和 CUDA 版本,选择适当的 whl 文件。如下12.7,表示最高可装12.7版本CUDA,与上图中的支持的最高cuda版本一致。,无需重新安装,从而大幅提升开发效率,适用于项目开发、调试或依赖本地未发布的版本时使用,但需确保当前目录包含。:访问 NVIDIA 官方网站,下载与您的显卡和操作系统兼容的 CUDA 版本。首先,确保NVIDIA 显卡支持 CUDA,并安装相应版本的驱动程序。

weixin_44115575的博客 1891

Flink_Flink 的分布式缓存

文章目录Flink 的分布式缓存Flink Accumulators & Counters(了解) Flink 的分布式缓存 操作步骤 将 distribute_cache_student 文件上传到 HDFS / 目录下 获取批处理运行环境 创建成绩数据集 对 成绩 数据集进行 map 转换,将(学生 ID, 学科, 分数)转换为(学生姓名,学科, 分数) a. RichMapFunction 的 open 方法中,获取分布式缓存数据 b. 在 map 方法中进行转换 实现 open 方法 a

qq_44509920的博客 874

Elsevier投稿避坑指南:Ocean Engineering论文格式要求详解(附Checklist模板)

本文详细解析Elsevier旗下期刊Ocean Engineering的投稿格式要求与常见陷阱,提供实用的Checklist模板。涵盖文章类型确认、作者贡献声明、图表规范、数据声明等关键环节,帮助研究者高效通过格式审查。特别强调LaTeX排版细节、图表分辨率要求及现代伦理声明规范,助力海洋工程领域学者顺利投稿。

weixin_33734785的博客 1477

深入博通PEX89000内部:那颗ARM CPU和Synthetic Mode到底能玩出什么花样?

本文深入解析博通PEX89000系列PCIe交换芯片内置的ARM CPU与Synthetic Mode技术,揭示其在AI计算和数据中心的智能潜能。通过ARM Cortex CPU的实时控制和Synthetic Mode的自治网络功能,PEX89000实现了GPU集群的动态拓扑重组和资源池化,大幅提升AI训练效率。文章还探讨了该技术在软件定义数据平面和弹性AI架构中的创新应用。

weixin_30776273的博客 209

flink通过分布式缓存加载配置文件

Flink分布式缓存是类似于hadoop的分布式文件,可以在启动时将指定的文件分发到各个工作节点的临时目录。注意,此分发过程仅会在作业启动时执行一次,所以无法动态更改。 缓存的工作机制如下:程序注册一个文件或者目录(本地或者远程文件系统,例如hdfs或者s3),通过ExecutionEnvironment注册缓存文件并为它起一个名称。当程序执行,Flink自动将文件或者目录复制到所有worker节...

大仁哥、的博客 2230

信号编辑软件ZX/SignalEditing

信号编辑软件ZX/SignalEditing

weixin_45661395的博客 954

Flink(20):Flink之分布式缓存

0. 相关文章链接 1. Flink中分布式缓存概述 Flink提供了一个类似于Hadoop的分布式缓存,让并行运行实例的函数可以在本地访问。 这个功能可以被使用来分享外部静态的数据,例如:机器学习的逻辑回归模型等。 广播变量是将变量分发到各个TaskManager节点的内存上,分布式缓存是将文件缓存到各个TaskManager节点上。 2. 编码步骤 注册一个分布式缓存文件:env.registerCachedFile("hdfs:///path/file", "cachefilename")

yang_shibiao的博客 2433

Go语言面试:面试中经常被问到的50个经典面试题(附参考答案)

Go语言核心知识点摘要 基础语法与数据结构 make和new区别:new分配零值内存返回指针,make初始化引用类型返回实例 Slice底层:包含指针、长度、容量的结构体,多个slice可共享底层数组 nil与空slice:nil指针为nil,空slice指针非nil但JSON编码不同 Map原理:哈希表实现,非线程安全,扩容策略影响性能 for range注意:循环变量是拷贝,map遍历无序 defer执行:LIFO顺序,函数返回前执行 Struct比较:仅当所有字段可比较时才可比较 参数传递:只有值传递

数据知道的博客 4718

手把手教你学Simulink--基于Simulink的风力发电系统用双馈电机控制仿真建模

特点高效节能:在广泛的风速范围内保持高效的能量转换。独立控制有功和无功功率:通过控制转子电流实现对有功和无功功率的独立调节。较低的成本:相比直接驱动或全功率变流器方案,成本较低。挑战控制复杂度较高:需要复杂的控制算法来实现有功和无功功率的解耦控制。对电网波动敏感:需要良好的稳定性控制策略以应对电网电压波动。利用Simscape Electrical中的模块构建DFIG的物理模型,配置参数如电阻、电感、极对数等。matlab深色版本% 添加DFIG电机模块。

MHD0815的博客 346

Flink 的分布式缓存使用步骤详解

Flink提供了一个类似于Hadoop的分布式缓存,让并行运行实例的函数可以在本地访问。使用ExecutionEnvironment实例对本地的或者远程的文件(例如:HDFS上的文件),为缓存文件指定一个名字注册该缓存文件!-广播变量将数据广播到各个TaskManager的内存中,分布式缓存广播到各个TaskManager的本地文件系统。4. 对 成绩 数据集进行map转换,将(学生ID, 学科, 分数)转换为(学生姓名,学科,分数)将文本转换为元组(学生ID,学生姓名),再转换为List。

justlpf的专栏 982

MongoDB分布式事务实现:两阶段提交、日志复制与冲突解决

MongoDB分布式事务机制解析 本文深入剖析了MongoDB 4.0+版本的分布式事务实现原理,重点分析了其在跨文档/跨集合/跨分片场景下的数据一致性解决方案。核心内容包括: 底层机制:采用改进的两阶段提交协议,通过oplog日志复制实现无中心协调器的事务管理,结合WiredTiger存储引擎和锁机制保障ACID特性。 创新设计:将传统2PC的中心协调功能分散到Primary节点,利用oplog作为事务状态记录,实现自动故障恢复和60秒超时回滚机制。 性能优化:针对大事务、写冲突等常见问题,提出拆分微事务

数据知道的博客 1261

快速入门Flink(6)——Flink中广播变量、分布式缓存、累加器(超详细,快收藏)

         上篇文章给大家讲解了Flink中常用的到算子 ☛(Flink中的17种TransFormAction算子)那您写的代码如何进行优化那,提高效率?那接下来我们使用分布式缓存、广播变量来提高代码的效率。 一、Flink 的广播变量(重点 ) 介绍Flink广播变量及试用场景         Flink 支持广播变量,就是将数据广播到具.

大数据记录 9321

CDR插件开发之CPG插件004 - 认识VGCore并编译生成你的第一个CPG文件

上篇文章中,讲到了使用VS2019编译CDR类型库 VGCoreAuto.tlb,编译后得到了vgcoreauto.tlh和vgcoreauto.tli两个文件。本文将对这两个文件说明,并演示通过标准的libid形式来导入CDR类型库,在这个过程中,穿插一些VS2019的使用技巧(删除目录、复制工程、打开项目或解决方案、修改解决方案名称、修改项目名称等),使读者循序渐进,逐步提高对VS2019工具的熟练程度,最后通过修改项目属性配置,生成第一个CPG文件。

Zebe 2983

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Flink的分布式缓存

分布式缓存 Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取。此缓存的工作机制如下:程序注册一个文件或者目录(本地或者远程文件系统,例如hdfs或者s3),通过ExecutionEnvironment注册缓存文件并为它起一个名称。当程序执行,Flink自动将文件或者目录复制到所有taskm...

weixin_30748995的博客 86

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Flink分布式缓存与累加器

分布式缓存 Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取。此缓存的工作机制如下:程序注册一个文件或者目录(本地或者远程文件系统,例如hdfs或者s3),通过ExecutionEnvironment注册缓存文件并为它起一个名称。 当程序执行,Flink自动将文件或者目录复制到所有tas...

数据工匠记 4508

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

9.Flink 分布式缓存

1.分布式缓存 1.1 介绍 1.1.1 技术细节 1.分布式文件缓存的作用与广播变量类似,也是为了避免出现join 操作发生数据倾斜而设计出来的 2.与广播变量不同之处在于: 广播变量中封装的数据类型是: DataSet, DataStream 分布式文件缓存中封装的数据类型是File 3.分布式文件缓存底层如何运作? 将分布式文件系统上的资源文件装载到TaskManager进程所...

Leeyehong_self的专栏 735

flink读取不到文件_7-Flink的分布式缓存

分布式缓存 Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取。 此缓存的工作机制如下:程序注册一个文件或者目录(本地或者远程文件系统,例如hdfs或者s3),通过ExecutionEnvironment注册缓存文件并为它起一个名称。 当程序执行,Flink自动将文件或者目录复制到所有task...

weixin_39860849的博客 150
上一篇: Flink 系列第9篇:Flink 重启策略详解
下一篇: Flink 系列第11篇:Flink 重分区算子详解
juniperhan
博客等级 码龄1年 132粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值