(三)flink的DataSet:分布式缓存

Flink提供了类似于Apache Hadoop的分布式缓存,可以让并行用户函数实例本地化的访问文件。此功能可用
于共享包含静态外部数据(如字典或机器学习的回归模型)的文件
工作方式如下:程序将本地或远程文件系统(如HDFS或S3)的文件或目录作为缓存文件注册到
ExecutionEnvironment中的特定名称下。当程序执行时,Flink自动将文件或目录复制到所有worker的本地文
件系统。用户函数可以查找指定名称下的文件或目录,并从worker的本地文件系统访问它

package batch;

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

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

public class DistributeCacheDemo {
    public static void main(String[] args) throws Exception {
        //获取运行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        //注册一个本地执行文件
        env.registerCachedFile("file:///D:\\Downloads\\000代码+PPT\\数据源\\user.txt", "localFile", true);
        //准备用户游戏充值数据
        ArrayList<Tuple2<String, Integer>> data = new ArrayList<>();
        data.add(new Tuple2<>("101", 2000000));
        data.add(new Tuple2<>("102", 190000));
        data.add(new Tuple2<>("103", 1090000));


        //读取数据源
        DataSet<Tuple2<String, Integer>> tuple2DataSource = env.fromCollection(data);
        tuple2DataSource.map(new RichMapFunction<Tuple2<String, Integer>, String>() {
            HashMap<String, String> allMap = new HashMap<String, String>();

            @Override
            public void open(Configuration parameters) throws Exception {
                super.open(parameters);
                File localFile = getRuntimeContext().getDistributedCache().getFile("localFile");
                //按行读取
                List<String> lines = FileUtils.readLines(localFile);

                for (String line:lines){
                    String[] split = line.split(",");
                    allMap.put(split[0],split[1]);
                }
            }

            @Override
            public String map(Tuple2<String, Integer> value) throws Exception {
                String name = allMap.get(value.f0);
                return name+","+value.f1;
            }
        }).print();
    }
}

发布了483 篇原创文章 · 获赞 62 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/wwwzydcom/article/details/103833201