<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    Hadoop分布式文件系統:架構和設計要點

    Posted on 2008-06-05 14:29 dennis 閱讀(53373) 評論(25)  編輯  收藏 所屬分類: 模式與架構 、java 、my open-sourceHadoop與分布式

    Hadoop分布式文件系統:架構和設計要點
    原文:http://hadoop.apache.org/core/docs/current/hdfs_design.html
    一、前提和設計目標
    1、硬件錯誤是常態,而非異常情況,HDFS可能是有成百上千的server組成,任何一個組件都有可能一直失效,因此錯誤檢測和快速、自動的恢復是HDFS的核心架構目標。
    2、跑在HDFS上的應用與一般的應用不同,它們主要是以流式讀為主,做批量處理;比之關注數據訪問的低延遲問題,更關鍵的在于數據訪問的高吞吐量。
    3、HDFS以支持大數據集合為目標,一個存儲在上面的典型文件大小一般都在千兆至T字節,一個單一HDFS實例應該能支撐數以千萬計的文件。
    4HDFS應用對文件要求的是write-one-read-many訪問模型。一個文件經過創建、寫,關閉之后就不需要改變。這一假設簡化了數據一致性問 題,使高吞吐量的數據訪問成為可能。典型的如MapReduce框架,或者一個web crawler應用都很適合這個模型。
    5、移動計算的代價比之移動數據的代價低。一個應用請求的計算,離它操作的數據越近就越高效,這在數據達到海量級別的時候更是如此。將計算移動到數據附近,比之將數據移動到應用所在顯然更好,HDFS提供給應用這樣的接口。
    6、在異構的軟硬件平臺間的可移植性。

    二、NamenodeDatanode
        HDFS采用master/slave架構。一個HDFS集群是有一個Namenode和一定數目的Datanode組成。Namenode是一個中心服 務器,負責管理文件系統的namespace和客戶端對文件的訪問。Datanode在集群中一般是一個節點一個,負責管理節點上它們附帶的存儲。在內 部,一個文件其實分成一個或多個block,這些block存儲在Datanode集合里。Namenode執行文件系統的namespace操作,例如 打開、關閉、重命名文件和目錄,同時決定block到具體Datanode節點的映射。DatanodeNamenode的指揮下進行block的創 建、刪除和復制。NamenodeDatanode都是設計成可以跑在普通的廉價的運行linux的機器上。HDFS采用java語言開發,因此可以部 署在很大范圍的機器上。一個典型的部署場景是一臺機器跑一個單獨的Namenode節點,集群中的其他機器各跑一個Datanode實例。這個架構并不排 除一臺機器上跑多個Datanode,不過這比較少見。

    單一節點的Namenode大大簡化了系統的架構。Namenode負責保管和管理所有的HDFS元數據,因而用戶數據就不需要通過Namenode(也就是說文件數據的讀寫是直接在Datanode上)。

    三、文件系統的namespace
       HDFS支持傳統的層次型文件組織,與大多數其他文件系統類似,用戶可以創建目錄,并在其間創建、刪除、移動和重命名文件。HDFS不支持user quotas和訪問權限,也不支持鏈接(link),不過當前的架構并不排除實現這些特性。Namenode維護文件系統的namespace,任何對文 件系統namespace和文件屬性的修改都將被Namenode記錄下來。應用可以設置HDFS保存的文件的副本數目,文件副本的數目稱為文件的 replication因子,這個信息也是由Namenode保存。

    四、數據復制
        HDFS被設計成在一個大集群中可以跨機器地可靠地存儲海量的文件。它將每個文件存儲成block序列,除了最后一個block,所有的block都是同 樣的大小。文件的所有block為了容錯都會被復制。每個文件的block大小和replication因子都是可配置的。Replication因子可 以在文件創建的時候配置,以后也可以改變。HDFS中的文件是write-one,并且嚴格要求在任何時候只有一個writer。Namenode全權管 理block的復制,它周期性地從集群中的每個Datanode接收心跳包和一個Blockreport。心跳包的接收表示該Datanode節點正常工 作,而Blockreport包括了該Datanode上所有的block組成的列表。


    1、副本的存放,副本的存放是HDFS可靠性和性能的關鍵。HDFS采用一種稱為rack-aware的策略來改進數據的可靠性、有效性和網絡帶寬的利 用。這個策略實現的短期目標是驗證在生產環境下的表現,觀察它的行為,構建測試和研究的基礎,以便實現更先進的策略。龐大的HDFS實例一般運行在多個機 架的計算機形成的集群上,不同機架間的兩臺機器的通訊需要通過交換機,顯然通常情況下,同一個機架內的兩個節點間的帶寬會比不同機架間的兩臺機器的帶寬 大。
        通過一個稱為Rack Awareness的過程,Namenode決定了每個Datanode所屬的rack id。一個簡單但沒有優化的策略就是將副本存放在單獨的機架上。這樣可以防止整個機架(非副本存放)失效的情況,并且允許讀數據的時候可以從多個機架讀 取。這個簡單策略設置可以將副本分布在集群中,有利于組件失敗情況下的負載均衡。但是,這個簡單策略加大了寫的代價,因為一個寫操作需要傳輸block到 多個機架。
        在大多數情況下,replication因子是3HDFS的存放策略是將一個副本存放在本地機架上的節點,一個副本放在同一機架上的另一個節點,最后一 個副本放在不同機架上的一個節點。機架的錯誤遠遠比節點的錯誤少,這個策略不會影響到數據的可靠性和有效性。三分之一的副本在一個節點上,三分之二在一個 機架上,其他保存在剩下的機架中,這一策略改進了寫的性能。

    2、副本的選擇,為了降低整體的帶寬消耗和讀延時,HDFS會盡量讓reader讀最近的副本。如果在reader的同一個機架上有一個副本,那么就讀該副本。如果一個HDFS集群跨越多個數據中心,那么reader也將首先嘗試讀本地數據中心的副本。

    3SafeMode
        Namenode啟動后會進入一個稱為SafeMode的特殊狀態,處在這個狀態的Namenode是不會進行數據塊的復制的。Namenode從所有的 Datanode接收心跳包和BlockreportBlockreport包括了某個Datanode所有的數據塊列表。每個block都有指定的最 小數目的副本。當Namenode檢測確認某個Datanode的數據塊副本的最小數目,那么該Datanode就會被認為是安全的;如果一定百分比(這 個參數可配置)的數據塊檢測確認是安全的,那么Namenode將退出SafeMode狀態,接下來它會確定還有哪些數據塊的副本沒有達到指定數目,并將 這些block復制到其他Datanode

    五、文件系統元數據的持久化
        Namenode存儲HDFS的元數據。對于任何對文件元數據產生修改的操作,Namenode都使用一個稱為Editlog的事務日志記錄下來。例如, 在HDFS中創建一個文件,Namenode就會在Editlog中插入一條記錄來表示;同樣,修改文件的replication因子也將往 Editlog插入一條記錄。Namenode在本地OS的文件系統中存儲這個Editlog。整個文件系統的namespace,包括block到文件 的映射、文件的屬性,都存儲在稱為FsImage的文件中,這個文件也是放在Namenode所在系統的文件系統上。
        Namenode在內存中保存著整個文件系統namespace和文件Blockmap的映像。這個關鍵的元數據設計得很緊湊,因而一個帶有4G內存的 Namenode足夠支撐海量的文件和目錄。當Namenode啟動時,它從硬盤中讀取EditlogFsImage,將所有Editlog中的事務作 用(apply)在內存中的FsImage ,并將這個新版本的FsImage從內存中flush到硬盤上,然后再truncate這個舊的Editlog,因為這個舊的Editlog的事務都已經 作用在FsImage上了。這個過程稱為checkpoint。在當前實現中,checkpoint只發生在Namenode啟動時,在不久的將來我們將 實現支持周期性的checkpoint。
        Datanode并不知道關于文件的任何東西,除了將文件中的數據保存在本地的文件系統上。它把每個HDFS數據塊存儲在本地文件系統上隔離的文件中。 Datanode并不在同一個目錄創建所有的文件,相反,它用啟發式地方法來確定每個目錄的最佳文件數目,并且在適當的時候創建子目錄。在同一個目錄創建 所有的文件不是最優的選擇,因為本地文件系統可能無法高效地在單一目錄中支持大量的文件。當一個Datanode啟動時,它掃描本地文件系統,對這些本地 文件產生相應的一個所有HDFS數據塊的列表,然后發送報告到Namenode,這個報告就是Blockreport

    六、通訊協議
        所有的HDFS通訊協議都是構建在TCP/IP協議上。客戶端通過一個可配置的端口連接到Namenode,通過ClientProtocolNamenode交互。而Datanode是使用DatanodeProtocolNamenode交互。從ClientProtocolDatanodeprotocol抽象出一個遠程調用(RPC),在設計上,Namenode不會主動發起RPC,而是是響應來自客戶端和 Datanode RPC請求。

    七、健壯性
        HDFS的主要目標就是實現在失敗情況下的數據存儲可靠性。常見的三種失敗:Namenode failures, Datanode failures和網絡分割(network partitions)。
    1、硬盤數據錯誤、心跳檢測和重新復制
        每個Datanode節點都向Namenode周期性地發送心跳包。網絡切割可能導致一部分DatanodeNamenode失去聯系。 Namenode通過心跳包的缺失檢測到這一情況,并將這些Datanode標記為dead,不會將新的IO請求發給它們。寄存在dead Datanode上的任何數據將不再有效。Datanode的死亡可能引起一些block的副本數目低于指定值,Namenode不斷地跟蹤需要復制的 block,在任何需要的情況下啟動復制。在下列情況可能需要重新復制:某個Datanode節點失效,某個副本遭到損壞,Datanode上的硬盤錯 誤,或者文件的replication因子增大。

    2、集群均衡
       HDFS支持數據的均衡計劃,如果某個Datanode節點上的空閑空間低于特定的臨界點,那么就會啟動一個計劃自動地將數據從一個Datanode搬移 到空閑的Datanode。當對某個文件的請求突然增加,那么也可能啟動一個計劃創建該文件新的副本,并分布到集群中以滿足應用的要求。這些均衡計劃目前 還沒有實現。

    3、數據完整性
      從某個Datanode獲取的數據塊有可能是損壞的,這個損壞可能是由于Datanode的存儲設備錯誤、網絡錯誤或者軟件bug造成的。HDFS客戶端 軟件實現了HDFS文件內容的校驗和。當某個客戶端創建一個新的HDFS文件,會計算這個文件每個block的校驗和,并作為一個單獨的隱藏文件保存這些 校驗和在同一個HDFS namespace下。當客戶端檢索文件內容,它會確認從Datanode獲取的數據跟相應的校驗和文件中的校驗和是否匹配,如果不匹配,客戶端可以選擇 從其他Datanode獲取該block的副本。

    4、元數據磁盤錯誤
        FsImageEditlogHDFS的核心數據結構。這些文件如果損壞了,整個HDFS實例都將失效。因而,Namenode可以配置成支持維護多 個FsImageEditlog的拷貝。任何對FsImage或者Editlog的修改,都將同步到它們的副本上。這個同步操作可能會降低 Namenode每秒能支持處理的namespace事務。這個代價是可以接受的,因為HDFS是數據密集的,而非元數據密集。當Namenode重啟的 時候,它總是選取最近的一致的FsImageEditlog使用。
       NamenodeHDFS是單點存在,如果Namenode所在的機器錯誤,手工的干預是必須的。目前,在另一臺機器上重啟因故障而停止服務的Namenode這個功能還沒實現。

    5、快照
       快照支持某個時間的數據拷貝,當HDFS數據損壞的時候,可以恢復到過去一個已知正確的時間點。HDFS目前還不支持快照功能。

    八、數據組織
    1、數據塊
        兼容HDFS的應用都是處理大數據集合的。這些應用都是寫數據一次,讀卻是一次到多次,并且讀的速度要滿足流式讀。HDFS支持文件的write- once-read-many語義。一個典型的block大小是64MB,因而,文件總是按照64M切分成chunk,每個chunk存儲于不同的 Datanode
    2、步驟
        某個客戶端創建文件的請求其實并沒有立即發給Namenode,事實上,HDFS客戶端會將文件數據緩存到本地的一個臨時文件。應用的寫被透明地重定向到 這個臨時文件。當這個臨時文件累積的數據超過一個block的大?。J64M),客戶端才會聯系NamenodeNamenode將文件名插入文件系 統的層次結構中,并且分配一個數據塊給它,然后返回Datanode的標識符和目標數據塊給客戶端??蛻舳藢⒈镜嘏R時文件flush到指定的 Datanode上。當文件關閉時,在臨時文件中剩余的沒有flush的數據也會傳輸到指定的Datanode,然后客戶端告訴Namenode文件已經 關閉。此時Namenode才將文件創建操作提交到持久存儲。如果Namenode在文件關閉前掛了,該文件將丟失。
       上述方法是對通過對HDFS上運行的目標應用認真考慮的結果。如果不采用客戶端緩存,由于網絡速度和網絡堵塞會對吞估量造成比較大的影響。

    3、流水線復制
        當某個客戶端向HDFS文件寫數據的時候,一開始是寫入本地臨時文件,假設該文件的replication因子設置為3,那么客戶端會從Namenode 獲取一張Datanode列表來存放副本。然后客戶端開始向第一個Datanode傳輸數據,第一個Datanode一小部分一小部分(4kb)地接收數 據,將每個部分寫入本地倉庫,并且同時傳輸該部分到第二個Datanode節點。第二個Datanode也是這樣,邊收邊傳,一小部分一小部分地收,存儲 在本地倉庫,同時傳給第三個Datanode,第三個Datanode就僅僅是接收并存儲了。這就是流水線式的復制。

    九、可訪問性
        HDFS給應用提供了多種訪問方式,可以通過DFSShell通過命令行與HDFS數據進行交互,可以通過java API調用,也可以通過C語言的封裝API訪問,并且提供了瀏覽器訪問的方式。正在開發通過WebDav協議訪問的方式。具體使用參考文檔。
    十、空間的回收
    1、文件的刪除和恢復
        用戶或者應用刪除某個文件,這個文件并沒有立刻從HDFS中刪除。相反,HDFS將這個文件重命名,并轉移到/trash目錄。當文件還在/trash目 錄時,該文件可以被迅速地恢復。文件在/trash中保存的時間是可配置的,當超過這個時間,Namenode就會將該文件從namespace中刪除。 文件的刪除,也將釋放關聯該文件的數據塊。注意到,在文件被用戶刪除和HDFS空閑空間的增加之間會有一個等待時間延遲。
        當被刪除的文件還保留在/trash目錄中的時候,如果用戶想恢復這個文件,可以檢索瀏覽/trash目錄并檢索該文件。/trash目錄僅僅保存被刪除 文件的最近一次拷貝。/trash目錄與其他文件目錄沒有什么不同,除了一點:HDFS在該目錄上應用了一個特殊的策略來自動刪除文件,目前的默認策略是 刪除保留超過6小時的文件,這個策略以后會定義成可配置的接口。

    2Replication因子的減小
        當某個文件的replication因子減小,Namenode會選擇要刪除的過剩的副本。下次心跳檢測就將該信息傳遞給Datanode, Datanode就會移除相應的block并釋放空間,同樣,在調用setReplication方法和集群中的空閑空間增加之間會有一個時間延遲。

    參考資料:
    HDFS Java API: http://hadoop.apache.org/core/docs/current/api/
    HDFS source code: http://hadoop.apache.org/core/version_control.html
       








    評論

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-06-05 16:58 by qiaohui.zhang
    文章不錯,繼續關注。。。

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-06-05 17:06 by qiaohui.zhang
    不過貌似是轉貼,嘎嘎

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-06-05 17:18 by dennis
    @qiaohui.zhang
    不好意思,這絕對是我翻譯的。我發在javaeye,同時這里是我的blog,如果轉帖請說明出處。

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-06-05 17:46 by hi
    @dennis
    呵呵,我也翻譯過一次。。。。。。

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-06-05 18:01 by dennis
    @hi
    呵呵,我在網上沒有看到這篇文章的翻譯,想想就自己翻出來看看,對感興趣的人可能有點用處。比較無語的是,轉載的也不注明出處啊,http://blog.csdn.net/onlyzhangqin/archive/2008/06/05/2514053.aspx

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-06-17 14:12 by dennis
    @Jack.Wang
    沒有注明出處是我的錯,直接從google doc里拷出來的,補上。至于俺有沒有思想,就不勞您費心。

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-06-17 14:27 by Jack.Wang
    @dennis
    呵呵,測試一下你的情商,哈哈!莫激動!

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-06-17 20:23 by dennis
    @Jack.Wang
    呵呵,你的評論刪了?干的不賴,自己噴的又自己吞回去了。過去我認為你是態度有問題,現在我肯定你是人品問題。

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-06-17 22:28 by Jack.Wang
    @dennis
    兄弟這樣搞就不好了吧! 怎么也是博友??! 呵呵,發現你在 java 方面很強,有機會向你學習學習啊! 多發些好文章!最近學習中間件遇到好多問題,也看了下 JVM 資料,對他不是特別了解,也希望你能指導一下,不知道你的聯系方式是多少! 我的 QQ 11843121! 期望和你交個朋友! 性格方面我也在努力改正!謝謝!可能我太傲慢了!

    你在我的 blog 里評的可能很多人都不是特別理解
    http://www.tkk7.com/Jack2007/archive/2008/05/21/202018.html
    在我的理解中也不是這樣的,可能我真的要看些書了!呵呵!多指教!

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-08-05 12:05 by happy_fish
    試試純C語言編寫的開源分布式文件系統FastDFS吧,它比較輕量級,目前已提供Java Client API及文檔,詳情請參閱:http://www.csource.org/

    google code下載地址:http://code.google.com/p/fastdfs/downloads/list

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-10-16 21:39 by Mac
    “兼容HDFS的應用都是處理大數據集合的。這些應用都是寫數據一次,讀卻是一次到多次,并且讀的速度要滿足流式讀。HDFS支持文件的write- once-read-many語義?!?br>
    如果多次寫就不行嗎?很想用到實際的應用系統中,譬如連鎖超市的海量數據中,有些資料是要多次修改的。我可能還是沒能理解好。

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2008-11-27 15:38 by David Cai
    我轉走了, 看了幾遍英文的,想翻一翻,這里有了,就不動手了。
    可以到我的站站去看看, 有一些Hadoop, Lucene, Nutch的程序閱讀筆記。
    http://feedsky.51vip.biz

    # re: Hadoop分布式文件系統:架構和設計要點[未登錄]  回復  更多評論   

    2009-02-28 00:21 by c
    這就是我告訴你的那個

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2009-03-01 11:12 by chuanhui
    @Mac
    Google原生的GFS是支持多次寫的(Overwrite),不過這個效率太差,互聯網公司也很少有這種需求,所以Hadoop干脆就不支持了

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2009-03-01 11:15 by chuanhui
    @Mac
    另外,雖然Hadoop只支持追加操作,你說的寫多次的需求也是可以實現的。有一種基于操作日志的追求高吞吐量做法。

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2009-03-12 13:49 by hadoop
    歡迎大家到http://cn.hadoop.org討論,研究這方面的人太少了

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2009-03-12 13:50 by hadoop
    歡迎大家到http://cn.hadoop.org/
    討論

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2009-04-07 19:04 by hadoop
    這里有一個hadoop優化方法的,感覺不錯
    http://thethethethethethe.spaces.live.com/blog/cns!A001241972EA08EA!228.entry

    作者對hadoop的架構和設計要點應該也有不少了解。

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2009-12-30 22:11 by hadoop
    這篇是非常經典的Hadoop入門讀物,強烈推薦收藏,另歡迎加入Hadoop技術論壇交流:
    http://bbs.hadoopor.com
    http://www.hadoopor.com

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2010-01-07 11:50 by hadoop
    @hadoop
    歡迎更多的Hadoop愛好者加入Hadoop技術論壇交流,為方便大家,新增幾個域名:
    http://hadoop.hadoopor.com
    http://hdfs.hadoopor.com
    http://mapreduce.hadoopor.com
    http://hive.hadoopor.com
    http://bigtable.hadoopor.com

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2010-01-09 22:50 by SEO
    thanks

    # re: Hadoop分布式文件系統:架構和設計要點[未登錄]  回復  更多評論   

    2011-01-27 13:31 by Spark
    各位研究hadoop的大蝦們,我這邊需要一些hadoop及酷愛其他語言研發的高級人選。如果有意愿的請與我聯系:sparkforyou@126.com,msn:Toby-careful@hotmail.com。另外,自知在此討論這個話題不當,但確實需要各位大蝦的幫忙。博主如覺得實在不妥,請予以刪除!再次感謝各位!

    # re: Hadoop分布式文件系統:架構和設計要點[未登錄]  回復  更多評論   

    2011-05-25 20:52 by LIFE
    樓主辛苦,支持原創翻譯,致敬!

    # re: Hadoop分布式文件系統:架構和設計要點  回復  更多評論   

    2012-08-09 10:40 by 希洛
    翻譯的真好,很不錯

    # re: Hadoop分布式文件系統:架構和設計要點[未登錄]  回復  更多評論   

    2012-11-01 18:25 by
    你好,我們需要一位非常了解hadoop的工程師,如果方便,請聯系我QQ63584404 請注明hadoop工程師
    主站蜘蛛池模板: 日韩吃奶摸下AA片免费观看| 国产免费无遮挡精品视频 | 亚洲资源在线观看| 成年免费大片黄在线观看岛国 | 99久热只有精品视频免费看| 亚洲一级特黄特黄的大片| 亚洲日本在线观看视频| 免费无码一区二区三区| 亚洲AV综合色区无码一二三区| 久久久久亚洲精品男人的天堂| 18禁止看的免费污网站| 免费人成大片在线观看播放电影| 亚洲福利视频导航| 免费亚洲视频在线观看| 在线观看免费视频资源| a在线视频免费观看在线视频三区| 亚洲国产精品人久久电影| 亚洲精品国产综合久久一线| 日本妇人成熟免费中文字幕| 亚洲五月午夜免费在线视频| 亚洲综合av一区二区三区 | 亚洲女人初试黑人巨高清| 亚洲欧洲自拍拍偷精品 美利坚 | 久久WWW免费人成人片| aa级女人大片喷水视频免费| 亚洲日本成本人观看| 亚洲人成在线影院| 国产亚洲自拍一区| 国产精品久免费的黄网站| 久久国产色AV免费看| a一级爱做片免费| 色九月亚洲综合网| 亚洲影视自拍揄拍愉拍| 亚洲AV成人无码久久精品老人| 亚洲国产成人久久综合碰| 女人毛片a级大学毛片免费| 精品免费人成视频app| 中文字幕免费不卡二区| ssswww日本免费网站片| 在线精品自拍亚洲第一区| 亚洲综合一区无码精品|