精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深度解析 Flink 是如何管理好內(nèi)存的?

大數(shù)據(jù)
在這篇文章中,我們將討論 Apache Flink 如何管理內(nèi)存,討論其自定義序列化與反序列化機(jī)制,以及它是如何操作二進(jìn)制數(shù)據(jù)的。

前言

如今,許多用于分析大型數(shù)據(jù)集的開(kāi)源系統(tǒng)都是用 Java 或者是基于 JVM 的編程語(yǔ)言實(shí)現(xiàn)的。最著名的例子是 Apache Hadoop,還有較新的框架,如 Apache Spark、Apache Drill、Apache Flink。基于 JVM 的數(shù)據(jù)分析引擎面臨的一個(gè)常見(jiàn)挑戰(zhàn)就是如何在內(nèi)存中存儲(chǔ)大量的數(shù)據(jù)(包括緩存和高效處理)。合理的管理好 JVM 內(nèi)存可以將 難以配置且不可預(yù)測(cè)的系統(tǒng) 與 少量配置且穩(wěn)定運(yùn)行的系統(tǒng)區(qū)分開(kāi)來(lái)。

在這篇文章中,我們將討論 Apache Flink 如何管理內(nèi)存,討論其自定義序列化與反序列化機(jī)制,以及它是如何操作二進(jìn)制數(shù)據(jù)的。

數(shù)據(jù)對(duì)象直接放在堆內(nèi)存中

在 JVM 中處理大量數(shù)據(jù)最直接的方式就是將這些數(shù)據(jù)做為對(duì)象存儲(chǔ)在堆內(nèi)存中,然后直接在內(nèi)存中操作這些數(shù)據(jù),如果想進(jìn)行排序則就是對(duì)對(duì)象列表進(jìn)行排序。然而這種方法有一些明顯的缺點(diǎn),首先,在頻繁的創(chuàng)建和銷(xiāo)毀大量對(duì)象的時(shí)候,監(jiān)視和控制堆內(nèi)存的使用并不是一件很簡(jiǎn)單的事情。如果對(duì)象分配過(guò)多的話,那么會(huì)導(dǎo)致內(nèi)存過(guò)度使用,從而觸發(fā) OutOfMemoryError,導(dǎo)致 JVM 進(jìn)程直接被殺死。另一個(gè)方面就是因?yàn)檫@些對(duì)象大都是生存在新生代,當(dāng) JVM 進(jìn)行垃圾回收時(shí),垃圾收集的開(kāi)銷(xiāo)很容易達(dá)到 50% 甚至更多。最后就是 Java 對(duì)象具有一定的空間開(kāi)銷(xiāo)(具體取決于 JVM 和平臺(tái))。對(duì)于具有許多小對(duì)象的數(shù)據(jù)集,這可以顯著減少有效可用的內(nèi)存量。如果你精通系統(tǒng)設(shè)計(jì)和系統(tǒng)調(diào)優(yōu),你可以根據(jù)系統(tǒng)進(jìn)行特定的參數(shù)調(diào)整,可以或多或少的控制出現(xiàn) OutOfMemoryError 的次數(shù)和避免堆內(nèi)存的過(guò)多使用,但是這種設(shè)置和調(diào)優(yōu)的作用有限,尤其是在數(shù)據(jù)量較大和執(zhí)行環(huán)境發(fā)生變化的情況下。

Flink 是怎么做的?

Apache Flink 起源于一個(gè)研究項(xiàng)目,該項(xiàng)目旨在結(jié)合基于 MapReduce 的系統(tǒng)和并行數(shù)據(jù)庫(kù)系統(tǒng)的最佳技術(shù)。在此背景下,F(xiàn)link 一直有自己的內(nèi)存數(shù)據(jù)處理方法。Flink 將對(duì)象序列化為固定數(shù)量的預(yù)先分配的內(nèi)存段,而不是直接把對(duì)象放在堆內(nèi)存上。它的 DBMS 風(fēng)格的排序和連接算法盡可能多地對(duì)這個(gè)二進(jìn)制數(shù)據(jù)進(jìn)行操作,以此將序列化和反序列化開(kāi)銷(xiāo)降到最低。如果需要處理的數(shù)據(jù)多于可以保存在內(nèi)存中的數(shù)據(jù),F(xiàn)link 的運(yùn)算符會(huì)將部分?jǐn)?shù)據(jù)溢出到磁盤(pán)。事實(shí)上,很多Flink 的內(nèi)部實(shí)現(xiàn)看起來(lái)更像是 C / C ++,而不是普通的 Java。下圖概述了 Flink 如何在內(nèi)存段中存儲(chǔ)序列化數(shù)據(jù)并在必要時(shí)溢出到磁盤(pán):

深度解析 Flink 是如何管理好內(nèi)存的?

