1. 程式人生 > >【雲星資料---Apache Flink實戰系列(精品版)】:Apache Flink高階特性與高階應用002-Flink的記憶體管理002

【雲星資料---Apache Flink實戰系列(精品版)】:Apache Flink高階特性與高階應用002-Flink的記憶體管理002

二、flink的記憶體管理機制

0.flink的記憶體劃分

這裡寫圖片描述

1.flink在JVM的heap內有自己的記憶體管理空間。
2.在flink中記憶體被分為三個部分,分別是Unmanaged區域,Managed區域,Network-Buffer區域
3.Unmanaged區域是指flink不管理這部分割槽域,它的管理由JVM管理,用於存放User Code
4.Managed區域是指flink管理這部分割槽域,它不受jvm管理不存在GC問題,用於存放Hashing,Sorting,Caching等資料
5.Network-Buffer區域是指flink在進行計算時需要通過網路進行交換資料的區域。用於存放Shuffles,Broadcasts資料。

1.flink使用堆外記憶體

這裡寫圖片描述

1.為了解決大量物件在JVM的heap上建立會帶來OOM和GC的問題,flink將大量使用的記憶體存放到堆外.
2.flink在堆外有一塊預分配的固定大小的記憶體塊MemorySegment,flink會將物件高效的序列化到這塊記憶體中。
  MemorySegment由許多小的記憶體cell組成,每個cell大小32kb,這也是flink分配記憶體的最小單位。你可以把 
  MemorySegment想象成是為Flink 定製的 java.nio.ByteBuffer。它的底層可以是一個普通的 Java 位元組陣列
 (byte[]),也可以是一個申請在堆外的 ByteBuffer。每條記錄都會以序列化的形式儲存在一個或多個MemorySegment中。
3.
如果MemorySegment中依然放不小所有的資料,flink會將資料寫入磁碟,需要的時候再衝磁碟讀出來。
使用堆外記憶體獲得的好處:
1.有效防止OOM
由於MemorySegment大小固定,操作高效。如果MemorySegment不足寫出到磁碟,記憶體中的資料不多,一般不會發生OOM.

2.大幅度減輕GC壓力
少量長期使用的資料以二進位制形式儲存在記憶體,大量臨時使用的物件被序列化到磁碟。物件數量就會大量減少,GC壓力減輕。

3.節省記憶體空間
Java物件的儲存密度叫低,現在大量資料都是二進位制的表示形式,儲存密度提高了,記憶體利用率提高了!

4.二進位制操作更高效,快取操作更友好
二進位制資料以定義好的格式儲存,可以高效地比較與操作。另外,該二進位制形式可以把相關的值,以及hash
值,鍵值和指標等相鄰 地放進記憶體中。這使得資料結構可以對快取記憶體更友好,可以從 L1/L2/L3 快取獲得性能的提升

2.flink量身打造序列化方案

假設有一個Tuple3


//1.Person型別
public class Person {
    public int id;
    public String name;
}
//Tuple3<age:Integer, height:Double, Person>物件
(25,175.5,Person(1,"zhangsan"))

它將被序列化為下面的形式:
這裡寫圖片描述

可見這種序列化方式儲存密度是相當緊湊的。其中int4位元組,double8位元組,POJO多個一個位元組的header,
PojoSerializer只負責將header序列化進去,並委託每個欄位對應的serializer對欄位進行序列化。
1.Java生態圈提供了許多序列化框架諸如Java serialization, Kryo, Apache Avro等等。
2.flink中處理的資料流通常是同一型別,物件的型別是固定,可以對整個資料流只儲存一份物件Schema資訊,這將大大節省儲存空間
3.由於型別固定,當我們需要訪問某個物件成員變數的時候,可以通過偏移量直接存取,並不需要反序列化整個Java物件。
4.Flink序列化框架支援任意的Java或是Scala型別,並且不需要像Hadoop那樣必須實現org.apache.hadoop.io.Writable介面。
5.Flink序列化框架支援資料型別自動識別。
  如果是Java程式,通過Java Reflection分析UDF (User Define Function)的返回值型別確定資料型別。
  如果是Scala程式,通過Scala Compiler分析UDF (User Define Function)的返回值型別確定資料型別。

