HDFS(Hadoop Distribute File System)基於谷歌發布的GFS論文呢設計(RPC通信方式)
大文件、流式數據適合、大量小文件、隨機寫入、低延遲讀取不適合。
特點
高容錯、高吞吐量、大文件存儲
HDFS能做什么
硬件失效
流式數據訪問:塊方式讀取、128M一個塊(大文件的讀取)
存儲數據大:
數據的一致性:一次寫入多次讀取、支持追加不能修改
多硬件平台:
移動計算能力:就近原則(計算離數據最近的副本數據)、可減少網絡負載、降低網絡擁堵
HDFS架構
namenode:存儲生成文件系統的元數據(目錄樹結構、文件塊、塊編號及datanode的分布)
secondary namenode:
datanode:
流程:客戶端-namenode-客戶端-datanode
HDFS關鍵設計
主從模式
統一文件系統命名空間
數據副本機制
元數據(持久化機制):
統一通訊協議:
健壯機制:
數據組織:
訪問方式:
空間回收機制:
HDFS數據讀取流程
1、業務應用調用HDFS Client提供的API打開文件
2、HDFS Client聯系Namenode獲取到文件信息(數據塊、datanode位置信息)
3、業務應用調用read API讀取文件
4、HDFS Client根據從Namenode獲取到的信息,聯系Datanode,獲取的相應數據塊(Client采用就近原則讀取數據)
5、HDFS Client會與多個Datanode通訊獲取數據塊
6、數據讀取完成后,業務調用close關閉連接
HDFS寫入流程
1、業務應用調用HDFS Client提供的API創建文件,請求寫入
2、HDFS Client聯系Namenode,namenode在元數據中創建文件節點
3、業務應用調用write API寫入文件
4、HDFS Client收到業務數據后,從Namenode獲取到數據塊編號、位置信息,聯系datanode並將需要與數據的datanode建立起流水線,完成后,客戶端再通過自有協議寫入數據到datanode1,再由datanode1復制到datanode2,datanode3
5、寫完的數據,將返回確認信息給HDFS Client
6、所有數據確認完成后,業務調用HDFS Client關閉文件
7、業務調用close flush后,HDFSClient聯系Namenode,確認數據包寫入完成,Namenode持久化元數據
注:客戶端執行完write操作后,寫完的block才是可見的,正在寫的block對客戶端是不可見的,只有調用close方法時會默認調用sync方法,是否需要手動調用取決於你根據程序需要在數據健壯性和吞吐率之間權衡
數據副本機制
副本距離計算公式:
Distance(Rack 1/D1 Rack1/D1)=0同一台服務器的距離為0
Distance(Rack 1/D1 Rack1/D3)=2同機架不同服務器距離為2
Distance(Rack 1/D1 Rack2/D1)=4不同機架服務器距離為4
副本放置策略:
第一副本在本地機器
第二副本在遠端機器
第三副本首先確認之前的兩個副本是否在同一個機架,如果是則選擇其他的機架,否則選擇和第一副本相同機架的不同節點
第四副本及以上隨機選擇副本存放位置
數據持久化
1、主namenode接收文件系統操作請求,生成editlog,並回滾日志,向editlog.new中記錄日子
2、備用namenode從主namenode上下載FSImage,並從共享存儲中讀取editlog
3、備用namenode將日志和舊的元數據合並,生成新的元數據FSImage.ckpt
4、備用namenode將元數據上傳到主用namenode
5、主namenode將上傳的元數據進行回滾
6、循環操作
元數據持久化健壯機制:HDFS主要目的是保證存儲數據的完整性,對於 各個組件的失效,做了可靠性處理
重建失效數據盤的副本
datanode與namenode之間通過心跳周期回報狀態數據,namenode管理數據塊是否報完整,如果datanode因硬盤損壞未上報數據塊,namenode將發起副本重建動作恢復丟失的副本
集群數據均衡:HDFS架構設計了數據均衡機制,以此機制保證數據在各個datanode上存儲是平均的
數據的有效性保證:datanode存儲在硬盤上的數據塊,都有一個檢驗文件與之對應,在讀取數據時,datanode會校驗其有效性,若校驗失敗,則HDFS客戶端將從其他數據節點讀取數據,並通知namenode,發起副本恢復
元數據可靠性保證:采用日志機制操作元數據,同時元數據存在主備namenode上,快照機制實現了文件系統常見的快照機制,保證數據誤操作時能及時恢復
安全模式:HDFS提供獨有的安全模式機制,在數據節點故障,硬盤故障時,能防止故障擴散
HDFS高可靠性
在基本架構上增加了一下組件:
ZK:分布式協調,主要用來存儲HA下的狀態文件,主備信息。ZK數量基數3個及以上
namenode主備模式,主提供服務,備用於合並元數據並作為主的熱備
ZKFC(zookeeper Failover Controller)用於控制Namenode的節點主備狀態
JN(journalnode)用於共享存儲,namenode生成的editlog
| 命令類別 | 命令 | 命令說明 |
| dfs | -cat | 顯示文件內容 |
| -ls | 顯示目錄列表 | |
| -rm | 刪除文件 | |
| -put | 上傳文件到hdfs | |
| -get | 從hdfs下載文件到本地 | |
| -mkdir | 創建目錄 | |
| -chmod/-chown | 改變文件屬組 | |
| ... | ... | |
| dfsadmin | -safemode |
安全模式操作 |
| -report | 報告服務狀態 | |
| balancer | -threshold | 容量均衡闕值 |
| 參數 | 默認值 | 說明 |
| dfs.replication | 3 | HDFS存儲數據的副本數,建議為3,修改后,hdfs將全局刷新副本數 |
| dfs.client.block.write.replace-datanode-on-failure.replication | 2 | 客戶端再寫入數據時會強制要求所有數據寫成功,否則就寫入失敗,當數據節點為3台時,建議修改為2,防止數據節點復位寫入失敗。 |
| dfs.namenode.rpc.port | 8020 | hdfs內部rpc的通訊端口 |
| dfs.namenode.http | 25000 | hdfs http服務端口 |
| 參數 | 默認值 | 說明 |
| dfs.namenode.image.backup.nums | 48 | 元數據備份個數,元數據備份為每30分鍾備份,48可以備份一天的元數據 |
| dfs.block.size | 134217728 | 數據塊大小,默認是128M,單位為字節,系統安裝之后不建議修改 |
| dfs.namenode.handler.count | 64 | namenode並行處理任務數,調大可以提高性能 |
| fs.trash.checkpoint.interval | 60 | HDFS回收站掃描周期 |
| fs.trash.interval | 1440 | hdfs回收站文件刪除時間,單位為1分鍾,默認一天 |
| dfs.permissions.enabled | true | hdfs文件系統是否啟用acl的安全管理,建議打開 |
| 參數 | 默認值 | 說明 |
| dfs.block.size | 134217728 | 數據塊大小,默認安裝是128M,單位為字節,系統安裝后不建議修改 |
| dfs.datanode.handler.count | 8 | datanode並行處理的任務數,調大可以提高性能 |
| dfs.datanode.directoryscan.interval | 21600 | datanode數據塊校驗周期,此功能用於檢查損壞的數據塊,默認是21天,參數單位為小時 |
| dfs.datanode.balance.bandwidthPerSec | 20971520 | hdfs balance功能的最高流量,調大后能縮短balance時間,但是會占用較大的網絡帶寬 |
| dfs.datanode.data.dir.perm | 700 | datanode創建存儲目錄的默認權限,能防止數據被非root賬號非法讀取。 |