Flink 的主動(dòng)內(nèi)存管理和操作二進(jìn)制數(shù)據(jù)有幾個(gè)好處:

  1. 內(nèi)存安全執(zhí)行和高效的核外算法 由于分配的內(nèi)存段的數(shù)量是固定的,因此監(jiān)控剩余的內(nèi)存資源是非常簡(jiǎn)單的。在內(nèi)存不足的情況下,處理操作符可以有效地將更大批的內(nèi)存段寫(xiě)入磁盤(pán),后面再將它們讀回到內(nèi)存。因此,OutOfMemoryError 就有效的防止了。
  2. 減少垃圾收集壓力 因?yàn)樗虚L(zhǎng)生命周期的數(shù)據(jù)都是在 Flink 的管理內(nèi)存中以二進(jìn)制表示的,所以所有數(shù)據(jù)對(duì)象都是短暫的,甚至是可變的,并且可以重用。短生命周期的對(duì)象可以更有效地進(jìn)行垃圾收集,這大大降低了垃圾收集的壓力。現(xiàn)在,預(yù)先分配的內(nèi)存段是 JVM 堆上的長(zhǎng)期存在的對(duì)象,為了降低垃圾收集的壓力,F(xiàn)link 社區(qū)正在積極地將其分配到堆外內(nèi)存。這種努力將使得 JVM 堆變得更小,垃圾收集所消耗的時(shí)間將更少。
  3. 節(jié)省空間的數(shù)據(jù)存儲(chǔ) Java 對(duì)象具有存儲(chǔ)開(kāi)銷(xiāo),如果數(shù)據(jù)以二進(jìn)制的形式存儲(chǔ),則可以避免這種開(kāi)銷(xiāo)。
  4. 高效的二進(jìn)制操作和緩存敏感性 在給定合適的二進(jìn)制表示的情況下,可以有效地比較和操作二進(jìn)制數(shù)據(jù)。此外,二進(jìn)制表示可以將相關(guān)值、哈希碼、鍵和指針等相鄰地存儲(chǔ)在內(nèi)存中。這使得數(shù)據(jù)結(jié)構(gòu)通常具有更高效的緩存訪問(wèn)模式。

主動(dòng)內(nèi)存管理的這些特性在用于大規(guī)模數(shù)據(jù)分析的數(shù)據(jù)處理系統(tǒng)中是非常可取的,但是要實(shí)現(xiàn)這些功能的代價(jià)也是高昂的。要實(shí)現(xiàn)對(duì)二進(jìn)制數(shù)據(jù)的自動(dòng)內(nèi)存管理和操作并非易事,使用 java.util.HashMap 比實(shí)現(xiàn)一個(gè)可溢出的 hash-table (由字節(jié)數(shù)組和自定義序列化支持)。當(dāng)然,Apache Flink 并不是唯一一個(gè)基于 JVM 且對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行操作的數(shù)據(jù)處理系統(tǒng)。例如 Apache Drill、Apache Ignite、Apache Geode 也有應(yīng)用類似技術(shù),最近 Apache Spark 也宣布將向這個(gè)方向演進(jìn)。

下面我們將詳細(xì)討論 Flink 如何分配內(nèi)存、如果對(duì)對(duì)象進(jìn)行序列化和反序列化以及如果對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行操作。我們還將通過(guò)一些性能表現(xiàn)數(shù)據(jù)來(lái)比較處理堆內(nèi)存上的對(duì)象和對(duì)二進(jìn)制數(shù)據(jù)的操作。

Flink 如何分配內(nèi)存?

Flink TaskManager 是由幾個(gè)內(nèi)部組件組成的:actor 系統(tǒng)(負(fù)責(zé)與 Flink master 協(xié)調(diào))、IOManager(負(fù)責(zé)將數(shù)據(jù)溢出到磁盤(pán)并將其讀取回來(lái))、MemoryManager(負(fù)責(zé)協(xié)調(diào)內(nèi)存使用)。在本篇文章中,我們主要講解 MemoryManager。

MemoryManager 負(fù)責(zé)將 MemorySegments 分配、計(jì)算和分發(fā)給數(shù)據(jù)處理操作符,例如 sort 和 join 等操作符。MemorySegment 是 Flink 的內(nèi)存分配單元,由常規(guī) Java 字節(jié)數(shù)組支持(默認(rèn)大小為 32 KB)。MemorySegment 通過(guò)使用 Java 的 unsafe 方法對(duì)其支持的字節(jié)數(shù)組提供非常有效的讀寫(xiě)訪問(wèn)。你可以將 MemorySegment 看作是 Java 的 NIO ByteBuffer 的定制版本。為了在更大的連續(xù)內(nèi)存塊上操作多個(gè) MemorySegment,F(xiàn)link 使用了實(shí)現(xiàn) Java 的 java.io.DataOutput 和 java.io.DataInput 接口的邏輯視圖。

MemorySegments 在 TaskManager 啟動(dòng)時(shí)分配一次,并在 TaskManager 關(guān)閉時(shí)銷(xiāo)毀。因此,在 TaskManager 的整個(gè)生命周期中,MemorySegment 是重用的,而不會(huì)被垃圾收集的。在初始化 TaskManager 的所有內(nèi)部數(shù)據(jù)結(jié)構(gòu)并且已啟動(dòng)所有核心服務(wù)之后,MemoryManager 開(kāi)始創(chuàng)建 MemorySegments。默認(rèn)情況下,服務(wù)初始化后,70% 可用的 JVM 堆內(nèi)存由 MemoryManager 分配(也可以配置全部)。剩余的 JVM 堆內(nèi)存用于在任務(wù)處理期間實(shí)例化的對(duì)象,包括由用戶定義的函數(shù)創(chuàng)建的對(duì)象。下圖顯示了啟動(dòng)后 TaskManager JVM 中的內(nèi)存分布:

深度解析 Flink 是如何管理好內(nèi)存的?

Flink 如何序列化對(duì)象?