型別資訊由 TypeInformation 類表示,TypeInformation 支援以下幾種型別:

BasicTypeInfo: 任意Java基本型別(裝箱的)或String型別。
BasicArrayTypeInfo: 任意Java基本型別陣列(裝箱的)或String型別。
WritableTypeInfo: 任意Hadoop Writable介面的實現類。
TupleTypeInfo: 任意的Flink Tuple 型別(支援Tuple1到Tuple25)。Flink tuples是固定長度固定型別的Java Tuple
CaseClassTypeInfo: 任意的 Scala CaseClass(包括 Scala tuples)。
PojoTypeInfo: 任意的POJO(Java或Scala)Java物件的所有成員變數,或public修飾符定義,或有getter/setter方法。
GenericTypeInfo: 任意無法匹配之前幾種型別的類。

注意:
1.前六種型別資料集,Flink皆可以自動生成對應的TypeSerializer,能非常高效地對資料集進行序列化和反序列化。
2.最後一種資料型別,Flink會使用Kryo進行序列化和反序列化。
3.對於 Tuple、CaseClass、POJO 等組合型別,其TypeSerializer和TypeComparator也是組合的,
  序列化和比較時會委託給對應的serializers和comparators

3.flink採用資料和引用分開儲存的方式操作資料

1.flink提供大量的api,有些sql-api或sort,groupjoin等操作牽涉到大量的資料,使用大量記憶體。
2.這些操作都是基於flink的資料記憶體和引用記憶體分開儲存的方式進行操作的。

以sort為例:
這裡寫圖片描述

1.Flink從MemoryManager申請一批MemorySegment,作為sort-buffer,用來存放排序的資料。
2.sort-buffer分成兩塊
  一塊用來存放所有物件完整的二進位制資料。
  一塊用來存放指向完整二進位制資料的引用。
  引用由指標(pointer)定長的序列化後的鍵(key)組成,ref=point+keykey和point分開儲存的動機是:
      a.ref.point指向真實資料塊,
      b.ref.key用來做基於key的諸如compare等操作,
      c.ref.key是連續儲存的,這樣能提高cpu的快取命中率,加快CPU訪問資料。
3.當一個物件要加到 sort-buffer時,它的binary-data會被加到第一個區域,ref=(piont+key)會被加到第二個區域。
4.執行比較時,如果有binary-key直接通過偏移量操作binary-key.如果沒有binary-key那隻能序列化整個物件再進行比較。
5.執行互動時,只需互動ref,不需要互動binary-data.

這裡寫圖片描述

6.訪問資料時,只需沿著排好序的ref區域順序訪問,通過ref.pointer找到對應的真實資料.

相關推薦

資料---Apache Flink實戰系列(精品)Apache Flink高階特性高階應用002-Flink記憶體管理002

二、flink的記憶體管理機制 0.flink的記憶體劃分 1.flink在JVM的heap內有自己的記憶體管理空間。 2.在flink中記憶體被分為三個部分,分別是Unmanaged區域,

資料---Apache Flink實戰系列(精品)Apache Flink高階特性高階應用008-Slot和Parallelism的深入分析003

四、任務槽(task-slot)和槽共享(Slot Sharing) 1.任務槽(Task slot) 1.flink的TM就是執行在不同節點上的JVM程序(process),這個程序會

資料---Apache Flink實戰系列(精品)Apache Flink高階特性高階應用001-Flink記憶體管理001

一、基於JVM的大資料生態圈 1.bigdata on jvm 1.現在大多數開源大資料處理框架都是基於jvm的,像 Apache Hadoop,Apache Spark,Apache Hb

資料---Apache Flink實戰系列(精品)Apache Flink實戰基礎0015--flink分散式部署0010

五、flink-on-yarn實現原理 1.通過配置資訊找到yarn a.Flink-Yarn-Client(FRC)讀取YARN_CONF_DIR,HADOOP_CONF_DIR或HAD

資料---Apache Flink實戰系列(精品)Apache Flink高階特性高階應用006-Slot和Parallelism的深入分析001

