1、Distributed Cache(分佈式緩存)
- Flink提供了一個分佈式緩存,類似於hadoop,可以使用戶在並行函數中很方便的讀取本地文件
- 此緩存的工作機制如下:程序註冊一個文件或者目錄(本地或者遠程文件系統,例如hdfs或者s3),通過ExecutionEnvironment註冊緩存文件併爲它起一個名稱。當程序執行,Flink自動將文件或者目錄複製到所有taskmanager節點的本地文件系統,用戶可以通過這個指定的名稱查找文件或者目錄,然後從taskmanager節點的本地文件系統訪問它
- 用法:
1. 註冊一個文件
env.registerCachedFile("hdfs:///path/to/your/file", "hdfsFile")
2. 訪問數據
File myFile = getRuntimeContext().getDistributedCache().getFile("hdfsFile");
2、分佈式緩存實踐
說明:
程序註冊一個文件或本地目錄,通過註冊緩存文件並
爲它起一個名稱,程序執行時自動拷貝到taskmanager節點
本地文件系統,從taskmanager本地節點訪問,沒有網絡IO
2.1、Java代碼實現
package com.Batch.BatchAPI;
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.operators.DataSource;
import org.apache.flink.configuration.Configuration;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: Henry
* @Description: Distributed Cache 分佈式緩存
*
*
* @Date: Create in 2019/5/26 21:28
**/
public class BatchDemoDisCache {
public static void main(String[] args) throws Exception{
//獲取運行環境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
//1:註冊一個文件,可以使用hdfs或者s3上的文件, name:"a.txt",此處相當於起個別名
env.registerCachedFile("E:\\IdeaProject\\DemoFlink\\data\\a.txt","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<>();
@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.out.println("line:" + line);
}
}
@Override
public String map(String value) throws Exception {
//在這裏就可以使用dataList
return "e: " + value;
}
});
result.print();
}
}
2.3、Scala代碼實現
package cn.Batch
import org.apache.commons.io.FileUtils
import org.apache.flink.api.common.functions.RichMapFunction
import org.apache.flink.api.scala.ExecutionEnvironment
import org.apache.flink.configuration.Configuration
/**
* @Author: Henry
* @Description: Distributed Cache分佈式緩存操作
* @Date: Create in 2019/5/26 21:28
**/
object BatchDemoDisCache {
def main(args: Array[String]): Unit = {
val env = ExecutionEnvironment.getExecutionEnvironment
import org.apache.flink.api.scala._
//1:註冊文件
env.registerCachedFile("E:\\IdeaProject\\DemoFlink\\data\\a.txt","b.txt")
val data = env.fromElements("a","b","c","d")
val result = data.map(new RichMapFunction[String,String] {
override def open(parameters: Configuration): Unit = {
super.open(parameters)
val myFile = getRuntimeContext
.getDistributedCache
.getFile("b.txt")
val lines = FileUtils.readLines(myFile)
val it = lines.iterator()
while (it.hasNext){
val line = it.next()
println("line:"+line)
}
}
override def map(value: String) = {
value
}
})
result.print()
}
}