摘要:相反,款依賴需要所有父分區(qū)都是可用的。這是默認(rèn)的存儲(chǔ)級(jí)別。,迭代函數(shù)和計(jì)算函數(shù)是用來(lái)表示怎樣通過(guò)父計(jì)算得到的。迭代函數(shù)首先會(huì)判斷緩存中是否有想要計(jì)算的,如果有就直接讀取,如果沒(méi)有就查找想要計(jì)算的是否被檢查點(diǎn)處理過(guò)。
Spark 中最基本的數(shù)據(jù)抽象是 RDD。
RDD:彈性分布式數(shù)據(jù)集 (Resilient Distributed DataSet)。
1,RDD 有三個(gè)基本特性這三個(gè)特性分別為:分區(qū),不可變,并行操作。
每一個(gè) RDD 包含的數(shù)據(jù)被存儲(chǔ)在系統(tǒng)的不同節(jié)點(diǎn)上。邏輯上我們可以將 RDD 理解成一個(gè)大的數(shù)組,數(shù)組中的每個(gè)元素就代表一個(gè)分區(qū) (Partition) 。
在物理存儲(chǔ)中,每個(gè)分區(qū)指向一個(gè)存儲(chǔ)在內(nèi)存或者硬盤(pán)中的數(shù)據(jù)塊 (Block) ,其實(shí)這個(gè)數(shù)據(jù)塊就是每個(gè) task 計(jì)算出的數(shù)據(jù)塊,它們可以分布在不同的節(jié)點(diǎn)上。
所以,RDD 只是抽象意義的數(shù)據(jù)集合,分區(qū)內(nèi)部并不會(huì)存儲(chǔ)具體的數(shù)據(jù),只會(huì)存儲(chǔ)它在該 RDD 中的 index,通過(guò)該 RDD 的 ID 和分區(qū)的 index 可以唯一確定對(duì)應(yīng)數(shù)據(jù)塊的編號(hào),然后通過(guò)底層存儲(chǔ)層的接口提取到數(shù)據(jù)進(jìn)行處理。
在集群中,各個(gè)節(jié)點(diǎn)上的數(shù)據(jù)塊會(huì)盡可能的存儲(chǔ)在內(nèi)存中,只有當(dāng)內(nèi)存沒(méi)有空間時(shí)才會(huì)放入硬盤(pán)存儲(chǔ),這樣可以最大化的減少硬盤(pán) IO 的開(kāi)銷(xiāo)。
不可變性是指每個(gè) RDD 都是只讀的,它所包含的分區(qū)信息是不可變的。由于已有的 RDD 是不可變的,所以我們只有對(duì)現(xiàn)有的 RDD 進(jìn)行轉(zhuǎn)化 (Transformation) 操作,才能得到新的 RDD ,一步一步的計(jì)算出我們想要的結(jié)果。
這樣會(huì)帶來(lái)這樣的好處:我們?cè)?RDD 的計(jì)算過(guò)程中,不需要立刻去存儲(chǔ)計(jì)算出的數(shù)據(jù)本身,我們只要記錄每個(gè) RDD 是經(jīng)過(guò)哪些轉(zhuǎn)化操作得來(lái)的,即:依賴關(guān)系,這樣一方面可以提高計(jì)算效率,一方面是錯(cuò)誤恢復(fù)會(huì)更加容易。如果在計(jì)算過(guò)程中,第 N 步輸出的 RDD 的節(jié)點(diǎn)發(fā)生故障,數(shù)據(jù)丟失,那么可以根據(jù)依賴關(guān)系從第 N-1 步去重新計(jì)算出該 RDD,這也是 RDD 叫做**"彈性"**分布式數(shù)據(jù)集的一個(gè)原因。
因?yàn)?RDD 的分區(qū)特性,所以其天然支持并行處理的特性。即不同節(jié)點(diǎn)上的數(shù)據(jù)可以分別被處理,然后生成一個(gè)新的 RDD。
2,RDD 的結(jié)構(gòu)每個(gè) RDD 里都會(huì)包括分區(qū)信息、依賴關(guān)系等等的信息,如下圖所示:
Partitions 就是上面所說(shuō)的,代表著 RDD 中數(shù)據(jù)的邏輯結(jié)構(gòu),每個(gè) Partion 會(huì)映射到某個(gè)節(jié)點(diǎn)內(nèi)存或者硬盤(pán)的一個(gè)數(shù)據(jù)塊。
SparkContext 是所有 Spark 功能的入口,代表了與 Spark 節(jié)點(diǎn)的連接,可以用來(lái)創(chuàng)建 RDD 對(duì)象以及在節(jié)點(diǎn)中的廣播變量等等。一個(gè)線程只有一個(gè) SparkContext。
SparkConf 是一些配置信息。
Partitioner 決定了 RDD 的分區(qū)方式,目前兩種主流的分區(qū)方式:Hash partioner 和 Range partitioner。Hash 就是對(duì)數(shù)據(jù)的 Key 進(jìn)行散列分布,Rang 是按照 Key 的排序進(jìn)行的分區(qū)。也可以自定義 Partitioner。
Dependencies 也就是依賴關(guān)系,記錄了該 RDD 的計(jì)算過(guò)程,也就是說(shuō)這個(gè) RDD 是通過(guò)哪個(gè) RDD 經(jīng)過(guò)怎么樣的轉(zhuǎn)化操作得到的。
這里有個(gè)概念,根據(jù)每個(gè) RDD 的分區(qū)計(jì)算后生成的新的 RDD 的分區(qū)的對(duì)應(yīng)關(guān)系,可以分成窄依賴和寬依賴。
窄依賴就是父 RDD 的分區(qū)可以一一對(duì)應(yīng)到子 RDD 的分區(qū),寬依賴是說(shuō)父 RDD 的每個(gè)分區(qū)可以被多個(gè)子 RDD 分區(qū)使用。如圖:
由于窄依賴的特性,窄依賴允許子 RDD 的每個(gè)分區(qū)可以被并行處理產(chǎn)生,而且支持在同一個(gè)節(jié)點(diǎn)上鏈?zhǔn)綀?zhí)行多條指令,無(wú)需等待其它父 RDD 的分區(qū)操作。
Spark 區(qū)分寬窄依賴的原因主要有兩點(diǎn):
窄依賴支持在同一節(jié)點(diǎn)上進(jìn)行鏈?zhǔn)讲僮鳎热缭趫?zhí)行了 map 后,緊接著執(zhí)行 filter 操作。相反,款依賴需要所有父分區(qū)都是可用的。
從失敗恢復(fù)的角度考慮,窄依賴失敗恢復(fù)更有效,因?yàn)橹灰匦掠?jì)算丟失的父分區(qū)即可,而寬依賴涉及到 RDD 的各級(jí)多個(gè)父分區(qū)。
檢查點(diǎn)機(jī)制,在計(jì)算過(guò)程中有一些比較耗時(shí)的 RDD,我們可以將它緩存到硬盤(pán)或者 HDFS 中,標(biāo)記這個(gè) RDD 有被檢查點(diǎn)處理過(guò),并且清空它的所有依賴關(guān)系。同時(shí),給它新建一個(gè)依賴于 CheckpointRDD 的依賴關(guān)系,CheckpintRDD 可以用來(lái)從 硬盤(pán)中讀取 RDD 和生成新的分區(qū)信息。
這么做之后,當(dāng)某個(gè) RDD 需要錯(cuò)誤恢復(fù)時(shí),回溯到該 RDD,發(fā)現(xiàn)它被檢查點(diǎn)記錄過(guò),就可以直接去硬盤(pán)讀取該 RDD,無(wú)需重新計(jì)算。
針對(duì)每一個(gè)分片,都會(huì)選擇一個(gè)最優(yōu)的位置來(lái)計(jì)算,數(shù)據(jù)不動(dòng),代碼動(dòng)。
用來(lái)記錄 RDD 持久化時(shí)存儲(chǔ)的級(jí)別,常用的有:
MEMORY_ONLY:只存在緩存中,如果內(nèi)存不夠,則不緩存剩余的部分。這是 RDD 默認(rèn)的存儲(chǔ)級(jí)別。
MEMORY_AND_DISK:緩存在內(nèi)存中,不夠則緩存至內(nèi)存。
DISK_ONLY:只存硬盤(pán)。
MEMORY_ONLY_2 和 MEMORY_AND_DISK_2等:與上面的級(jí)別和功能相同,只不過(guò)每個(gè)分區(qū)在集群兩個(gè)節(jié)點(diǎn)上建立副本。
迭代函數(shù)和計(jì)算函數(shù)是用來(lái)表示 RDD 怎樣通過(guò)父 RDD 計(jì)算得到的。
迭代函數(shù)首先會(huì)判斷緩存中是否有想要計(jì)算的 RDD,如果有就直接讀取,如果沒(méi)有就查找想要計(jì)算的 RDD 是否被檢查點(diǎn)處理過(guò)。如果有,就直接讀取,如果沒(méi)有,就調(diào)用計(jì)算函數(shù)向上遞歸,查找父 RDD 進(jìn)行計(jì)算。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/7189.html
摘要:是設(shè)計(jì)用來(lái)表示數(shù)據(jù)集的一種數(shù)據(jù)結(jié)構(gòu)。而正因?yàn)闈M足了這么多特性,所以把叫做,中文叫做彈性分布式數(shù)據(jù)集。按照這篇論文中文譯文的解釋,窄依賴是指子的每個(gè)分區(qū)依賴于常數(shù)個(gè)父分區(qū)即與數(shù)據(jù)規(guī)模無(wú)關(guān)寬依賴指子的每個(gè)分區(qū)依賴于所有父分區(qū)。 原文鏈接 寫(xiě)在前面 本系列是綜合了自己在學(xué)習(xí)spark過(guò)程中的理解記錄 + 對(duì)參考文章中的一些理解 + 個(gè)人實(shí)踐spark過(guò)程中的一些心得而來(lái)。寫(xiě)這樣一個(gè)系列僅僅是...
摘要:原文基本概念解析寫(xiě)在前面本系列是綜合了自己在學(xué)習(xí)過(guò)程中的理解記錄對(duì)參考文章中的一些理解個(gè)人實(shí)踐過(guò)程中的一些心得而來(lái)。是項(xiàng)目組設(shè)計(jì)用來(lái)表示數(shù)據(jù)集的一種數(shù)據(jù)結(jié)構(gòu)。 原文:『 Spark 』2. spark 基本概念解析 寫(xiě)在前面 本系列是綜合了自己在學(xué)習(xí)spark過(guò)程中的理解記錄 + 對(duì)參考文章中的一些理解 + 個(gè)人實(shí)踐spark過(guò)程中的一些心得而來(lái)。寫(xiě)這樣一個(gè)系列僅僅是為了梳理個(gè)人學(xué)習(xí)...
閱讀 3392·2021-09-22 15:17
閱讀 2740·2021-09-02 15:15
閱讀 1750·2019-08-30 15:54
閱讀 2001·2019-08-30 14:02
閱讀 2529·2019-08-29 16:58
閱讀 2988·2019-08-29 16:08
閱讀 1330·2019-08-26 12:24
閱讀 1653·2019-08-26 10:41