spark(三):blockManager、broadcast、cache、checkpoint

blockManager

spark(三):blockManager、broadcast、cache、checkpoint

10年積累的成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有安康免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

  1. Driver和executor上分別都會(huì)啟動(dòng)blockManager,其中driver上擁有所有executor上的blockManager的引用;所有executor上的blockManager都持有driver上的blockManager的引用;
  2. blockManagerSlave會(huì)不斷向blockManagerMaster發(fā)送心跳,更新block信息等;
  3. BlockManager對(duì)象被創(chuàng)建的時(shí)候會(huì)創(chuàng)建出MemoryStore和DiskStore對(duì)象用以存取block,如果內(nèi)存中擁有足夠的內(nèi)存, 就 使用 MemoryStore存儲(chǔ), 如果 不夠, 就 spill 到 磁盤中, 通過 DiskStore進(jìn)行存儲(chǔ)。
  4. DiskStore 有一個(gè)DiskBlockManager,DiskBlockManager 主要用來創(chuàng)建并持有邏輯 blocks 與磁盤上的 blocks之間的映射,一個(gè)邏輯 block 通過 BlockId 映射到一個(gè)磁盤上的文件。 在 DiskStore 中會(huì)調(diào)用 diskManager.getFile 方法, 如果子文件夾不存在,會(huì)進(jìn)行創(chuàng)建, 文件夾的命名方式為(spark-local-yyyyMMddHHmmss-xxxx, xxxx是一個(gè)隨機(jī)數(shù)), 所有的block都會(huì)存儲(chǔ)在所創(chuàng)建的folder里面。
  5. MemoryStore 相對(duì)于DiskStore需要根據(jù)block id hash計(jì)算出文件路徑并將block存放到對(duì)應(yīng)的文件里面,MemoryStore管理block就顯得非常簡單:MemoryStore內(nèi)部維護(hù)了一個(gè)hash map來管理所有的block,以block id為key將block存放到hash map中。而從MemoryStore中取得block則非常簡單,只需從hash map中取出block id對(duì)應(yīng)的value即可。
  6. GET操作 如果 local 中存在就直接返回, 從本地獲取一個(gè)Block, 會(huì)先判斷如果是 useMemory, 直接從內(nèi)存中取出, 如果是 useDisk, 會(huì)從磁盤中取出返回, 然后根據(jù)useMemory判斷是否在內(nèi)存中緩存一下,方便下次獲取, 如果local 不存在, 從其他節(jié)點(diǎn)上獲取, 當(dāng)然元信息是存在 drive上的,要根據(jù)我們上文中提到的 GETlocation 協(xié)議獲取 Block 所在節(jié)點(diǎn)位置, 然后到其他節(jié)點(diǎn)上獲取。
  7. PUT操作 操作之前會(huì)加鎖來避免多線程的問題, 存儲(chǔ)的時(shí)候會(huì)根據(jù) 存儲(chǔ)級(jí)別, 調(diào)用對(duì)應(yīng)的是 memoryStore 還是 diskStore, 然后在具體存儲(chǔ)器上面調(diào)用 存儲(chǔ)接口。 如果有 replication 需求, 會(huì)把數(shù)據(jù)備份到其他的機(jī)器上面。

cache、persist、checkpoint

  1. 如果要對(duì)一個(gè)RDD進(jìn)行持久化,只要對(duì)這個(gè)RDD調(diào)用cache()和persist()即可。
  2. cache()方法表示:使用非序列化的方式將RDD中的數(shù)據(jù)全部嘗試持久化到內(nèi)存中。
  3. persist()方法表示:手動(dòng)選擇持久化級(jí)別,并使用指定的方式進(jìn)行持久化。默認(rèn)緩存級(jí)別是StorageLevel.MEMORY_ONLY,也就是cache就是這個(gè)默認(rèn)級(jí)別的。
  4. checkpoint是將數(shù)據(jù)持久化到HDFS或者硬盤。
  5. rdd.persist(StorageLevel.DISK_ONLY) 與 checkpoint 也有區(qū)別。前者雖然可以將 RDD 的 partition 持久化到磁盤,但該 partition 由 blockManager 管理。一旦 driver program 執(zhí)行結(jié)束,也就是 executor 所在進(jìn)程 CoarseGrainedExecutorBackend stop,blockManager 也會(huì) stop,被 cache 到磁盤上的 RDD 也會(huì)被清空(整個(gè) blockManager 使用的 local 文件夾被刪除)。而 checkpoint 將 RDD 持久化到 HDFS 或本地文件夾,如果不被手動(dòng) remove 掉( 話說怎么 remove checkpoint 過的 RDD? ),是一直存在的,也就是說可以被下一個(gè) driver program 使用,而 cached RDD 不能被其他 dirver program 使用。

broadcast、accumulator

  1. 廣播變量允許程序員將一個(gè)只讀的變量緩存在每臺(tái)機(jī)器上,而不用在任務(wù)之間傳遞變量。(注意是一個(gè)較大的只讀變量,不能修改)
  2. Accumulator是spark提供的累加器,顧名思義,該變量只能夠增加。
  3. 只有driver能獲取到Accumulator的值(使用value方法),Task只能對(duì)其做增加操作(使用 +=)
  4. 使用累加器的過程中只能使用一次action的操作才能保證結(jié)果的準(zhǔn)確性。如果需要使用多次則使用cache或persist操作切斷依賴。

當(dāng)前題目:spark(三):blockManager、broadcast、cache、checkpoint
URL標(biāo)題:http://muchs.cn/article18/gessdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、營銷型網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、虛擬主機(jī)、網(wǎng)站導(dǎo)航、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化