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


    分布式缓存

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

    示例

    在ExecutionEnvironment中注册一个文件:
    
    //获取运行环境
    ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
    
    //1:注册一个文件,可以使用hdfs上的文件 也可以是本地文件进行测试
    env.registerCachedFile("/Users/wangzhiwu/WorkSpace/quickstart/text","a.txt");
    
    //在用户函数中访问缓存文件或者目录(这里是一个map函数)。这个函数必须继承RichFunction,因为它需要使用RuntimeContext读取数据:
    
    DataSet<String> result = data.map(new RichMapFunction<String, String>() {
                private ArrayList<String> dataList = new ArrayList<String>();
    
                @Override
                public void open(Configuration parameters) throws Exception {
                    super.open(parameters);
                    //2:使用文件
                    File myFile = getRuntimeContext().getDistributedCache().getFile("a.txt");
                    List<String> lines = FileUtils.readLines(myFile);
                    for (String line : lines) {
                        this.dataList.add(line);
                        System.err.println("分布式缓存为:" + line);
                    }
                }
    
                @Override
                public String map(String value) throws Exception {
                    //在这里就可以使用dataList
                    System.err.println("使用datalist:" + dataList + "------------" +value);
                    //业务逻辑
                    return dataList +":" +  value;
                }
            });
    
            result.printToErr();
        }

    完整代码如下,仔细看注释:

    public class DisCacheTest {
    
        public static void main(String[] args) throws Exception{
    
            //获取运行环境
            ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
    
            //1:注册一个文件,可以使用hdfs上的文件 也可以是本地文件进行测试
          //text 中有4个单词:hello flink hello FLINK env.registerCachedFile("/Users/wangzhiwu/WorkSpace/quickstart/text","a.txt");
    
            DataSource<String> data = env.fromElements("a", "b", "c", "d");
    
            DataSet<String> result = data.map(new RichMapFunction<String, String>() {
                private ArrayList<String> dataList = new ArrayList<String>();
    
                @Override
                public void open(Configuration parameters) throws Exception {
                    super.open(parameters);
                    //2:使用文件
                    File myFile = getRuntimeContext().getDistributedCache().getFile("a.txt");
                    List<String> lines = FileUtils.readLines(myFile);
                    for (String line : lines) {
                        this.dataList.add(line);
                        System.err.println("分布式缓存为:" + line);
                    }
                }
    
                @Override
                public String map(String value) throws Exception {
                    //在这里就可以使用dataList
                    System.err.println("使用datalist:" + dataList + "------------" +value);
                    //业务逻辑
                    return dataList +":" +  value;
                }
            });
    
            result.printToErr();
        }
    }//

    输出结果如下:

    [hello, flink, hello, FLINK]:a
    [hello, flink, hello, FLINK]:b
    [hello, flink, hello, FLINK]:c
    [hello, flink, hello, FLINK]:d

    本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/13767428.html

  • 相关阅读:
    白话LINQ系列2以代码演进方式学习LINQ必备条件
    《Entity Framework 6 Recipes》中文翻译系列 (9) 第二章 实体数据建模基础之继承关系映射TPH
    Linq To Sqlite 一一二二
    《Entity Framework 6 Recipes》中文翻译系列 (10) 第二章 实体数据建模基础之两实体间Isa和Hasa关系建模、嵌入值映射
    《Entity Framework 6 Recipes》中文翻译系列 (14) 第三章 查询之查询中设置默认值和存储过程返回多结果集
    《Entity Framework 6 Recipes》中文翻译系列 (13) 第三章 查询之使用Entity SQL
    白话LINQ系列1什么是LINQ?
    《Entity Framework 6 Recipes》翻译系列 (3) 第二章 实体数据建模基础之创建一个简单的模型
    JS 实现trim()
    mysql表切换引擎的几种方法
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13767428.html
Copyright © 2020-2023  润新知