HDFS v1.0學習筆記
hdfs是一個用於存儲大文件的分布式文件系統,是apache下的一個開源項目,使用java實現。它的設計目標是可以運行在廉價的設備上,運行在大多數的系統平臺上,高可用,高容錯,易於擴展。
適合場景
- 存儲大文件:G級別或者以上
- 離線數據分析
- 非結構化數據
- 一次寫多次讀
不適合的場景
- 存儲小文件
- 文件需要修改(hdfs只能追加,如果需要修改,刪除後,再重新上傳)
- 低延遲服務
- 多用戶寫
- 大量隨機讀
整體架構
各組件含義以及關系
組件 | 含義 | 備註 |
---|---|---|
NameNode | 名字節點,Master節點,仲裁者 | 管理和存儲命名空間元數據信息,維護文件路徑和block的映射,維護block和DataNode節點的映射,根據制定的策略和集群DataNode節點情況確定block數據真實存儲的數據節點列表,維護和監控已存在的block列表,根據實際情況指示數據節點增刪block,負責客戶端文件元數據的請求響應 |
SecondaryNameNode | 輔助名字節點的節點 | 負責維護NameNode元數據的鏡像文件fsimage,周期性的合並NameNode產生的事物日誌(edit log)到自己的fsimage,並且回寫到NameNode節點,保證NameNode節點的鏡像文件不會非常過時 |
DataNode | 數據節點 | 按塊存儲真實的文件數據,周期性的發送心跳包到NameNode,告知相關狀態信息(heartbeat)以及上報塊列表信息(安全模式下),負責客戶端數據的讀取和寫入,負責處理NameNode發出的指令,負責數據節點間塊數據的同步 |
Client | 客戶端 | 負責發起讀寫請求,負責數據完整性效驗,寫數據時,負責根據相關配置切割數據,然後分塊上傳到指定的節點,提供的客戶端類型有:shell,java api,c api, web ui,http接口 |
副本存儲策略
采用機架感知策略,兼顧性能和容災的平衡。通過dfs.replication配置block副本數,一般設置3個。如果是三個副本具體怎麽確定單個數據塊的存儲位置呢?采用如下方式:以客戶端所在的數據節點為第一個副本的節點(如果客戶端在集群外,則隨機選擇一個數據節點),從另外一個機架隨機選擇一個節點作為第二個副本的存儲節點,從第二個節點所在的機架隨機選擇一個數據節點存儲第三個副本。
讀數據流程
- dfs客戶端向NameNode發起讀文件請求,檢查是否有權限,如果有訪問權限,返回文件block所在節點列表(根據近地原則返回)
- 根據返回的數據節點列表,並發發起獲取文件數據請求,對返回數據按切割的塊進行完整性效驗,最後合並數據成一個文件,保存到本地
寫數據流程
- dfs客戶端向NameNode發起寫文件請求,檢查是否有寫權限,如果有權限,NameNode根據制定的策略和數據節點的狀態情況確定block存儲的數據節點列表,然後返回給客戶端
- dfs客戶端對本地文件按塊規則進行切分,每一個數據塊上傳到指定的數據節點。對數據塊進一步切割成更小的塊,帶上完整性效驗碼,一塊接著一塊上傳到數據節點。
- 數據節點之間互相拷貝數據,一個小塊接著一個小塊數據在節點之間傳輸,收到小塊數據後,進行完整性效驗,節點之間類似管道一樣傳輸數據
- 當數據傳輸完成,dfs客戶端告知NameNode完成,NameNode落地這次修改的事物日誌(通過NameNode上報),同時更新內存中元數據信息
數據完整性
- 讀寫文件效驗碼(crc32)驗證
- DataNode啟動一個DataBlockScanner線程周期性掃描block是否損壞
啟動流程
通過腳本啟動集群中所有的節點,整個集群進入安全模式(safe mode),安全模式下只能讀不能寫。NameNode讀取元數據鏡像文件(fsimage)以及合並為合並過的事物日誌文件(edit log),然後產生一個最新的fsimage文件並覆蓋到本地硬盤,並且清空事物日誌文件。NameNode啟動完成後,等待DataNode上報塊列表信息。綜合上報的信息,檢查集群是否健康,上報的可用塊列表信息中是否達到了最小健康標準百分比(通過一個配置設置,默認是90%),如果未達到,會一直處在安全模式。如果有塊數據丟失,從新指示某機器復制副本,以達到副本數的要求。如果配置副本數有更改,則根據要求自動增刪副本。當判斷集群處於健康狀態時,等待30秒左右,集群退出安全模式,進入可服務狀態。
分布式文件系統以及權限
- 類似於linux文件系統,也是一個樹狀結構
- 類似於linux文件系統,只有讀寫權限
- 啟動服務的用戶默認屬於集群超級用戶組,擁有所有的權限
- 上傳和創建目錄時,文件用戶歸屬和組歸屬是當前用戶和當前用戶所在的組
- 刪除有回收站模式,防止文件會被誤刪,刪除時會移動到集群/trash目錄,超過有效期,會定時刪除,此功能默認是關閉的,需要通過配置打開
客戶端 - WEB UI
只能查看
默認地址是:http://master:50070
客戶端 - Shell
通過 hadoop fs 命令 參數 方式啟動
顯示幫助信息
[wadeyu@master ~]$ hadoop fs -help
hadoop fs is the command to execute fs commands. The full syntax is:
hadoop fs [-fs <local | file system URI>] [-conf <configuration file>]
[-D <property=value>] [-ls <path>] [-lsr <path>] [-du <path>]
[-dus <path>] [-mv <src> <dst>] [-cp <src> <dst>] [-rm [-skipTrash] <src>]
[-rmr [-skipTrash] <src>] [-put <localsrc> ... <dst>] [-copyFromLocal <localsrc> ... <dst>]
[-moveFromLocal <localsrc> ... <dst>] [-get [-ignoreCrc] [-crc] <src> <localdst>
[-getmerge <src> <localdst> [addnl]] [-cat <src>]
[-copyToLocal [-ignoreCrc] [-crc] <src> <localdst>] [-moveToLocal <src> <localdst>]
[-mkdir <path>] [-report] [-setrep [-R] [-w] <rep> <path/file>]
[-touchz <path>] [-test -[ezd] <path>] [-stat [format] <path>]
[-tail [-f] <path>] [-text <path>]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-chgrp [-R] GROUP PATH...]
[-count[-q] <path>]
[-help [cmd]]
列出/目錄下所有的文件
[wadeyu@master ~]$ hadoop fs -ls /
Found 22 items
-rw-r--r-- 2 root supergroup 632207 2018-09-03 18:16 /The_Man_of_Property.txt
-rw-r--r-- 2 root supergroup 495 2018-09-04 10:54 /a.txt
-rw-r--r-- 2 root supergroup 404 2018-09-04 10:54 /b.txt
-rw-r--r-- 2 root supergroup 2541 2018-09-04 12:48 /cookie_ip.txt
-rw-r--r-- 2 root supergroup 12224421 2018-09-04 12:48 /ip.lib.txt
drwxr-xr-x - root supergroup 0 2018-09-03 12:59 /output
drwxr-xr-x - root supergroup 0 2018-09-03 19:29 /output_cachearchive_result
drwxr-xr-x - root supergroup 0 2018-09-03 18:47 /output_cachefile_result
drwxr-xr-x - root supergroup 0 2018-09-04 09:36 /output_compresss_result
drwxr-xr-x - root supergroup 0 2018-09-04 09:44 /output_decompress_cat
drwxr-xr-x - root supergroup 0 2018-09-04 10:03 /output_decompress_cat2
drwxr-xr-x - root supergroup 0 2018-09-03 18:48 /output_file_result
drwxr-xr-x - root supergroup 0 2018-09-04 12:49 /output_ip_lib
drwxr-xr-x - root supergroup 0 2018-09-04 11:41 /output_sort_multi_reduce
drwxr-xr-x - root supergroup 0 2018-09-04 10:55 /output_sort_one_reduce
-rw-r--r-- 3 root supergroup 847 2018-09-01 11:44 /passwd
drwxr-xr-x - root supergroup 0 2018-09-04 09:13 /test
-rw-r--r-- 3 root supergroup 0 2018-09-01 20:03 /test.txt
drwxr-xr-x - root supergroup 0 2018-09-04 09:12 /usr
-rw-r--r-- 2 root supergroup 165 2018-09-03 19:11 /w.tar.gz
drwxr-xr-x - wadeyu wadeyu 0 2018-09-04 21:03 /wadeyu
-rw-r--r-- 2 root supergroup 24 2018-09-03 18:36 /white_list
顯示/a.txt文件內容
[wadeyu@master ~]$ hadoop fs -cat /a.txt | head -1
1 hadoop
# 如果是壓縮文件,會解壓後再輸出
[wadeyu@master ~]$ hadoop fs -text /a.txt | head -1
1 hadoop
刪除/test.txt文件
[root@master wadeyu]# hadoop fs -rmr -skipTrash /test.txt
Deleted hdfs://192.168.1.15:9000/test.txt
參考資料
【0】八鬥學院內部hdfs學習資料
【1】HDFS Architecture Guide
http://hadoop.apache.org/docs/r1.2.1/hdfs_design.html
HDFS v1.0學習筆記