HDFS和KFS 比較 By云深作者:Terry/Lanlan/Adam 2009年1月 轉載請注明出處 1、HDFS 和 KFS 簡介
兩者都是GFS的開源實現(xiàn),,而HDFS 是Hadoop 的子項目,用Java實現(xiàn),,為Hadoop上層應用提供高吞吐量的可擴展的大文件存儲服務,。 Kosmos filesystem(KFS) is a high performance distributed filesystem for web-scale applications such as, storing log data, Map/Reduce data etc. It builds upon ideas from Google‘s well known Google Filesystem project. 用C++實現(xiàn)
本文選取的源碼版本如下: hadoop-0.17.2.1 Kfs 0.2.2
2、HDFS和KFS體系架構
圖1 體系架構
HDFS和KFS都屬于分布式文件系統(tǒng),,它們的元數(shù)據(jù)管理采用集中式方式實現(xiàn),,數(shù)據(jù)實體先分片然后分布式存儲。本文先介紹這類系統(tǒng)的模塊組成以及各模塊的關鍵技術,,并以此為線索分析和比較HDFS的異同點,。
HDFS和KFS大致有以下幾個模塊組成: MetaServer: Namespace 管理 Layout管理 MetaImage管理 Lease管理 ChunkServer: Chunk管理 Chunk存儲 Client Transaction Layer,,該部分是系統(tǒng)給上層應用提供的接口,本文不予比較,。
3,、HDFS和KFS各模塊的關鍵技術
HDFS和KFS關鍵實現(xiàn)技術如下: MetaServer: Namespace的組織和維護 MetaData的序列化和加載 系統(tǒng)恢復 Chunk Layout的ChunkServer選擇 Lease的管理和維護 ChunkServer: Chunk存儲組織 本地Chunk 信息的重建 Chunk失效處理 Client Transaction:文件操作
4、HDFS和KFS MetaServer實現(xiàn)的比較(1)
Namespace的組織和維護 HDFS Namespace的組織采用Component模式,,文件夾,、文件和Chunk組成如下層次結構。 Root /------| |-----/terry---|---/sub0 |----file3---|---block0 |---block1 |-----/adam--|---/sub0 |-------file0 | --block2 |-------tmpfile1 |---block3 |---block4 KFS采用B+樹存放文件系統(tǒng)的結點信息,,各結點存有父結點的索引,,從而實現(xiàn)文件夾、文件和Chunk的層次關系,。
5,、HDFS和KFS MetaServer實現(xiàn)的比較(2)
LayoutManagement實現(xiàn),包括Chunk Server選擇算法,、負載均衡實現(xiàn),。 Chunk Server選擇算法包括以下: Chunk 創(chuàng)建時,Chunk Server的選擇,; Chunk 實際拷貝數(shù)與需求不一致時,,Chunk的重拷貝和刪除問題。 寫入的ChunkServer具備的基本條件如下: 節(jié)點處于活躍期,; 節(jié)點有Chunk讀(拷貝源節(jié)點)或寫(拷貝目標節(jié)點)并發(fā)的余量,; 節(jié)點網(wǎng)絡流量小于系統(tǒng)平均流量的兩倍; 作為存儲點,,節(jié)點有存儲余量,; Chunk在該節(jié)點所屬Rack上的拷貝數(shù)沒到上限;
基本原則:HDFS優(yōu)先保證前3份拷貝有兩份在一個Rack上,,另一份在不同的Rack上,;而KFS要求拷貝均勻分散在不同的Rack上。 Chunk創(chuàng)建時,,第一個存儲點的選擇問題: 當創(chuàng)建Chunk的Client上部署有Chunk Server時,,HDFS和KFS均優(yōu)先選擇該節(jié)點為首存儲點; 否則,,HDFS隨機選擇,,KFS優(yōu)先選擇存儲和網(wǎng)絡負載較輕的節(jié)點。 根據(jù)上述基本原則選擇其余節(jié)點,。 拷貝數(shù)小于需求時,,HDFS根據(jù)基本原則選擇備用節(jié)點;KFS優(yōu)先選擇失效節(jié)點相同Rack上的節(jié)點; 拷貝數(shù)大于需求時,,HDFS根據(jù)基本原則刪除多余的Location,;KFS優(yōu)先考慮拷貝的均勻分布,然后再根據(jù)節(jié)點的負載選擇失效拷貝,。 6,、HDFS和KFS MetaServer實現(xiàn)的比較(3)
MetaServer根據(jù)Namespace中的chunk列表,將列表亂序,,依此掃描chunk location信息,,將存儲或網(wǎng)絡負載超過閾值的節(jié)點上的拷貝標志為失效,并轉存到負載較低的節(jié)點上,。 負載控制方面:HDFS任務分配較KFS精細,;HDFS實現(xiàn)上有網(wǎng)絡流量控制,KFS沒有,。 實現(xiàn)方式上:HDFS使用多線程實現(xiàn)多任務并發(fā)執(zhí)行,,而KFS使用Reactor模式實現(xiàn)多任務并發(fā)。
7,、HDFS和KFS MetaServer實現(xiàn)的比較(4)
Meta Image Management,,包括FSImage和操作日志兩部分。 HDFS FSImage結構如圖2(新版本中刪除了DataNode Image部分),。
圖2 HDFS FSImage
KFS存儲元數(shù)據(jù)B+樹的葉子節(jié)點信息到磁盤上,,并記錄該鏡像加載過程中需要合并的操作日志文件名。 HDFS通過多目錄的同時備份,,并記錄checkpoint時間,。系統(tǒng)重啟時,通過檢查各目錄下鏡像信息以及中間文件存在狀態(tài),,采取合理的策略恢復元數(shù)據(jù)信息,,并生成新的元數(shù)據(jù)鏡像。 KFS在本地存有不同版本的鏡像和操作日志,,并通過一個硬鏈接指向最新的鏡像信息,。啟動時,加載硬鏈接指向的鏡像文件,,以及鏡像中存有的操作日志及其之后的所有的操作日志,,恢復元數(shù)據(jù)。
8,、HDFS和KFS MetaServer實現(xiàn)的比較(5)
Lease的管理和維護-1 HDFS和KFS的鎖管理通過Lease方式來實現(xiàn),,并且都在Chunk級別加鎖。 HDFS僅對正在創(chuàng)建中文件擁有的Chunk加鎖,,即只有寫鎖。并且文件刪除過程中,直接清除該文件上所有的鎖,,使Lease renew操作失敗,,中斷用戶的寫操作。 KFS實現(xiàn)了讀和寫兩種鎖機制,,可以多用戶并發(fā)讀,,單用戶獨占寫,讀寫互斥,。已加鎖的文件刪除時,,將文件移動到Namespace的dumpster目錄,待有鎖清除操作時,,檢查相關文件的鎖信息,,將無鎖的文件徹底刪除。 HDFS實現(xiàn)的是實名鎖,,記錄了客戶端信息,;KFS采用的是匿名鎖,僅記錄了分配的Lease ID,。
Lease的管理和維護-2 HDFS中ChunkServer沒有鎖標志,,MetaServer將寫鎖分配給Client,由Client刷新,; KFS的實現(xiàn)相對復雜些,。 寫操作,MetaServer分配Chunk時,,給Main ChunkServer分配writer-Lease,,ChunkServer接收到Client的寫操作時檢查并Renew該Lease; 讀操作,,MetaServer給Client分配Reader-Lease,由Client根據(jù)讀的進度進行Lease的Renew操作,; Lease的銷毀有兩種方式: 定時器 特定的操作關聯(lián)刪除 鎖機制實現(xiàn)上,KFS相對完善些,,但其匿名鎖方式也可能存在隱患,。
9、HDFS和KFS ChunkServer實現(xiàn)的比較(1)
ChunkServer上Chunk的存儲組織: l HDFS和KFS都可以配置多個存儲目錄,; l 在存儲目錄存儲空間配額允許的情況下,,HDFS按照輪轉的方式將Chunk均勻的放置到各存儲目錄;KFS按照ChunkId和存儲目錄個數(shù)的模運算選擇存放目錄,。 l ChunkId由MetaServer統(tǒng)一分配,,HDFS的放置方式較KFS均勻,chunk維護的過程中,,要維護chunk到文件的映射,。KFS的放置策略簡單,,Chunk和文件之間的映射關系直接,但弊端也十分明顯,,配置文件中的存儲目錄數(shù)目不能修改,,否則系統(tǒng)將無法正常運作。KFS0.2.2中似乎并沒有解決這個問題,。 l 在同一個存儲目錄中,,HDFS每級目錄最多64個Chunk和64個子目錄,組成層次結構,。存放時Chunk時,,要求嵌套目錄的深度盡量小。KFS采用平面結構,,所有Chunk存放在一個目錄下,。根據(jù)底層文件系統(tǒng)實現(xiàn)機制,HDFS Chunk文件的定位速度較KFS快,。 l HDFS各工作目錄有文件鎖,,避免多網(wǎng)元共享存儲目錄引發(fā)錯誤;KFS沒有該保護機制,。
10,、HDFS和KFS ChunkServer實現(xiàn)的比較(2)
ChunkServer上Chunk存儲: l HDFS中,每個Chunk存放兩個文件,,實體數(shù)據(jù)和Meta數(shù)據(jù),;KFS存放為一份文件,Meta數(shù)據(jù)存放在前16K文件頭區(qū)域,,實體數(shù)據(jù)存放在16k之后,。 l HDFS和KFS默認的Chunk大小為64M,。Meta校驗碼部分均采用Adler_32算法。 HDFS根據(jù)配置,決定是否計算校驗碼,,以及校驗塊的大小,。 KFS每16K數(shù)據(jù)計算一個32位校驗碼,,存放在對應的Meta數(shù)據(jù)區(qū)域,。 l KFS有16K的文件頭,在實現(xiàn)Truncate操作時,,KFS0.2.2版本中似乎忽略了這部分數(shù)據(jù),,Bug or not?
11,、HDFS和KFS ChunkServer實現(xiàn)的比較(3)
本地Chunk 信息的重建: l HDFS和KFS均通過掃描本地工作目錄,,重建內存中的Chunk管理數(shù)據(jù); l HDFS在ChunkServer中沒有Chunk鏡像和操作日志記錄,;KFS中有這部分實現(xiàn),,在ChunkServer上存儲Chunk鏡像信息和操作日志,,并實現(xiàn)了啟動時對鏡像和操作日志的加載功能。但是這部分代碼沒有調用,,也許廢棄了,。
12、HDFS和KFS ChunkServer實現(xiàn)的比較(4)
Chunk失效處理 l HDFS:ChunkServer通過定期的Heartbeat向MetaServer匯報本地Chunk列表,,或者完成Chunk寫操作后,向MetaServer匯報新寫入的Chunk信息,。MetaServer根據(jù)狀態(tài),,向ChunkServer分發(fā)Chunk復制任務或者Chunk失效信息等。HDFS接收到失效信息后,,刪除Chunk文件,; l KFS:啟動時或者在讀操作ChunkSum錯誤時,向MetaServer匯報Chunk信息,。MetaServer刪除Chunk有兩類操作:Delete和Stale,。前者由Client觸發(fā),后者由ChunkServer匯報錯誤觸發(fā),。Delete操作下,,ChunkServer直接刪除chunk文件;Stale操作下,,ChunkServer將Chunk轉移到./lost+found目錄下,。但KFS0.2.2中沒有對./lost+found目錄中的文件做進一步處理,也許改進版本中會用到,。
13,、HDFS和KFS Chunk寫流程上的區(qū)別(1)
HDFS Chunk 寫流程,如圖3
圖3 HDFS Chunk 寫流程
14,、HDFS和KFS Chunk寫流程上的區(qū)別(2)
KFS Chunk 寫流程,,如圖4
圖4 KFS Chunk 寫流程 |
|