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

Flink分布式缓存是类似于hadoop的分布式文件,可以在启动时将指定的文件分发到各个工作节点的临时目录。注意,此分发过程仅会在作业启动时执行一次,所以无法动态更改。

缓存的工作机制如下:程序注册一个文件或者目录(本地或者远程文件系统,例如hdfs或者s3),通过ExecutionEnvironment注册缓存文件并为它起一个名称。当程序执行,Flink自动将文件或者目录复制到所有worker节点的本地文件系统。用户函数可以查找文件或者目录通过这个指定的名称,然后从worker节点的本地文件系统访问它。

使用分布式缓存的优点:每一个TaskManager都会存在一份,防止MapTask重复拉取文件。
注册方法:registerCachedFile(String filePath, String name)
获取方法:getRuntimeContext().getDistributedCache().getFile(String name)

java示例

public static void main(String[] args) throws Exception {
     
        StreamExecutionEnvironment env= StreamExecutionEnvironment.getExecutionEnvironment();
        env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
	// 注册一个hdfs文件
	env.registerCachedFile("hdfs:///path/of/your/file", "hdfsFile")
	// 注册一个本地文件
	env.registerCachedFile("file:///path/of/your/file", "localExecFile", true)
	 
	// 定义程序代码 
	...
	SingleOutputStreamOperator<KpiEntity> httpKpiSource = new FlinkKafkaConsumer010<String>(httpTopics, new SimpleStringSchema(), buildConsumerProperties(groupId)) ;
        httpKpiStream .setStartFromLatest() ;
        SingleOutputStreamOperator<KpiEntity> httpKpiStream = httpKpiSource .flatMap(new HttpSourceFlatMapFunction())
                .setParallelism(Constant.HTTP_PARALLELISM).name("fm-" + name)
                .slotSharingGroup(slotSharingGroup) ;
	...
	env.execute("1Min-4G-Application") ;
}

然后只要组件继承了RichFunction,就可以在open方法中使用这个分布式缓存了。

    private Map<String, String> cellAreaRes ;
    @Override
    public void open(Configuration parameters) throws Exception {
     
        cellAreaRes = new HashMap<String, String>() ;
//  	通过getRuntimeContext().getDistributedCache().getFile(Name)方法获取分布式文件
        File file = getRuntimeContext().getDistributedCache().getFile(Constant.AREA_CELL_FILE);
        AnoleInstance.doFillAreaRes(file, cellAreaRes) ;
    }

你可能感兴趣的:(大数据,flink)