分布式文件系統(tǒng):管理網(wǎng)絡(luò)中跨多臺計算機存儲的文件系統(tǒng),能容忍節(jié)點故障
3.1 HDFS的設(shè)計
HDFS以流式數(shù)據(jù)訪問模式來存儲超大文件,運行于商用硬件集群。
- 超大文件 MB級、GB級、TB級甚至PB級大小的文件
- 流式數(shù)據(jù)訪問 一次寫入、多次讀取數(shù)據(jù)訪問模式,每次讀取文件的大部分或全部,更關(guān)注文件整體讀取時間,而非前幾條記錄讀取時間。
- 商用硬件 指普通硬件集群,而非昂貴高可靠的硬件,對于龐大的集群,硬件故障率較高
不適合使用HDFS進行存儲的場景
- 低時延數(shù)據(jù)訪問 HDFS是為高數(shù)據(jù)吞吐量應(yīng)用場景優(yōu)化的,以高延遲為代價,低延遲訪問需求可以采用Hbase
- 大量小文件 文件系統(tǒng)元數(shù)據(jù)存儲于namenode,文件數(shù)量上限取決于namenode內(nèi)存,據(jù)經(jīng)驗,每個文件、目錄、數(shù)據(jù)塊存儲信息大約占150字節(jié),100萬個文件且每文件占1個數(shù)據(jù)塊,至少需要300MB內(nèi)存。
- 多用戶寫,任意修改文件 只支持單寫,且以append方式在文件末尾追加。
3.2 HDFS的概念
3.2.1 數(shù)據(jù)塊
- 文件系統(tǒng)塊大小是磁盤sector(扇區(qū),最小操作單位)大小的整數(shù)倍,磁盤sector一般為512字節(jié),文件系統(tǒng)block一般為幾千字節(jié),減少尋址延遲,抽象底層實現(xiàn)。
- HDFS塊,默認128MB,HDFS上的文件也被劃分為塊大小的多個分塊(chunk),作為獨立存儲單元,小于一個塊大小的文件不會占用整個塊空間。
HDFS塊比文件系統(tǒng)的塊大,是為了最小化尋址開銷,塊足夠大,傳輸由多個塊組成的大文件時間將由磁盤傳輸速率決定。
尋址10ms,傳輸速率100M/s,塊大小100MB,尋址僅占傳輸時間的1%,隨著磁盤傳輸速率提升,塊可以設(shè)置得更大,但設(shè)置過大,map任務(wù)數(shù)(一次處理一個數(shù)據(jù)塊)過少(少于集群節(jié)點數(shù)量),作業(yè)運行速度會較慢。
分布式文件系統(tǒng)塊抽象好處
- 單文件大小可大于分布式文件系統(tǒng)中單磁盤容量,文件塊可以存儲于集群任意磁盤;
- 使用抽象塊而非整個文件作為存儲單元,簡化了存儲子系統(tǒng)設(shè)計,簡化存儲管理(計算單個磁盤可存儲多少個塊相對容易)
- 塊適合于副本備份, 提高數(shù)據(jù)容錯能力和提高可用性
以下命令可查看文件塊信息
hdfs fsck / -files -blocks
3.2.2 namenode和datanode
- namenode 管理文件系統(tǒng)命名空間,維護文件系統(tǒng)樹及樹內(nèi)目錄和文件,這些信息永久保存于命名空間鏡像文件和編輯文件,也記錄文件所有塊所在節(jié)點信息,這些信息會在系統(tǒng)重啟時根據(jù)節(jié)點上報消息進行重建。
- datanode 存儲并檢索數(shù)據(jù),定期向namenode上報其所存儲塊列表信息
- client 用戶與namenode、datanode交互的界面,以此訪問文件系統(tǒng)
namenode容錯
- 配置多個保存元數(shù)據(jù)文件的路徑(逗號隔開),寫操作實時同步且原子,一般配置本地文件系統(tǒng)路徑+NFS
secondary namenode(輔助namenode),定期合并命名空間鏡像和編輯文件,防止編輯文件過大,影響寫入性能。因為需要耗費大量CPU,且需要和namenode一樣多的內(nèi)存來執(zhí)行合并,一般獨立部署,可在namenode發(fā)生故障時啟用。輔助namenode狀態(tài)滯后于namenode,一般把存儲在NFS的namenode元數(shù)據(jù)文件拷貝至輔助namenode并啟用。
輔助namenode合并fsimage和edits過程.png
3.2.3 塊緩存
通常datanode從磁盤讀取數(shù)據(jù),對被頻繁訪問的文件,對應(yīng)塊可被顯示緩存于datanode內(nèi)存中,稱為堆外塊緩存(off-heap block cache),一般一個塊僅緩存在一個datanode內(nèi)存中,可針對文件配置該數(shù)量。作業(yè)調(diào)度器通過在塊緩存的datanode上運行任務(wù),利用塊緩存優(yōu)勢提升讀性能,如join小表可緩存于內(nèi)存。
- cache pool是一個管理緩存權(quán)限和資源使用的管理性分組。
- 用戶或應(yīng)用通過在緩沖池(cache pool)增加一個cache directive來告訴namenode需要緩存哪些路徑及緩存多久。
cacheadmin命令用法
Usage: bin/hdfs cacheadmin [COMMAND]
[-addDirective -path <path> -pool <pool-name> [-force] [-replication <replication>] [-ttl <time-to-live>]]
[-modifyDirective -id <id> [-path <path>] [-force] [-replication <replication>] [-pool <pool-name>] [-ttl <time-to-live>]]
[-listDirectives [-stats] [-path <path>] [-pool <pool>] [-id <id>]]
[-removeDirective <id>]
[-removeDirectives -path <path>]
[-addPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-defaultReplication <defaultReplication>] [-maxTtl <maxTtl>]]
[-modifyPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-defaultReplication <defaultReplication>] [-maxTtl <maxTtl>]]
[-removePool <name>]
[-listPools [-stats] [<name>]]
[-help <command-name>]
-ttl 緩存指令可以保持多長時間。可以按照分鐘,小時,天來指定,如30m,4h,2d。有效單位為[smhd]。“never”表示永不過期的指令。如果未指定該值,那么,緩存指令就不會過期
1、增加緩沖池
> hdfs cacheadmin -addPool cache_users -owner ossuser -mode 0700
Successfully added cache pool cache_users.
2、列出所有緩沖池
> hdfs cacheadmin -listPools
Found 1 result.
NAME OWNER GROUP MODE LIMIT MAXTTL DEFAULT_REPLICATION
cache_users ossuser ossgroup rwx------ unlimited never 1
3、將hdfs路徑緩存至緩沖池
> hdfs cacheadmin -addDirective -path /home/ossuser -pool cache_users
Added cache directive 1
4、查看hdfs路徑是否加入至緩沖池
> hdfs cacheadmin -listDirectives -path /home/ossuser
Found 1 entry
ID POOL REPL EXPIRY PATH
1 cache_users 1 never /home/ossuser
> hdfs cacheadmin -listDirectives -path /user/ossuser
5、刪除hdfs路徑緩存
> hdfs cacheadmin -removeDirectives -path /home/ossuser
Removed cache directive 1
Removed every cache directive with path /home/ossuser
> hdfs cacheadmin -listDirectives -path /home/ossuser
Found 0 entries
3.2.4 聯(lián)邦HDFS
namenode在內(nèi)存中保存文件與數(shù)據(jù)庫對應(yīng)關(guān)系,內(nèi)存將成為系統(tǒng)橫向擴展的瓶頸,聯(lián)邦HDFS允許通過添加namenode實現(xiàn)擴展,每個namenode管理一部分命名空間,如nn1管理/user,nn2管理/share。
命名空間卷(namespace volume)
- 聯(lián)邦HDFS環(huán)境下,每個namenode維護一個;
- 由命名空間元數(shù)據(jù)和一個數(shù)據(jù)塊池(block pool)組成;
- 相互獨立不通信,不影響,所以可能部分命名空間可用。
數(shù)據(jù)塊池(block pool)
- 池包含了該命名空間下所有文件的所有數(shù)據(jù)塊;
- 池不再進行切分,datanode需要注冊到每個namenode,且存儲來自多個數(shù)據(jù)塊池的數(shù)據(jù)塊。
3.2.5 HDFS的高可用
namenode單點失效(SPOF, Single Point of Failure),HDFS整個不可用,包括文件創(chuàng)建、讀取、列舉等;
失敗恢復(fù),須啟動一個擁有元數(shù)據(jù)副本的namenode,配置datanode和客戶端以便使用整個新的namenode,對于有大量文件和數(shù)據(jù)塊的集群,namenode冷啟動耗時30+分鐘,啟動過程如下:
- 加載命名鏡像文件至內(nèi)存
- replay 編輯日志
- 接收足夠多的來自datanode的數(shù)據(jù)塊上報信息,退出安全模式。
Hadoop2通過namenode active-standby模式提供了HDFS HA支持,standby namenode接管active namenode任務(wù)時,不會有明顯中斷。
- namenode間通過高可用共享存儲實現(xiàn)編輯日志的共享,當(dāng)standby namenode接管任務(wù)后,將replay編輯日志,實現(xiàn)與active namenode的狀態(tài)同步;
- standby namenode也需要同時接收來自datanode的數(shù)據(jù)塊上報消息,因為數(shù)據(jù)塊映射信息存儲在內(nèi)存,而非磁盤;
- 客戶端需要使用特殊機制透明處理namenode失效問題;
- standby namenode同時行使secondary namenode職責(zé),為active namenode命名空間設(shè)置周期性檢查點。
高可用共享存儲:
- NFS
- QJM(quorum journal manager)群體日志管理器,以一組日志節(jié)點形式運行,每次編輯必須寫入多數(shù)節(jié)點,被推薦用于大多數(shù)HDFS部署中。active namenode失效后,standby namenode能在幾十秒內(nèi)接管任務(wù),因為standby內(nèi)存中已包括最新的編輯日志條目和數(shù)據(jù)塊映射信息,實際觀察可能1分鐘左右,因為系統(tǒng)需要保守確定active namenode真的失效了。
active standby namenode都失效的情況非常少,可以再加一個備用namenode冷備啟動。
故障遷移和規(guī)避:
- 平穩(wěn)故障轉(zhuǎn)移 故障轉(zhuǎn)移控制器可以組織兩個namenode有序地切換角色,如日常維護中管理員手動發(fā)起的切換;
- 非平穩(wěn)故障轉(zhuǎn)移 無法確切知道失效namenode是否已停止運行,如網(wǎng)絡(luò)緩慢或網(wǎng)絡(luò)分割,激發(fā)了故障轉(zhuǎn)移,但是先前的namenode依然運行且是活動namenode,規(guī)避(fencing)可確保先前活動的namenode不會執(zhí)行危害系統(tǒng)并導(dǎo)致系統(tǒng)崩潰的操作。
namenode高可用架構(gòu).png
- QJM同一時間只允許一個namenode節(jié)點寫入編輯日志,但先前活動namenode仍可能響應(yīng)客戶端請求,建議kill掉namenode進程;
- NFS無法同一時間只允許一個namenode寫入數(shù)據(jù)(所以建議使用QJM),需要使用更有力規(guī)避機制包括:撤銷namenode讀寫NFS權(quán)限,屏蔽相應(yīng)網(wǎng)絡(luò)端口,對應(yīng)主機下電。
客戶端故障轉(zhuǎn)移:
通過客戶端配置文件,HDFS URI使用一個邏輯主機名,該主機名映射一對namenode,客戶端會失敗重試。
3.3 命令行接口
常用命令:
1、查看HDFS文件列表
> hdfs dfs -ls /
Found 2 items
drwxr-xr-x - ossuser supergroup 0 2019-04-03 11:37 /user
-rw-r--r-- 1 ossuser supergroup 4 2019-04-19 17:58 /test.txt
格式為:
文件模式
文件備份數(shù)
所屬用戶
所屬組
文件大小(字節(jié)單位,目錄為0)
最后修改日期與時間
文件或目錄名稱
2、從本地拷貝至HDFS
> hdfs dfs -copyFromLocal test.txt /2019
3、從HDFS拷貝至當(dāng)前路徑
> hdfs dfs -copyToLocal /2019/test.txt .
4、查看HDFS文件內(nèi)容
> hdfs dfs -cat /2019/test.txt
abc
5、刪除HDFS文件
> hdfs dfs -rm /2019/test.txt
Deleted /2019/test.txt
6、創(chuàng)建HDFS目錄
> hdfs dfs -mkdir -p /test1/test2
> hdfs dfs -ls /test1
Found 1 items
drwxr-xr-x - ossuser supergroup 0 2019-04-19 17:55 /test1/test2
7、刪除HDFS目錄
> hdfs dfs -rm -r /test1
Deleted /test1
HDFS文件訪問權(quán)限
文件 | 目錄 | |
---|---|---|
r | 讀取 | 目錄文件列表 |
w | 寫入 | 新建、刪除文件或目錄 |
x | - | 訪問目錄子目錄 |
默認,Hadoop安全措施處于停用模式,客戶端身份沒有經(jīng)過認證,一個客戶端可以在遠程系統(tǒng)創(chuàng)建一個和合法用戶同名的賬號來訪問系統(tǒng)。
3.4 Hadoop文件系統(tǒng)
抽象類org.apache.hadoop.fs.FileSystem
定義了Hadoop中一個文件系統(tǒng)客戶端接口,有如下實現(xiàn):
文件系統(tǒng)類型 | URI Schema | 實現(xiàn)類 | 說明 |
---|---|---|---|
Local | file | org.apache.hadoop.fs.LocalFileSystem | 使用客戶端校驗和的本地磁盤文件系統(tǒng) |
HDFS | hdfs | org.apache.hadoop.hdfs.DistributedFileSystem | HDFS |
WebHDFS | webhdfs | org.apache.hadoop.hdfs.web.WebHdfsFileSystem | HDFS Web版 |
Secure WebHDFS | swebhdfs | org.apache.hadoop.hdfs.web.SWebHdfsFileSystem | WebHDFS HTTPS版本 |
HAR | har | org.apache.hadoop.fs.HarFileSystem | 一個構(gòu)建于其他文件系統(tǒng)之上用于文件存檔的文件系統(tǒng),通常用于多個小文件打包成一個存檔文件以較少namenode內(nèi)存使用,使用hadoop archive命令創(chuàng)建HAR文件 |
View | view | org.apache.hadoop.fs.viewfs.ViewFileSystem | 通常用于聯(lián)邦HDFS創(chuàng)建掛載點 |
FTP | ftp | org.apache.hadoop.fs.ftp.FTPFileSystem | - |
S3 | s3a | - | - |
Azure | wasb | - | - |
Swift | swift | - | OpenStack Swift |