Java 生態(tài)系統(tǒng)提供了幾個(gè)庫(kù),可以將對(duì)象轉(zhuǎn)換為二進(jìn)制表示形式并返回。常見(jiàn)的替代方案是標(biāo)準(zhǔn) Java 序列化,Kryo,Apache Avro,Apache Thrift 或 Google 的 Protobuf。Flink 包含自己的自定義序列化框架,以便控制數(shù)據(jù)的二進(jìn)制表示。這一點(diǎn)很重要,因?yàn)閷?duì)二進(jìn)制數(shù)據(jù)進(jìn)行操作需要對(duì)序列化布局有準(zhǔn)確的了解。此外,根據(jù)在二進(jìn)制數(shù)據(jù)上執(zhí)行的操作配置序列化布局可以顯著提升性能。Flink 的序列化機(jī)制利用了這一特性,即在執(zhí)行程序之前,要序列化和反序列化的對(duì)象的類型是完全已知的。

Flink 程序可以處理表示為任意 Java 或 Scala 對(duì)象的數(shù)據(jù)。在優(yōu)化程序之前,需要識(shí)別程序數(shù)據(jù)流的每個(gè)處理步驟中的數(shù)據(jù)類型。對(duì)于 Java 程序,F(xiàn)link 提供了一個(gè)基于反射的類型提取組件,用于分析用戶定義函數(shù)的返回類型。Scala 程序可以在 Scala 編譯器的幫助下進(jìn)行分析。Flink 使用 TypeInformation 表示每種數(shù)據(jù)類型。

  • Flink 有如下幾種數(shù)據(jù)類型的 TypeInformations:
  • BasicTypeInfo:所有 Java 的基礎(chǔ)類型或 java.lang.String
  • BasicArrayTypeInfo:Java 基本類型構(gòu)成的數(shù)組或 java.lang.String
  • WritableTypeInfo:Hadoop 的 Writable 接口的任何實(shí)現(xiàn)
  • TupleTypeInfo:任何 Flink tuple(Tuple1 到 Tuple25)。Flink tuples 是具有類型化字段的固定長(zhǎng)度元組的 Java 表示
  • CaseClassTypeInfo:任何 Scala CaseClass(包括 Scala tuples)
  • PojoTypeInfo:任何 POJO(Java 或 Scala),即所有字段都是 public 的或通過(guò) getter 和 setter 訪問(wèn)的對(duì)象,遵循通用命名約定
  • GenericTypeInfo:不能標(biāo)識(shí)為其他類型的任何數(shù)據(jù)類型

每個(gè) TypeInformation 都為它所代表的數(shù)據(jù)類型提供了一個(gè)序列化器。例如,BasicTypeInfo 返回一個(gè)序列化器,該序列化器寫(xiě)入相應(yīng)的基本類型;WritableTypeInfo 的序列化器將序列化和反序列化委托給實(shí)現(xiàn) Hadoop 的 Writable 接口的對(duì)象的 write() 和 readFields() 方法;GenericTypeInfo 返回一個(gè)序列化器,該序列化器將序列化委托給 Kryo。對(duì)象將自動(dòng)通過(guò) Java 中高效的 Unsafe 方法來(lái)序列化到 Flink MemorySegments 支持的 DataOutput。對(duì)于可用作鍵的數(shù)據(jù)類型,例如哈希值,TypeInformation 提供了 TypeComparators,TypeComparators 比較和哈希對(duì)象,并且可以根據(jù)具體的數(shù)據(jù)類型有效的比較二進(jìn)制并提取固定長(zhǎng)度的二進(jìn)制 key 前綴。

Tuple,Pojo 和 CaseClass 類型是復(fù)合類型,它們可能嵌套一個(gè)或者多個(gè)數(shù)據(jù)類型。因此,它們的序列化和比較也都比較復(fù)雜,一般將其成員數(shù)據(jù)類型的序列化和比較都交給各自的 Serializers(序列化器) 和 Comparators(比較器)。下圖說(shuō)明了 Tuple3對(duì)象的序列化,其中Person 是 POJO 并定義如下: 

  1. public class Person { 
  2.     public int id; 
  3.     public String name

 深度解析 Flink 是如何管理好內(nèi)存的?

 

通過(guò)提供定制的 TypeInformations、Serializers(序列化器) 和 Comparators(比較器),可以方便地?cái)U(kuò)展 Flink 的類型系統(tǒng),從而提高序列化和比較自定義數(shù)據(jù)類型的性能。

Flink 如何對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行操作?

與其他的數(shù)據(jù)處理框架的 API(包括 SQL)類似,F(xiàn)link 的 API 也提供了對(duì)數(shù)據(jù)集進(jìn)行分組、排序和連接等轉(zhuǎn)換操作。這些轉(zhuǎn)換操作的數(shù)據(jù)集可能非常大。關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)具有非常高效的算法,比如 merge-sort、merge-join 和 hash-join。Flink 建立在這種技術(shù)的基礎(chǔ)上,但是主要分為使用自定義序列化和自定義比較器來(lái)處理任意對(duì)象。在下面文章中我們將通過(guò) Flink 的內(nèi)存排序算法示例演示 Flink 如何使用二進(jìn)制數(shù)據(jù)進(jìn)行操作。

Flink 為其數(shù)據(jù)處理操作符預(yù)先分配內(nèi)存,初始化時(shí),排序算法從 MemoryManager 請(qǐng)求內(nèi)存預(yù)算,并接收一組相應(yīng)的 MemorySegments。這些 MemorySegments 變成了緩沖區(qū)的內(nèi)存池,緩沖區(qū)中收集要排序的數(shù)據(jù)。下圖說(shuō)明了如何將數(shù)據(jù)對(duì)象序列化到排序緩沖區(qū)中:

