第 21 節 Flink Distributed Cache(分佈式緩存)

上篇:第 20 節 Flink Counters(scala)


1、Flink Broadcast和Accumulators的區別

  1. Broadcast(廣播變量)允許程序員將一個只讀的變量緩存在每臺機器上,而不用在任務之間傳遞變量。廣播變量可以進行共享,但是不可以進行修改
  2. Accumulators(累加器)是可以在不同任務中對同一個變量進行累加操作。

2、Flink 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”);


3、代碼實現:

package cache

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


/**
 * Flink Distributed Cache(分佈式緩存)
 */
object BatchDemoDisCacheScala {
  def main(args: Array[String]): Unit = {
    //獲取flink的運行環境
    val env = ExecutionEnvironment.getExecutionEnvironment
    //隱式轉化
    import org.apache.flink.api.scala._

    //1、註冊文件
    env.registerCachedFile("d:\\data\\file\\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): String = {
        value
      }
    })

    result.print()
    }
}

啓動idea的代碼程序,控制檯打印信息:

在這裏插入圖片描述

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