一、flink架構 1.flink是一個主從結構的分散式程式,它由client和cluster兩部分組成。 2.cluster由主節點JobManager(JM)和從節點TaskManager組

資料---Apache Flink實戰系列(精品)Apache Flink高階特性高階應用004-Flink的作業排程情況001

一、作業(Job)和排程(Scheduling) 1.排程(Scheduling) 1.Flink叢集一般有一個或多個TaskManager,每個TaskManager有一個或多個slot來

資料---Apache Flink實戰系列(精品)Apache Flink實戰基礎002--flink特性流處理特性介紹

第二部分:flink的特性 一、流處理特性 1.高吞吐,低延時 有圖有真相,有比較有差距。且看下圖: 1.flink的吞吐量大 2.flink的延時低 3.flink的配置少

資料---Apache Flink實戰系列(精品)Apache Flink高階特性高階應用015-Flink中廣播變數和分散式快取001

1.flink中的廣播變數 flink支援將變數廣播到worker上,以供程式運算使用。 執行程式 package code.book.batch.sinksource.scala i

資料---Apache Flink實戰系列(精品)Apache Flink實戰基礎0019--IDEA搭建maven管理的整合開發環境001

一、準備flink的開發環境 1. 建立scala的maven專案 2.輸入專案的基本資訊 3.驗證專案的基本資訊 4.輸入專案名稱 5.生成的目錄結構

資料---Apache Flink實戰系列(精品)Apache Flink實戰基礎004--flink特性類庫和API示例

三、類庫和API 1.流處理程式 flink的 DataStream API在流處理的業務場景下,支援多種資料轉換,支援使用者自定義狀態的操作,支援靈活的視窗操作! 示例程式:

資料---Apache Flink實戰系列(精品)Flink流處理API詳解程式設計實戰002-Flink基於流的wordcount示例002

三、基於socket的wordcount 1.傳送資料 1.傳送資料命令 nc -lk 9999 2.傳送資料內容 good good study day day

資料---Scala實戰系列(精品)Scala入門教程062-Scala實戰原始碼-訪問許可權

package scala.demo18_accessModifier /** * Created by liguohua on 2015/8/2. */ /** * 1.訪問許可權有private和protected兩種 * 1.1.pri

資料---Scala實戰系列(精品)Scala入門教程001-使用Intellij IDEA建立scala工程

1.建立Scala工程 選擇[Create New Porject] 選擇,建立[scala]專案,選擇【next】 輸入專案名稱,選擇【finish】進入下面的視窗。 左側是工程結構,中間是快捷鍵提示! 2.建立

資料---Scala實戰系列(精品)Scala入門教程018-Scala實戰原始碼-Scala內部類

Scala 內部類 package scala_learn.demo02_oop /** * Created by liguohua on 2017/8/1. */ class Outer(

資料---Scala實戰系列(精品)Scala入門教程054-Scala實戰原始碼-Scala implicit 操作05

Scala implicit 操作05 package scala_learn.demo12_Implicit /** * Created by liguohua on 2017/3/1.

資料---Scala實戰系列(精品)Scala入門教程060-Scala實戰原始碼-Scala package 包物件

Scala 包物件 包中類 package scala_learn.demo17_package /** * Created by liguohua on 2017/8/2. */ pack

資料---Scala實戰系列(精品)Scala入門教程052-Scala實戰原始碼-Scala implicit 操作03

Scala implicit 操作03 package scala_learn.demo12_Implicit /** * Created by liguohua on 2017/3/1.

資料---Scala實戰系列(精品)Scala入門教程048-Scala實戰原始碼-Scala Match操作

Scala Match操作 package scala_learn.demo11_Collection /** * Created by liguohua on 2017/7/31. */

資料---Scala實戰系列(精品)Scala入門教程036-Scala實戰原始碼-Scala match語句01

Scala match語句 scala中的match語句用來在一個列表中選擇某一個分支來執行分支的語句塊,類似於其他語言中的swtich..case語句 package scala_learn.

資料---Scala實戰系列(精品)Scala入門教程034-Scala實戰原始碼-Scala apply方法02 初始化物件

Scala 呼叫apply() 初始化物件 package scala_learn.demo08_Apply /** * Created by liguohua on 2017/3/1. *