深度解析 Flink 是如何管理好內(nèi)存的?

排序緩沖區(qū)在內(nèi)部分為兩個(gè)內(nèi)存區(qū)域:第一個(gè)區(qū)域保存所有對(duì)象的完整二進(jìn)制數(shù)據(jù),第二個(gè)區(qū)域包含指向完整二進(jìn)制對(duì)象數(shù)據(jù)的指針(取決于 key 的數(shù)據(jù)類型)。將對(duì)象添加到排序緩沖區(qū)時(shí),它的二進(jìn)制數(shù)據(jù)會(huì)追加到第一個(gè)區(qū)域,指針(可能還有一個(gè) key)被追加到第二個(gè)區(qū)域。分離實(shí)際數(shù)據(jù)和指針以及固定長(zhǎng)度的 key 有兩個(gè)目的:它可以有效的交換固定長(zhǎng)度的 entries(key 和指針),還可以減少排序時(shí)需要移動(dòng)的數(shù)據(jù)。如果排序的 key 是可變長(zhǎng)度的數(shù)據(jù)類型(比如 String),則固定長(zhǎng)度的排序 key 必須是前綴 key,比如字符串的前 n 個(gè)字符。請(qǐng)注意:并非所有數(shù)據(jù)類型都提供固定長(zhǎng)度的前綴排序 key。將對(duì)象序列化到排序緩沖區(qū)時(shí),兩個(gè)內(nèi)存區(qū)域都使用內(nèi)存池中的 MemorySegments 進(jìn)行擴(kuò)展。一旦內(nèi)存池為空且不能再添加對(duì)象時(shí),則排序緩沖區(qū)將會(huì)被完全填充并可以進(jìn)行排序。Flink 的排序緩沖區(qū)提供了比較和交換元素的方法,這使得實(shí)際的排序算法是可插拔的。默認(rèn)情況下, Flink 使用了 Quicksort(快速排序)實(shí)現(xiàn),可以使用 HeapSort(堆排序)。下圖顯示了如何比較兩個(gè)對(duì)象:

深度解析 Flink 是如何管理好內(nèi)存的?

排序緩沖區(qū)通過(guò)比較它們的二進(jìn)制固定長(zhǎng)度排序 key 來(lái)比較兩個(gè)元素。如果元素的完整 key(不是前綴 key) 或者二進(jìn)制前綴 key 不相等,則代表比較成功。如果前綴 key 相等(或者排序 key 的數(shù)據(jù)類型不提供二進(jìn)制前綴 key),則排序緩沖區(qū)遵循指向?qū)嶋H對(duì)象數(shù)據(jù)的指針,對(duì)兩個(gè)對(duì)象進(jìn)行反序列化并比較對(duì)象。根據(jù)比較結(jié)果,排序算法決定是否交換比較的元素。排序緩沖區(qū)通過(guò)移動(dòng)其固定長(zhǎng)度 key 和指針來(lái)交換兩個(gè)元素,實(shí)際數(shù)據(jù)不會(huì)移動(dòng),排序算法完成后,排序緩沖區(qū)中的指針被正確排序。下圖演示了如何從排序緩沖區(qū)返回已排序的數(shù)據(jù):

深度解析 Flink 是如何管理好內(nèi)存的?

通過(guò)順序讀取排序緩沖區(qū)的指針區(qū)域,跳過(guò)排序 key 并按照實(shí)際數(shù)據(jù)的排序指針?lè)祷嘏判驍?shù)據(jù)。此數(shù)據(jù)要么反序列化并作為對(duì)象返回,要么在外部合并排序的情況下復(fù)制二進(jìn)制數(shù)據(jù)并將其寫(xiě)入磁盤(pán)。

基準(zhǔn)測(cè)試數(shù)據(jù)

那么,對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行操作對(duì)性能意味著什么?我們將運(yùn)行一個(gè)基準(zhǔn)測(cè)試,對(duì) 1000 萬(wàn)個(gè)Tuple2對(duì)象進(jìn)行排序以找出答案。整數(shù)字段的值從均勻分布中采樣。String 字段值的長(zhǎng)度為 12 個(gè)字符,并從長(zhǎng)尾分布中進(jìn)行采樣。輸入數(shù)據(jù)由返回可變對(duì)象的迭代器提供,即返回具有不同字段值的相同 Tuple 對(duì)象實(shí)例。Flink 在從內(nèi)存,網(wǎng)絡(luò)或磁盤(pán)讀取數(shù)據(jù)時(shí)使用此技術(shù),以避免不必要的對(duì)象實(shí)例化。基準(zhǔn)測(cè)試在具有 900 MB 堆大小的 JVM 中運(yùn)行,在堆上存儲(chǔ)和排序 1000 萬(wàn)個(gè) Tuple 對(duì)象并且不會(huì)導(dǎo)致觸發(fā) OutOfMemoryError 大約需要這么大的內(nèi)存。我們使用三種排序方法在Integer 字段和 String 字段上對(duì) Tuple 對(duì)象進(jìn)行排序:

  1. 對(duì)象存在堆中:Tuple 對(duì)象存儲(chǔ)在常用的 java.util.ArrayList 中,初始容量設(shè)置為 1000 萬(wàn),并使用 Java 中常用的集合排序進(jìn)行排序。
  2. Flink 序列化:使用 Flink 的自定義序列化程序?qū)?Tuple 字段序列化為 600 MB 大小的排序緩沖區(qū),如上所述排序,最后再次反序列化。在 Integer 字段上進(jìn)行排序時(shí),完整的 Integer 用作排序 key,以便排序完全發(fā)生在二進(jìn)制數(shù)據(jù)上(不需要對(duì)象的反序列化)。對(duì)于 String 字段的排序,使用 8 字節(jié)前綴 key,如果前綴 key 相等,則對(duì) Tuple 對(duì)象進(jìn)行反序列化。
  3. Kryo 序列化:使用 Kryo 序列化將 Tuple 字段序列化為 600 MB 大小的排序緩沖區(qū),并在沒(méi)有二進(jìn)制排序 key 的情況下進(jìn)行排序。這意味著每次比較需要對(duì)兩個(gè)對(duì)象進(jìn)行反序列化。

