<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          大數(shù)據(jù) | HDFS 元數(shù)據(jù)持久化筆記

          共 3115字,需瀏覽 7分鐘

           ·

          2021-11-29 08:28


          早期文章



          7a16955569649767e54c84c59539493a.webp


          一、HDFS 架構(gòu)簡單介紹

          ? ? ? ? HDFS 是一個(gè)主從(Master/Slaves)的架構(gòu),它由一個(gè) NameNode 和一些 DataNode 組成。其中,NameNode 是主,DataNode 是從。文件元數(shù)據(jù)由 NameNode 負(fù)責(zé)存儲(chǔ)和管理,且它維護(hù)了一個(gè)層次型的文件目錄樹;文件的數(shù)據(jù)由 DataNode 來按照 block 進(jìn)行存儲(chǔ),并按照 block?進(jìn)行讀寫。DataNode 與 NameNode 通過心跳來維持,DataNode 會(huì)向 NameNode 匯報(bào)自己持有的?block 信息。當(dāng)客戶端和 NameNode 交互文件元數(shù)據(jù),和 DataNode 交互 block 數(shù)據(jù)。


          二、角色功能

          ? ? ? ? 從 HDFS 的架構(gòu)來看,它包含兩個(gè)重要的角色,分別是 NameNode 和 DataNode。其中,NameNode 完全基于內(nèi)存存儲(chǔ)文件元數(shù)據(jù)、目錄結(jié)構(gòu)、文件 block 的映射,因此,它需要持久化方案來保證數(shù)據(jù)的可靠性;DataNode 基于磁盤存儲(chǔ) block,并保存了 block 的校驗(yàn),從而保證 block 的可靠性;DataNode 和 NameNode 之間通過心跳保持,并向 NameNode 匯報(bào) block 狀態(tài)。


          三、常用的持久化方案

          ? ? ? ? 很多基于內(nèi)存的存儲(chǔ),在使用持久化時(shí),持久化方案通常有幾種方案,包括日志文件、內(nèi)存 Dump 和?兩種的混合方式。先來說一下比較常用的緩存系統(tǒng) —— Redis。Redis 的持久化方式分為 AOF、RDB 和 混合方式。Redis 的 AOF 屬于日志記錄文件,它會(huì)記錄每條命令到文本文件中,RDB 屬于內(nèi)存 Dump 的方式,它會(huì)全量的保存內(nèi)存的信息,混合方式是 AOF 和 RDB 兩者共用的方式。(Redis 為了解決 AOF 體積的問題,提供了 AOF 重寫的命令)


          四、HDFS 元數(shù)據(jù)的持久化

          ? ? ? ? ?NameNode 基于內(nèi)存存儲(chǔ)文件元數(shù)據(jù)、目錄結(jié)構(gòu)、文件 block 的映射等信息,為了保障其可靠性,需要對(duì)其進(jìn)行持久化。日志文件的方式 和 內(nèi)存 Dump 都有其相應(yīng)的優(yōu)勢與劣勢,因此 HDFS 也使用了混合的方式。HDFS 同樣也同時(shí)使用了這兩種方式,其 日志記錄?方式被稱為 EditsLog,其內(nèi)存 Dump 方式被稱為 FsImage。因?yàn)?EditsLog 和 FsImage 也存在 日志記錄 和 內(nèi)存 Dump 的固有的缺點(diǎn),因此兩種方式都使用,來彌補(bǔ)對(duì)方的缺點(diǎn)。


          ? ? ? ? FsImage 嚴(yán)格來講算不上是一個(gè)?內(nèi)存 Dump,因?yàn)?FsImage 的創(chuàng)建是在部署完 HDFS 后格式化時(shí)生成的。在 NameNode 第一次啟動(dòng)時(shí)讀取的是一個(gè)空的 FsImage 文件(當(dāng)然,它可能有它的內(nèi)部結(jié)構(gòu),但是此時(shí)它不包含元數(shù)據(jù)等信息)。在之后的 NameNode 啟動(dòng)時(shí),會(huì)去讀 EditsLog 和 FsImage,此時(shí)會(huì)將所有的 EditsLog 中的記錄作用在內(nèi)存中的 FsImage 上,并將新版本的 FsImage 從內(nèi)存中保存到磁盤上,然后刪除舊的 EditsLog 文件。通過這種方式,HDFS 的內(nèi)存中就得到了上次關(guān)機(jī)時(shí)的全量數(shù)據(jù)。


          ? ? ? ? FsImage 需要滾動(dòng)更新,F(xiàn)sImage 的滾動(dòng)更新并非進(jìn)行 內(nèi)存 Dump,而是通過當(dāng)前 FsImage 文件和增量的 EditsLog 文件形成新的 FsImage 文件,然后將新的 FsImage 替換舊的 FsImage 文件。而增量的 EditsLog 文件則被刪除,重新記錄新的 EditsLog 文件。


          ? ? ? ? 注意:NameNode 持久化不包含每個(gè)文件的塊的位置,因?yàn)槲募K的位置由 DataNode 主動(dòng)進(jìn)行上報(bào)。


          五、Secondary NameNode 的引入

          ? ? ? ??由于滾動(dòng)更新 FsImage 文件,也是比較耗時(shí)耗力的原因,HDFS 給 NameNode 提供了一個(gè)秘書,即 Secondary NameNode。Secondary NameNode 并非是第二個(gè) NameNode,因?yàn)樗淮鎯?chǔ)元數(shù)據(jù),它的作用是完成 FsImage 和 EditsLog 的合并。通常 Secondary NameNode 和 NameNode 不在同一主機(jī)。Secondary NameNode 通過 http get 方式獲取 NameNode 主機(jī)上的 FsImage 和 EditsLog,合并后通過 http post 方式提交給 NameNode,從而生成新的 FsImage 文件。

          ? ? ? ??當(dāng) Secondary NameNode 將 EditsLog 拉取以后,NameNode 會(huì)將將新的日志記錄到新的 EditsLog 中。


          六、總結(jié)

          ? ? ? ? 學(xué)習(xí) HDFS 持久化時(shí),想到了 Redis 的持久化,因?yàn)楹芏嗉夹g(shù)的實(shí)現(xiàn)不同,但是它們在理論上幾乎是相同的,或者是變通的。這里通過類比的方式,感覺理解其他技術(shù)時(shí)就會(huì)容易一些。上面總結(jié)了 HDFS 的 主/從架構(gòu),即 NameNode 和 DataNode,其在 HA 模式下還有主備的概念,涉及到選主的一致性算法等知識(shí),之后再進(jìn)行整理,希望喜歡的讀者可以給點(diǎn)贊、關(guān)注!


          adcce2ca6cc364fb81ed0a1cbbcd1396.webp


          公眾號(hào)內(nèi)回復(fù)?【mongo】 下載 SpringBoot 整合操作 MongoDB 的文檔。


          ? ? ? ? 之前整理的關(guān)于 Redis 的文章:

          Redis | Redis 的安裝

          Redis | Redis 的幫助命令

          Redis | Redis 命令分類

          Redis | Redis 通用命令

          Redis | Redis 字符串相關(guān)命令

          Redis | Redis 列表相關(guān)命令

          Redis | Redis 集合相關(guān)命令

          Redis | Redis 有序集合相關(guān)命令

          Redis | Redis 哈希相關(guān)命令

          Redis | 源碼閱讀 —— 字符串

          Redis | 源碼閱讀 —— 鏈表

          Redis | Redis Pub/Sub相關(guān)命令

          Redis | 管道 —— PipeLine

          Redis | SpringBoot整合Redis

          Redis | Redis 的事務(wù)一

          Redis | Redis 的事務(wù)二

          Redis | 基礎(chǔ)數(shù)據(jù)類型應(yīng)用場景

          Redis | 事務(wù)源碼閱讀

          Redis | 事物源碼閱讀 —— watch

          Redis | 慢查詢

          Redis | 給接口添加緩存

          Redis | Redis 也會(huì)算距離


          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品人妻人人操 | 亚洲人人草 | 在线国产精品免费福利 | 小早川怜子爆乿护士在线观看 | 六月婷婷AV |