亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

什么是 RDD ?

yanest / 1294人閱讀

摘要:相反,款依賴需要所有父分區(qū)都是可用的。這是默認的存儲級別。,迭代函數(shù)和計算函數(shù)是用來表示怎樣通過父計算得到的。迭代函數(shù)首先會判斷緩存中是否有想要計算的,如果有就直接讀取,如果沒有就查找想要計算的是否被檢查點處理過。

Spark 中最基本的數(shù)據(jù)抽象是 RDD。

RDD:彈性分布式數(shù)據(jù)集 (Resilient Distributed DataSet)。

1,RDD 有三個基本特性

這三個特性分別為:分區(qū),不可變,并行操作。

a, 分區(qū)

每一個 RDD 包含的數(shù)據(jù)被存儲在系統(tǒng)的不同節(jié)點上。邏輯上我們可以將 RDD 理解成一個大的數(shù)組,數(shù)組中的每個元素就代表一個分區(qū) (Partition) 。

在物理存儲中,每個分區(qū)指向一個存儲在內(nèi)存或者硬盤中的數(shù)據(jù)塊 (Block) ,其實這個數(shù)據(jù)塊就是每個 task 計算出的數(shù)據(jù)塊,它們可以分布在不同的節(jié)點上。

所以,RDD 只是抽象意義的數(shù)據(jù)集合,分區(qū)內(nèi)部并不會存儲具體的數(shù)據(jù),只會存儲它在該 RDD 中的 index,通過該 RDD 的 ID 和分區(qū)的 index 可以唯一確定對應數(shù)據(jù)塊的編號,然后通過底層存儲層的接口提取到數(shù)據(jù)進行處理。

在集群中,各個節(jié)點上的數(shù)據(jù)塊會盡可能的存儲在內(nèi)存中,只有當內(nèi)存沒有空間時才會放入硬盤存儲,這樣可以最大化的減少硬盤 IO 的開銷。

b,不可變

不可變性是指每個 RDD 都是只讀的,它所包含的分區(qū)信息是不可變的。由于已有的 RDD 是不可變的,所以我們只有對現(xiàn)有的 RDD 進行轉(zhuǎn)化 (Transformation) 操作,才能得到新的 RDD ,一步一步的計算出我們想要的結(jié)果。

這樣會帶來這樣的好處:我們在 RDD 的計算過程中,不需要立刻去存儲計算出的數(shù)據(jù)本身,我們只要記錄每個 RDD 是經(jīng)過哪些轉(zhuǎn)化操作得來的,即:依賴關系,這樣一方面可以提高計算效率,一方面是錯誤恢復會更加容易。如果在計算過程中,第 N 步輸出的 RDD 的節(jié)點發(fā)生故障,數(shù)據(jù)丟失,那么可以根據(jù)依賴關系從第 N-1 步去重新計算出該 RDD,這也是 RDD 叫做**"彈性"**分布式數(shù)據(jù)集的一個原因。

c,并行操作

因為 RDD 的分區(qū)特性,所以其天然支持并行處理的特性。即不同節(jié)點上的數(shù)據(jù)可以分別被處理,然后生成一個新的 RDD。

2,RDD 的結(jié)構

每個 RDD 里都會包括分區(qū)信息、依賴關系等等的信息,如下圖所示:

a,Partitions

Partitions 就是上面所說的,代表著 RDD 中數(shù)據(jù)的邏輯結(jié)構,每個 Partion 會映射到某個節(jié)點內(nèi)存或者硬盤的一個數(shù)據(jù)塊。

b,SparkContext

SparkContext 是所有 Spark 功能的入口,代表了與 Spark 節(jié)點的連接,可以用來創(chuàng)建 RDD 對象以及在節(jié)點中的廣播變量等等。一個線程只有一個 SparkContext。

c,SparkConf

SparkConf 是一些配置信息。

d,Partitioner

Partitioner 決定了 RDD 的分區(qū)方式,目前兩種主流的分區(qū)方式:Hash partioner 和 Range partitioner。Hash 就是對數(shù)據(jù)的 Key 進行散列分布,Rang 是按照 Key 的排序進行的分區(qū)。也可以自定義 Partitioner。

e,Dependencies

Dependencies 也就是依賴關系,記錄了該 RDD 的計算過程,也就是說這個 RDD 是通過哪個 RDD 經(jīng)過怎么樣的轉(zhuǎn)化操作得到的。

這里有個概念,根據(jù)每個 RDD 的分區(qū)計算后生成的新的 RDD 的分區(qū)的對應關系,可以分成窄依賴和寬依賴。

窄依賴就是父 RDD 的分區(qū)可以一一對應到子 RDD 的分區(qū),寬依賴是說父 RDD 的每個分區(qū)可以被多個子 RDD 分區(qū)使用。如圖:

由于窄依賴的特性,窄依賴允許子 RDD 的每個分區(qū)可以被并行處理產(chǎn)生,而且支持在同一個節(jié)點上鏈式執(zhí)行多條指令,無需等待其它父 RDD 的分區(qū)操作。

Spark 區(qū)分寬窄依賴的原因主要有兩點:

    窄依賴支持在同一節(jié)點上進行鏈式操作,比如在執(zhí)行了 map 后,緊接著執(zhí)行 filter 操作。相反,款依賴需要所有父分區(qū)都是可用的。

    從失敗恢復的角度考慮,窄依賴失敗恢復更有效,因為只要重新計算丟失的父分區(qū)即可,而寬依賴涉及到 RDD 的各級多個父分區(qū)。

f,Checkpoint

檢查點機制,在計算過程中有一些比較耗時的 RDD,我們可以將它緩存到硬盤或者 HDFS 中,標記這個 RDD 有被檢查點處理過,并且清空它的所有依賴關系。同時,給它新建一個依賴于 CheckpointRDD 的依賴關系,CheckpintRDD 可以用來從 硬盤中讀取 RDD 和生成新的分區(qū)信息。

這么做之后,當某個 RDD 需要錯誤恢復時,回溯到該 RDD,發(fā)現(xiàn)它被檢查點記錄過,就可以直接去硬盤讀取該 RDD,無需重新計算。

g,Preferred Location

針對每一個分片,都會選擇一個最優(yōu)的位置來計算,數(shù)據(jù)不動,代碼動。

h,Storage Level

用來記錄 RDD 持久化時存儲的級別,常用的有:

    MEMORY_ONLY:只存在緩存中,如果內(nèi)存不夠,則不緩存剩余的部分。這是 RDD 默認的存儲級別。

    MEMORY_AND_DISK:緩存在內(nèi)存中,不夠則緩存至內(nèi)存。

    DISK_ONLY:只存硬盤。

    MEMORY_ONLY_2 和 MEMORY_AND_DISK_2等:與上面的級別和功能相同,只不過每個分區(qū)在集群兩個節(jié)點上建立副本。

i,Iterator

迭代函數(shù)和計算函數(shù)是用來表示 RDD 怎樣通過父 RDD 計算得到的。

迭代函數(shù)首先會判斷緩存中是否有想要計算的 RDD,如果有就直接讀取,如果沒有就查找想要計算的 RDD 是否被檢查點處理過。如果有,就直接讀取,如果沒有,就調(diào)用計算函數(shù)向上遞歸,查找父 RDD 進行計算。

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/7189.html

Failed to recv the data from server completely (SIZE:0/8, REASON:closed)