所有排序方法都使用單線程實(shí)現(xiàn)。結(jié)果的時(shí)間是十次運(yùn)行結(jié)果的平均值。在每次運(yùn)行之后,我們調(diào)用System.gc()請(qǐng)求垃圾收集運(yùn)行,該運(yùn)行不會(huì)進(jìn)入測(cè)量的執(zhí)行時(shí)間。下圖顯示了將輸入數(shù)據(jù)存儲(chǔ)在內(nèi)存中,對(duì)其進(jìn)行排序并將其作為對(duì)象讀回的時(shí)間。

深度解析 Flink 是如何管理好內(nèi)存的?

我們看到 Flink 使用自己的序列化器對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行排序明顯優(yōu)于其他兩種方法。與存儲(chǔ)在堆內(nèi)存上相比,我們看到將數(shù)據(jù)加載到內(nèi)存中要快得多。因?yàn)槲覀儗?shí)際上是在收集對(duì)象,沒(méi)有機(jī)會(huì)重用對(duì)象實(shí)例,但必須重新創(chuàng)建每個(gè) Tuple。這比 Flink 的序列化器(或Kryo序列化)效率低。另一方面,與反序列化相比,從堆中讀取對(duì)象是無(wú)性能消耗的。在我們的基準(zhǔn)測(cè)試中,對(duì)象克隆比序列化和反序列化組合更耗性能。查看排序時(shí)間,我們看到對(duì)二進(jìn)制數(shù)據(jù)的排序也比 Java 的集合排序更快。使用沒(méi)有二進(jìn)制排序 key 的 Kryo 序列化的數(shù)據(jù)排序比其他方法慢得多。這是因?yàn)榉葱蛄谢瘞?lái)很大的開(kāi)銷(xiāo)。在String 字段上對(duì) Tuple 進(jìn)行排序比在 Integer 字段上排序更快,因?yàn)殚L(zhǎng)尾值分布顯著減少了成對(duì)比較的數(shù)量。為了更好地了解排序過(guò)程中發(fā)生的狀況,我們使用 VisualVM 監(jiān)控執(zhí)行的 JVM。以下截圖顯示了執(zhí)行 10次 運(yùn)行時(shí)的堆內(nèi)存使用情況、垃圾收集情況和 CPU 使用情況。

深度解析 Flink 是如何管理好內(nèi)存的?

測(cè)試是在 8 核機(jī)器上運(yùn)行單線程,因此一個(gè)核心的完全利用僅對(duì)應(yīng) 12.5% 的總體利用率。截圖顯示,對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行操作可顯著減少垃圾回收活動(dòng)。對(duì)于對(duì)象存在堆中,垃圾收集器在排序緩沖區(qū)被填滿時(shí)以非常短的時(shí)間間隔運(yùn)行,并且即使對(duì)于單個(gè)處理線程也會(huì)導(dǎo)致大量 CPU 使用(排序本身不會(huì)觸發(fā)垃圾收集器)。JVM 垃圾收集多個(gè)并行線程,解釋了高CPU 總體利用率。另一方面,對(duì)序列化數(shù)據(jù)進(jìn)行操作的方法很少觸發(fā)垃圾收集器并且 CPU 利用率低得多。實(shí)際上,如果使用 Flink 序列化的方式在 Integer 字段上對(duì) Tuple 進(jìn)行排序,則垃圾收集器根本不運(yùn)行,因?yàn)閷?duì)于成對(duì)比較,不需要反序列化任何對(duì)象。Kryo 序列化需要比較多的垃圾收集,因?yàn)樗皇褂枚M(jìn)制排序 key 并且每次排序都要反序列化兩個(gè)對(duì)象。

內(nèi)存使用情況上圖顯示 Flink 序列化和 Kryo 序列化不斷的占用大量?jī)?nèi)存

存使用情況圖表顯示flink-serialized和kryo-serialized不斷占用大量?jī)?nèi)存。這是由于 MemorySegments 的預(yù)分配。實(shí)際內(nèi)存使用率要低得多,因?yàn)榕判蚓彌_區(qū)并未完全填充。下表顯示了每種方法的內(nèi)存消耗。1000 萬(wàn)條數(shù)據(jù)產(chǎn)生大約 280 MB 的二進(jìn)制數(shù)據(jù)(對(duì)象數(shù)據(jù)、指針和排序 key),具體取決于使用的序列化程序以及二進(jìn)制排序 key 的存在和大小。將其與數(shù)據(jù)存儲(chǔ)在堆上的方法進(jìn)行比較,我們發(fā)現(xiàn)對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行操作可以顯著提高內(nèi)存效率。在我們的基準(zhǔn)測(cè)試中,如果序列化為排序緩沖區(qū)而不是將其作為堆上的對(duì)象保存,則可以在內(nèi)存中對(duì)兩倍以上的數(shù)據(jù)進(jìn)行排序。

 

