【11】Flink 之 DataSet API(五):Distributed Cache(分佈式緩存)

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()
  }
}


2.3、運行結果


下一節:【12】Flink 之 狀態(State)管理與CheckPoint容錯恢復

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章