1 文件系統
- 是一種存儲和組織數據的方法,它使得文件訪問和查詢變得容易
- 使得文件和樹形目錄的抽象邏輯概念代替了磁盤等物理設備使用數據塊的概念,用戶使用文件系統來保存數據不必關心數據底層存在硬盤哪里,只需記住這個文件的所屬目錄和文件名
- 文件系統通常使用磁盤和光盤這樣的存儲設備,并維護文件在設備中的物理位置。
- 文件系統是一套實現了數據的存儲、分級組織、訪問和獲取等操作的抽象數據類型(Abstract data type)
文件名
? DOS操作系統中文件名由文件主名和擴展名組成,之間以一個小圓點隔開
? 文件名可用于用于定位存儲位置、區分不同文件,計算機實行按名存取的操作方式
? 某些符號因其有特殊含義,一般不允許出現在文件名中
元數據
? 元素據(metadata)又稱為解釋性數據,記錄數據的數據
? 文件系統元數據一般指文件大小、最后修改時間、底層存儲位置、屬性、所屬用戶、權限等信息
文件系統分類
- 基于磁盤的文件系統
是在非易失介質上(磁盤、光盤)存儲文檔的經典方式。用以在多次會話之間保持文件的內容。包括ext2/3/4、xfs、ntfs、iso9660等眾所周知的文件系統。Linux系統可以使用df -Th查看
- 虛擬文件系統
在內核中生成的文件系統,比如proc
proc文件系統是一個虛擬文件系統,通過它可以使用一種新的方法在Linux內核空間和用戶間之間進行通信
- 網絡文件系統
網絡文件系統(NFS,network file system)是一種將遠程主機上的分區(目錄)經網絡掛載到本地系統的一種機制
允許本地計算機訪問另一臺計算機上的數據,對此類文件系統中文件的操作都通過網絡連接進行
2 分布式文件系統HDFS
2.1 HDFS簡介
- HDFS(Hadoop Distributed File System)Hadoop分布式文件系統。是Apache Hadoop核心組件之一,作為大數據生態圈最底層的分布式存儲服務而存在。
- 分布式文件系統解決大數據如何存儲的問題。分布式意味著是橫跨在多臺計算機上的存儲系統。
- HDFS是一種能夠在普通硬件上運行的分布式文件系統,它是高度容錯,適用于具有大數據集的應用程序,它非常適于存儲大型數據(比如 TB PB)
- HDFS使用多臺計算機存儲文件,并且提供統一的訪問接口,像是訪問一個普通的文件系統一樣使用分布式文件系統
2.2 HDFS設計目標
- **硬件故障(Hardware Failure)**是常態,HDFS可能有成百上千的服務器組成,每一個組件都有可能出現故障。因此故障檢測和自動快速恢復是HDFS的核心架構目標。
- HDFS上的應用主要是以流式讀取數據(Streaming Data Access)。HDFS被設計成用于批處理,而不是用戶交互式的。相較于數據訪問的反應時間,更注重數據訪問的高吞吐量。
- 典型的HDFS文件大小是GB到TB級別的。所有,HDFS被調整成支持大文件(Large Data Sets)。他應該提供很高的聚合數據帶寬,一個集群中支持數百個節點,一個集群中還應該支持千萬級別的文件。
- 大部分HDFS應用對文件要求是write-one-read-many訪問模型(一次寫入多次讀取)。一個文件一旦創建、寫入、關閉之后就不需要修改了。這一假設簡化了數據一致性問題,使高吞吐量的數據訪問成為可能。
- 移動計算的代價比之移動數據的代價低。一個應用請求的計算,離它操作的數據越近就越高效。將計算移動到數據附件,比之移動數據到應用所在顯然更好。
- HDFS被設計為可從一個平臺輕松移植到另一個平臺。這有利于將HDFS廣泛用作大量應用程序的首選平臺。
2.3 HDFS應用場景
適用場景
大文件
數據流式訪問
一次寫入多次讀取
低成本部署,廉價pc
高容錯
不適用場景
小文件
數據交互式訪問
頻繁任意修改
低延遲處理
2.4 HDFS重要特性
1、主從架構
HDFS采用master/slave架構。一般一個HDFS集群是有一個NameNode和一定數目的DataNode組成。
NameNode是HDFS主節點,DataNode是HDFS從節點,兩種角色各司其職,共同協調完成分布式的文件存儲服務
2、分塊存儲機制
HDFS中的文件在**物理上分塊存儲(block)**的,塊的大小通過配置參數來規則,參數位于hdfs-default.xml中dfs.blocksize
。默認大小是128M(134217728)
3、副本機制
文件的所有block都會有副本。每個文件的block大小(dfs.blocksize)和副本系數(dfs.replication)都是可配置的。副本系數可以在文件創建時指定,也可以在之后通過命令改變。
默認 dfs.replication 的值是3,也就是額外再復制兩份,連同本身共3副本。
4、namespace
HDFS支持傳統的層次型文件組織結構。用戶可以創建目錄,然后將文件保存在這些目錄里。文件系統名字空間的層次結構和大多數現有的文件系統類似:用戶可以創建、刪除、、移動或重命名文件。
NameNode負責維護文件系統的namespace名稱空間,任何對文件系統名稱空間或屬性的修改都將被NameNode記錄下來
HDFS會給客戶端提供一個統一的抽象目錄樹,客戶端提供路徑來訪問文件。
形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
5、元數據管理
在HDFS中,NameNode管理的元數據具有兩種類型:
- 文件自身屬性信息
文件名稱、權限、修改時間、文件大小、復制因子、數據塊大小
- 文件塊位置映射信息
記錄塊和DataNode之間的映射信息,即哪個塊位于哪個節點上
6、數據塊存儲
文件的各個block的具體存儲管理由DataNode節點承擔。每一個block都可以在多個DataNode上存儲。
7、HDFS的塊大小
HDFS中的文件在物理上是分塊存儲(Block),塊的大小可以通過配置參數(dfs.blocksize)來設置,默認大小在Hadoop2.x/3.x版本是128M,3.x版本是64M
例如:
? 如果尋址時間為10ms,傳輸時間=10ms/0.01=1s(尋址時間為傳輸時間的1%為最佳),若目前磁盤傳輸速率為100MB/s,則block塊大小 = 1s * 100MB/s = 100MB,所有塊大小設置為128M比較合適
- HDFS的塊設置太小,會增大尋址時間(尋址時間大于傳輸時間),程序一直在找塊的開始位置
- HDFS的塊設置太大,從磁盤傳輸數據的時間會明顯大于定位這個塊開始位置所需的時間(傳輸時間遠大于尋址時間),會導致處理數據非常慢
- 尋址時間與傳輸時間的比例為1%時,為最佳狀態
- HDFS的塊大小設置主要取決于磁盤傳輸速率
3 HDFS shell CLI
Hadoop提供了文件系統的shell命令行客戶端,使用方法如下:
hdfs [options] subcommand [subcommand options] subcommand: admin commands / client command / daemon commands
跟文件系統讀寫相關的命令是 hdfs dfs [generic options]
- HDFS Shell CLI支持操作多種文件系統,包括本地文件系統(file:)、分布式文件系統(hdfs://nn:8020)等
- 操作的是什么文件系統取決于URL中的前綴協議
- 如果沒有指定前綴,則將會讀取環境變量中的fs.defaultFS屬性,以該屬性值作為默認文件系統
hdfs dfs -ls file:/// # 操作本地文件系統(客戶端所在的機器)
hdfs dfs -ls hdfs://node1:8020/ # 操作HDFS分布式文件系統
hdfs dfs -ls / # 直接跟目錄,沒有指定協議,將加載讀取fs.defaultFS屬性默認值
3.1 HDFS Shell CLI客戶端
hadoop dfs、hdfs dfs、hadoop fs 三者區別
- hadoop dfs 只能操作HDFS文件系統(包括與Local FS間的操作),不過已經Deprecated
- hdfs dfs 只能操作HDFS文件系統(包括與Local FS間的操作),常用
- hadoop fs 可操作任意操作系統(不僅僅是hdfs文件系統,適用范圍更廣)
目前版本官方推薦使用hadoop fs
3.2 HDFS Shell 常用命令
-mkdir創建目錄
hadoop fs -mkdir [-p] <path>
# path 為待創建目錄
# -p 表示沿著路徑創建父目錄
-ls 查看指定目錄下內容
hadoop fs -ls [-h] [-R] [<path> ... ]
# path 指定目錄路徑
# -h 人性化顯示文件size
# -R 遞歸查看指定目錄及其子目錄
-put上傳文件至指定目錄下
hadoop fs -put [-f] [-p] <localsrc>... <dst>
# -f 覆蓋目錄文件(如果目標文件存在,則覆蓋)
# -p 保留訪問和修改時間,所有權和權限
# localsrc 本地文件系統(客戶端所在機器)
# dst 目標文件系統(HDFS)
-copyFromLocal從本地文件系統拷貝文件至HDFS
(等同于put,習慣上使用put)
hadoop fs -copyFromLocal <localsrc>... <dst>
-moveFromLocal剪切本地文件系統文件至HDFS
(即從本地剪切文件至HDFS)
hadoop fs -moveFromLocal <localsrc>... <dst>
# 和-put功能相似,只不過上傳結束會刪除源數據
-appendToFile追加文件至一個已存在的文件中
hadoop fs -appendToFile <localsrc> ... <dst>
-cat\-head\-tail查看HDFS文件內容
hadoop fs -cat <src> ...
# 對于大文件內容讀取,慎重
hadoop fs -head <file>
# 查看文件前1kB的內容
hadoop fs -tail [-f] <file>
# 查看文件最后1kB的內容
# -f 選擇可以動態顯示文件中追加的內容
-get\coptToLocal\-getmerge下載HDFS文件
(從HDFS拷貝文件至本地)
hadoop fs -get [-f] [-p] <src>... <localdst>
# 下載文件至本地文件系統指定目錄,localdst必須是目錄
# -f 覆蓋目標文件(如果本地文件系統存在該文件,則覆蓋)
# -p 保留訪問和修改時間,所有權和權限hadoop fs -copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>
# 等同于get,習慣上使用get
hadoop fs -getmerge [-n1] [-skip-empty-file] <src> <localdst>
# 下載多個文件合并到本地文件系統的一個文件中
# -n1 表示在每個文件的末尾添加換行符
-cp拷貝HDFS文件
hadoop fs -cp [-f] <src> ... <dst>
# -f 覆蓋目標文件(若目標文件存在,則覆蓋)
-appendToFile追加數據到HDFS文件中
hadoop fs -appendToFile <localsrc>... <dst>
# 將所給給定的本地文件的內容追加到給定的dst文件
# 若dst文件不存在,將創建文件
# 如果<localsrc>為-,則輸入為從標準輸入中讀取
-df查看HDFS磁盤空間
hadoop fs -df [-h] [<path>...]
# 顯示文件系統的容量,可以空間和已用空間
-du查看HDFS文件使用的空間量
hadoop fs -du [-s] [-h] <path>...
# -s 表示顯示指定路徑文件長度的匯總摘要,而部署單個文件的摘要
# -h 表示人性化顯示
-mvHDFS數據移動
hadoop fs -mv <src> ... <dst>
# 移動文件至指定文件夾
# 可以使用該命令移動數據、重命名文件
-rm -r刪除文件/文件夾
hadoop fs -rm -r 路徑
# -r 表示遞歸
-setrep修改HDFS文件副本個數
hadoop fs -setrep [-R] [-w] <rep> <path>...
# 修改指定文件的副本個數
# -R 表示遞歸,修改文件夾及其下所有
# -w 客戶端是否等待副本修改完畢
說明:
? 這里設置的副本數只是記錄在NameNode的元數據中,是否真的會有這么多副本,還得看DataNode的數量。因為目前只有3臺設備,最多也就3個副本,只有節點數的增加到10臺時,副本數才能達到10。
-chgrp\-chmod\-chown修改文件權限
-chgrp、-chmod、-chown:Linux文件系統中的用法一樣
hadoop fs -chmod 666 文件所在路徑
hadoop fs -chown nhk:nhk 文件所在路徑