深度解析 Flink 是如何管理好內(nèi)存的?

總而言之,測(cè)試驗(yàn)證了文章前面說(shuō)的對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行操作的好處。

展望未來(lái)

Apache Flink 具有相當(dāng)多的高級(jí)技術(shù),可以通過(guò)有限的內(nèi)存資源安全有效地處理大量數(shù)據(jù)。但是有幾點(diǎn)可以使 Flink 更有效率。Flink 社區(qū)正在努力將管理內(nèi)存移動(dòng)到堆外內(nèi)存。這將允許更小的 JVM,更低的垃圾收集開(kāi)銷(xiāo),以及更容易的系統(tǒng)配置。使用 Flink 的 Table API,所有操作(如 aggregation 和 projection)的語(yǔ)義都是已知的(與黑盒用戶定義的函數(shù)相反)。因此,我們可以為直接對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行操作的 Table API 操作生成代碼。進(jìn)一步的改進(jìn)包括序列化設(shè)計(jì),這些設(shè)計(jì)針對(duì)應(yīng)用于二進(jìn)制數(shù)據(jù)的操作和針對(duì)序列化器和比較器的代碼生成而定制。

總結(jié)

  • Flink 的主動(dòng)內(nèi)存管理減少了因觸發(fā) OutOfMemoryErrors 而殺死 JVM 進(jìn)程和垃圾收集開(kāi)銷(xiāo)的問(wèn)題。
  • Flink 具有高效的數(shù)據(jù)序列化和反序列化機(jī)制,有助于對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行操作,并使更多數(shù)據(jù)適合內(nèi)存。
  • Flink 的 DBMS 風(fēng)格的運(yùn)算符本身在二進(jìn)制數(shù)據(jù)上運(yùn)行,在必要時(shí)可以在內(nèi)存中高性能地傳輸?shù)酱疟P(pán)。

 

責(zé)任編輯:未麗燕 來(lái)源: 54tianzhisheng.cn
相關(guān)推薦

2016-10-09 14:41:40

Swift開(kāi)發(fā)ARC

2020-07-28 08:10:33

Linux內(nèi)存虛擬

2024-12-11 08:00:00

移動(dòng)語(yǔ)義C++

2011-07-29 16:08:31

Objective-C 內(nèi)存

2025-01-13 00:30:17

2010-03-15 19:56:46

Java線程

2025-09-09 01:45:00

2019-12-05 12:00:18

人工智能AI

2012-07-30 09:35:10

項(xiàng)目管理

2014-02-11 11:22:00

并購(gòu)管理

2020-09-17 11:19:39

Linux 系統(tǒng) 數(shù)據(jù)

2012-06-29 13:54:11

Java內(nèi)存原型

2025-08-27 06:00:00

2011-03-24 16:01:30

數(shù)據(jù)庫(kù)管理

2023-11-19 22:31:00

內(nèi)存程序

2019-07-10 05:08:05

CPU內(nèi)存分頁(yè)管理

2018-12-06 12:58:50

CPU內(nèi)存模塊

2019-06-24 19:00:09

JavaScript內(nèi)存泄漏垃圾回收

2023-10-12 19:41:55

2024-09-09 09:41:03

內(nèi)存溢出golang開(kāi)發(fā)者
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

