做最最優(yōu)秀的視頻網(wǎng)站有哪些怎么發(fā)布信息到百度
面臨的問題
????????目前, 大數(shù)據(jù)計算引擎主要用 Java 或是基于 JVM 的編程語言實現(xiàn)的,例如 Apache Hadoop、 Apache Spark、 Apache Drill、 Apache Flink 等。 Java 語言的好處在于程序員不需要太關(guān)注底層內(nèi)存資源的管理,但同樣會面臨一個問題, 就是如何在內(nèi)存中存儲大量的數(shù)據(jù)(包括緩存和高效處理)。 Flink 使用自主的內(nèi)存管理,來避免這個問題。
JVM 內(nèi)存管理的不足
1) Java 對象存儲密度低。
Java 的對象在內(nèi)存中存儲包含 3 個主要部分:對象頭、實例數(shù)據(jù)、對齊填充部分。例如, 一個只包含 boolean 屬性的對象占 16byte:對象頭占 8byte,
boolean 屬性占 1byte, 為了對齊達到 8 的倍數(shù)額外占 7byte。而實際上只需要一個 bit(1/8
字節(jié))就夠了。
2) Full GC 會極大地影響性能。
尤其是為了處理更大數(shù)據(jù)而開了很大內(nèi)存空間的 JVM來說, GC 會達到秒級甚至分鐘級。
3) OOM 問題影響穩(wěn)定性。
OutOfMemoryError 是分布式計算框架經(jīng)常會遇到的問題,當(dāng)JVM中所有對象大小超過分配給JVM的內(nèi)存大小時,就會發(fā)生OutOfMemoryError錯誤,導(dǎo)致 JVM 崩潰,分布式框架的健壯性和性能都會受到影響。
4)緩存未命中問題。
CPU 進行計算的時候,是從 CPU 緩存中獲取數(shù)據(jù)。 現(xiàn)代體系的 CPU 會有多級緩存,而加載的時候是以 Cache Line 為單位加載。如果能夠?qū)ο筮B續(xù)存儲,這樣就會大大降低 Cache Miss。使得 CPU 集中處理業(yè)務(wù),而不是空轉(zhuǎn)。(Java 對象在堆上存儲的時候并不是連續(xù)的,所以從內(nèi)存中讀取 Java 對象時,緩存的鄰近的內(nèi)存區(qū)域的數(shù)據(jù)往往不是 CPU 下一步計算所需要的,這就是緩存未命中。 此時 CPU 需要空轉(zhuǎn)等待從內(nèi)存中重新讀取數(shù)據(jù)。)Flink 并不是將大量對象存在堆內(nèi)存上,而是將對象都序列化到一個預(yù)分配的內(nèi)存塊上,這個內(nèi)存塊叫做 MemorySegment,它代表了一段固定長度的內(nèi)存(默認大小為 32KB),也是 Flink 中最小的內(nèi)存分配單元,并且提供了非常高效的讀寫方法,很多運算可以直接操作二進制數(shù)據(jù),不需要反序列化即可執(zhí)行。每條記錄都會以序列化的形式存儲在一個或多個MemorySegment 中。 如果需要處理的數(shù)據(jù)多于可以保存在內(nèi)存中的數(shù)據(jù), Flink 的運算符會將部分數(shù)據(jù)溢出到磁盤。
JobManager內(nèi)存模型
TaskManager內(nèi)存模型
內(nèi)存結(jié)構(gòu)
內(nèi)存段
可以看出這種序列化方式存儲密度是相當(dāng)緊湊的。其中 int 占 4 字節(jié), double 占 8 字
節(jié), POJO 多個一個字節(jié)的 header, PojoSerializer 只負責(zé)將 header 序列化進去,并委托每個
字段對應(yīng)的 serializer 對字段進行序列化。
內(nèi)存頁
內(nèi)存頁是 MemorySegment 之上的數(shù)據(jù)訪問視圖, 數(shù)據(jù)讀取抽象為 DataInputView,
數(shù)據(jù)寫入抽象為 DataOutputView。使用時就無需關(guān)心 MemorySegment 的細節(jié),會自
動處理跨 MemorySegment 的讀取和寫入。
Buffer
Task 算子之間在網(wǎng)絡(luò)層面上傳輸數(shù)據(jù), 使用的是 Buffer, 申請和釋放由 Flink
自行管理, 實現(xiàn)類為 NetworkBuffer。 1 個 NetworkBuffer 包裝了 1 個
MemorySegment。 同時繼承了 AbstractReferenceCountedByteBuf, 是 Netty 中的抽
象類。?
網(wǎng)絡(luò)緩存
對照物理執(zhí)行計劃
IG:input gate
RS:結(jié)果分區(qū)