天天操天天干天天摸| 69xxx免费视频| 国内外激情在线| 高清成人在线观看| 国产98色在线| 国产成人综合在线视频| 免费看成人人体视频| 91成人免费网站| 免费极品av一视觉盛宴| 亚洲 欧美 激情 另类| 美女网站色91| 久久久噜噜噜久久久| 国产福利在线导航| 麻豆成人入口| 5月丁香婷婷综合| 欧美 日韩 国产一区| 亚洲专区区免费| 亚洲四虎影院| 亚洲图片欧美综合| 亚洲精品一品区二品区三品区| www.欧美国产| 秋霞午夜av一区二区三区| 欧美激情性做爰免费视频| 五月天精品在线| 欧美大胆视频| 日韩午夜三级在线| 国内国产精品天干天干| 欧美在线极品| 亚洲成人资源网| 樱空桃在线播放| 国产资源在线看| 99久久久无码国产精品| 成人动漫视频在线观看完整版 | 好看不卡的中文字幕| 一区二区三区久久精品| 中文字幕在线看高清电影| 99久久人爽人人添人人澡| 欧美日韩精品欧美日韩精品| 亚洲不卡视频在线| 日韩深夜视频| 午夜精品久久久久影视| 久草免费福利在线| 不卡一本毛片| 亚洲一级二级三级在线免费观看| 中文字幕精品在线播放| 欧美人xxx| 中文字幕在线观看不卡| 中文字幕在线亚洲精品| 欧美成年黄网站色视频| 国产精品久久毛片a| 亚洲v日韩v欧美v综合| 国产一二三区在线| 国产日韩欧美精品电影三级在线| 美国av一区二区三区| 亚洲色大成网站www| 91性感美女视频| 久久99久久99精品蜜柚传媒| 天堂成人在线| 久久久影视传媒| 欧洲久久久久久| 国产中文字幕在线看| 国产嫩草影院久久久久| 天天久久人人| 久久精品视频观看| 亚洲一区二区视频在线| 日本一本中文字幕| 美女av在线免费看| 色88888久久久久久影院按摩| 妞干网在线免费视频| 欧美爱爱视频| 日韩一区二区麻豆国产| 国产极品一区二区| 久草免费在线观看视频| 亚洲精品传媒| 18欧美亚洲精品| 日韩视频一二三| heyzo高清国产精品| 欧美视频专区一二在线观看| 久久黄色免费看| 国产精品99| 日韩欧美二区三区| 日本黄色片在线播放| jlzzjlzz亚洲女人| 久热99视频在线观看| 日本在线观看视频网站| 日韩精品五月天| 亚洲自拍中文字幕| 日韩三级电影网| 亚洲天堂2014| 日韩在线一级片| 四虎国产精品永久在线国在线 | 亚洲国产精品人人做人人爽| 欧美日韩在线成人| 涩爱av色老久久精品偷偷鲁| 精品无码久久久久久国产| 少妇高潮惨叫久久久久| 亚洲视频综合| 国产精品嫩草视频| 人妻少妇精品无码专区久久| 日本一区二区三区视频视频| 800av在线免费观看| 亚洲伦乱视频| 亚洲成人精品视频在线观看| а天堂中文在线资源| 国产精品久久久久久久久久妞妞| 成人h视频在线| 欧美成人综合在线| 亚洲国产精品自拍| 中文字幕22页| 国产va免费精品观看精品视频| 久久亚洲精品视频| 波多野结衣理论片| 白白色亚洲国产精品| 先锋影音男人资源| 欧洲成人一区| 亚洲欧美国产日韩天堂区| 免费在线观看亚洲| 激情综合色综合久久综合| 日本午夜精品一区二区| 老司机深夜福利在线观看| 制服丝袜亚洲色图| 日韩av片在线| 三级欧美韩日大片在线看| 国产美女在线精品免费观看| 黄网页免费在线观看| 成人国产精品一区二区免费麻豆| 亚洲图片欧美视频| 日本一二三区在线| 色小子综合网| 国产精品极品在线| 九色视频在线观看免费播放 | 在线日韩中文字幕| av图片在线观看| 99久久久无码国产精品| 免费的av在线| www.欧美视频| 日韩中文字幕在线视频| 中文字幕人妻一区二区在线视频| 久久众筹精品私拍模特| 欧美三级一级片| 另类ts人妖一区二区三区| 久久久女人电视剧免费播放下载| www.蜜桃av.com| 亚洲综合视频在线观看| 女同性αv亚洲女同志| 综合国产在线| 成人黄动漫网站免费| 国产精品186在线观看在线播放| 日韩欧美另类在线| 免费人成在线观看| 成人一区二区三区| 少妇人妻大乳在线视频| 欧美aaaaa级| 欧美在线一区二区三区四| 日韩av高清在线| 日韩欧美有码在线| 日本美女xxx| 精品一区二区在线观看| 欧美少妇一级片| 伊人久久影院| 91禁外国网站| 国产精品久久一区二区三区不卡| 欧美亚洲一区二区在线观看| 日本女人性生活视频| 黑人巨大精品欧美黑白配亚洲| 色乱码一区二区三区熟女 | 日本女优在线视频一区二区| 婷婷亚洲婷婷综合色香五月| 欧美黄色成人| 久久999免费视频| 天天干天天爱天天操| 色综合久久久久综合体| 91ts人妖另类精品系列| 成人午夜大片免费观看| 亚欧无线一线二线三线区别| 欧美日韩国产传媒| 91久久精品www人人做人人爽| 1区2区3区在线| 亚洲无线码在线一区观看| 亚洲天堂中文字幕在线| 亚洲午夜影视影院在线观看| 中文字幕在线观看的网站| 国产乱码一区二区| 国产精品羞羞答答xxdd| 日韩av新片网| 欧美综合一区| 国产精品久久九九| 国产经典一区| 久久免费视频这里只有精品| 国产粉嫩一区二区三区在线观看| 555夜色666亚洲国产免| 香蕉影院在线观看| 成人欧美一区二区三区1314 | 综合伊人久久| 国产成人+综合亚洲+天堂| www免费在线观看| 亚洲久久久久久久久久久| 国产巨乳在线观看| 欧美日韩国产一区二区| 亚洲女人久久久| 91免费国产视频网站| 精品国产鲁一鲁一区二区三区| 国产视频一区三区| 欧美一区二区三区综合| 国产免费av一区二区三区| 成人免费在线一区二区三区| 国产亚洲人成a在线v网站| 性色av一区二区三区红粉影视| 91精彩视频在线播放| 亚洲精品国产综合区久久久久久久| 亚洲一区 中文字幕| 精品国产老师黑色丝袜高跟鞋| www.毛片com| 欧美韩国日本综合| 人妻丰满熟妇aⅴ无码| 国产成人av资源| 亚洲免费999| 日韩精品国产精品| av7777777| 欧美日韩三级| 久久久成人精品一区二区三区 | 日韩精品免费一区| 第一社区sis001原创亚洲| 久久这里精品国产99丫e6| 91成人精品在线| 91欧美激情另类亚洲| 亚洲天堂av一区二区| 国产一区二区三区探花| 国产一区二区三区无遮挡| 国产一区二区三区黄网站| 国产一区视频在线播放| 91福利精品在线观看| 国产成人鲁鲁免费视频a| 亚洲最大成人| 欧美在线一区二区视频| 亚洲天堂手机| 欧美在线视频播放| av在线最新| 午夜精品福利在线观看| 狂野欧美性猛交xxxxx视频| 久久成人精品电影| 2024最新电影在线免费观看| 久久综合伊人77777尤物| 成人a在线视频免费观看| 精品国产欧美一区二区五十路| 最新真实国产在线视频| 色播久久人人爽人人爽人人片视av| 国产精品免费播放| 中文字幕免费国产精品| 婷婷五月在线视频| zzijzzij亚洲日本成熟少妇| 日本三级在线视频| 久久精品99久久香蕉国产色戒| 超碰在线观看免费版| 理论片在线不卡免费观看| 羞羞网站在线看| 久久久久久久久爱| 美女高潮在线观看| 日韩av电影国产| 123成人网| 亚洲va欧美va国产综合剧情| 日韩三级不卡| 激情小说综合网| 国产一区二区三区天码| 亚洲欧洲精品在线| 欧美日本中文| 两根大肉大捧一进一出好爽视频| 久久一区视频| 三级一区二区三区| 成人小视频在线| 高潮毛片无遮挡| 中文字幕在线免费不卡| 国产无码精品一区二区| 色哟哟日韩精品| 国产又大又黑又粗| 亚洲高清一二三区| 国产日本在线观看| 九九热这里只有在线精品视| av福利在线导航| 国产99精品视频| av免费播放网址| 久久成人麻豆午夜电影| 一个人看的视频www| 91在线观看污| 蜜桃av.com| 性感美女极品91精品| 国产精品无码粉嫩小泬| 欧美一区二区女人| 日本护士...精品国| 中文字幕精品网| av在线不卡免费| 国产欧美一区二区三区久久人妖| 中文在线综合| 日韩精品久久一区二区三区| 欧美日韩国产色综合一二三四| 熟妇人妻va精品中文字幕| 国产在线播放一区三区四| 不卡一区二区在线观看| 亚洲男人天堂av网| 波多野结衣一区二区在线| 日韩欧美资源站| 国产视频三级在线观看播放| 久久久久久久久国产精品| 婷婷久久免费视频| 久久久神马电影| 国模 一区 二区 三区| 青青青在线视频免费观看| 成人网在线免费视频| 熟女少妇a性色生活片毛片| 色视频欧美一区二区三区| 亚洲精品第五页| 日韩亚洲国产中文字幕| 国产一区二区三区在线观看| 好看不卡的中文字幕| 欧美成人三级在线视频| 国产乱对白刺激视频不卡 | 亚洲男人的天堂在线aⅴ视频| 日本中文字幕久久| 亚洲精品国产精品国自产在线 | 精品国产精品久久一区免费式 | 日本色综合中文字幕| 中文字幕免费高清视频| 亚洲精品视频免费看| 中文字幕久久久久| 亚洲免费电影一区| www视频在线观看| 国产精品久久久久免费| 综合精品一区| 亚洲国产日韩在线一区| 一区精品在线播放| 怡春院在线视频| 一本大道久久加勒比香蕉| 裤袜国产欧美精品一区| 免费一区二区三区| 在线午夜精品| 三级黄色片网站| 香蕉久久一区二区不卡无毒影院 | 国产制服91一区二区三区制服| 精品一区二区成人精品| 免费看一级黄色| 欧美精品日韩精品| 国产精品刘玥久久一区| 91牛牛免费视频| 欧美一区二区| 亚洲熟妇一区二区| 亚洲成人av电影在线| 神马午夜一区二区| 97精品在线观看| 亚洲大片精品免费| 日韩毛片在线免费看| 欧美国产1区2区| 一级片视频免费| 萌白酱国产一区二区| 欧美一级大片在线视频| 黄色一级大片免费| 成人av网址在线| 日韩视频在线观看一区| 亚洲欧美成人在线| 欧美日韩激情电影| 中文字幕剧情在线观看一区| 国产一区二区福利| 日本少妇性高潮| 亚洲欧美国产制服动漫| 黄色精品视频| 这里只有精品在线播放| 亚洲一级片免费看| 免费不卡欧美自拍视频| 风间由美一区二区av101| a在线视频观看| 日本一区二区三级电影在线观看 | 色综合天天色| 国产四区在线观看| 成人国产精品免费| 国产一级片免费视频| 久久精品久久久久电影| 综合成人在线| 不要播放器的av网站| 国产精品乱码一区二三区小蝌蚪| 99热这里只有精品在线| 1769国内精品视频在线播放| 加勒比久久综合| 国产精品熟女一区二区不卡| 天天做天天摸天天爽国产一区| 酒色婷婷桃色成人免费av网| 国产一区二区香蕉| 在线高清一区| 欧美福利在线视频| 亚洲国产精品一区二区久| 电影亚洲精品噜噜在线观看 | 亚洲专区免费| 久久av红桃一区二区禁漫| 亚洲级视频在线观看免费1级| 99久久久国产精品免费调教网站| 日本道在线视频| 久久久久久久久久久久久久久99 | www.四虎成人| 中文字幕一区二区三区在线播放| 免费看国产片在线观看| 国产男人精品视频| 国产精品久久久久久久免费软件 |