?? 博主 "開著拖拉機回家"帶您 Go to New World.???
?? 個人主頁——??開著拖拉機回家_Linux,Java基礎(chǔ)學(xué)習(xí),大數(shù)據(jù)運維-CSDN博客 ?????
???? 希望本文能夠給您帶來一定的幫助??文章粗淺,敬請批評指正!????
???????????????? ?????????????? ????????????????????????
感謝點贊和關(guān)注 ,每天進(jìn)步一點點!加油!
目錄
一、HDFS產(chǎn)出背景及定義
1.1.HDFS產(chǎn)生背景
1.2.HDFS簡介
1.3.HDFS的優(yōu)缺點
1、優(yōu)點
2、缺點
二、HDFS的特點
三、HDFS組成架構(gòu)
1、Client:客戶端
2、NameNode
3、 DataNode
4、 Secondary NameNode
四、HDFS讀寫過程
4.1.寫入流程
4.2.讀取流程
五、HDFS客戶端常用命令
5.1.HDFS客戶端訪問命令使用
5.2.HDFS客戶端管理命令使用
1、報告文件系統(tǒng)的基本信息和統(tǒng)計信息
2、fs_image 文件導(dǎo)出解析到本地
3、安全模式
4、文件健康檢查和租約釋放
5、har 歸檔
5.3. HDFS 命令總體劃分
一、HDFS產(chǎn)出背景及定義
1.1.HDFS產(chǎn)生背景
隨著數(shù)據(jù)量越來越大,在一個操作系統(tǒng)存不下所有的數(shù)據(jù),那么就分配到更多的操作系統(tǒng)管理的磁盤中,但是不方便管理和維護(hù),迫切需要一種系統(tǒng)來管理多臺機器上的文件,這就是分布式文件管理系統(tǒng)。HDFS只是分布式文件管理系統(tǒng)中的一種。
1.2.HDFS簡介
HDFS(Hadoop Distributed File System),它是一個文件系統(tǒng),用于存儲文件,通過目錄樹來定位文件;其次,它是分布式的,由很多服務(wù)器聯(lián)合起來實現(xiàn)其功能,集群中的服務(wù)器有各自的角色。
HDFS的使用場景:適合一次寫入,多次讀出的場景。一個文件經(jīng)過創(chuàng)建、寫入和關(guān)閉之后就不需要改變。
1.3.HDFS的優(yōu)缺點
1、優(yōu)點
- 高容錯性,自動保存 默認(rèn)的副本數(shù),某個副本或者機器宕機都會完成自動復(fù)制,使副本數(shù)保持在設(shè)置的個數(shù);
- 適合處理大數(shù)據(jù),能夠存儲和處理TB,甚至 PB級別的數(shù)據(jù)量;
- 可構(gòu)建在廉價機器上,使用普通服務(wù)器便可建設(shè)大數(shù)據(jù)平臺。
2、缺點
- 不適合低延時數(shù)據(jù)訪問, 我們一般采用分布式的HBase 作為存儲;
- 無法高效對大量小文件進(jìn)行存儲
? ? ? ? ?a.大量 小文件會占用 NameNode 大量內(nèi)存來存儲文件索引信息
? ? ? ? ?b.小文件增加訪問和寫入尋址時間,大量小文件的存在無論是讀取或者寫入數(shù)
據(jù) 都會都集群造成很大的壓力
- 不支持并發(fā)寫入、數(shù)據(jù)修改
? ? ? ? ? a.一個文件只能一個寫,不允許多個線程同時寫。
? ? ? ? ? b.僅僅支持?jǐn)?shù)據(jù)append(追加),不支持文件的隨機修改
二、HDFS的特點
高容錯性:一個HDFS集群會包含非常多節(jié)點,HDFS將文件分塊(Block)存儲,并且會自動保存多個副本到不同的機器節(jié)點上以保證數(shù)據(jù)的安全,而且HDFS可以檢測故障并且從故障中快速恢復(fù)。
高吞吐率:與一般文件系統(tǒng)的訪問低延遲不同,HDFS的重點是存儲和處理大量的數(shù)據(jù),支持?jǐn)?shù)據(jù)處理規(guī)模是GB、TB、甚至是PB的級別。因此,相比較用戶交互式程序,HDFS更加適用批處理的應(yīng)用程序。
一次寫入多次讀取模型:一個文件只支持單線程的文件寫入,HDFS假定一個文件一旦被創(chuàng)建,寫入完成之后除了追加和截斷就不需要更改。這種設(shè)置簡化了數(shù)據(jù)一致性的問題,從而也提高了數(shù)據(jù)訪問的吞吐率,同時也不支持文件的隨機修改。
大數(shù)據(jù)集:HDFS 中的典型文件大小為 GB 到 TB,對于大批量小文件HDFS無法做到高效存儲,存儲和檢索會消耗NameNode內(nèi)存。
可移植性:HDFS是由Java語言構(gòu)建,任何支持Java的機器,都可以運行HDFS,因此HDFS可以輕松地從一個平臺移植到另一個平臺。
三、HDFS組成架構(gòu)
1、Client:客戶端
通過Client來訪問文件系統(tǒng),然后由Client與NameNode和DataNode進(jìn)行通信。Client對外作為文件系統(tǒng)的接口
- 文件切分,上傳HDFS文件的時候,Client將文件切分成一個一個 Block 然后進(jìn)行上傳;
- 負(fù)責(zé)與 NameNode 和 DataNode 交互,獲取文件的位置信息;
- Client 提供一些命令來管理HDFS,比如:banlance 數(shù)據(jù)均衡、 fsimage 元數(shù)據(jù)獲取和解析、NameNode 格式化、checkpoint 等;
- Clinet 提供一些命令來訪問HDFS,比如:HDFS文件的增刪改查
2、NameNode
管理者。 用于存儲和管理文件元數(shù)據(jù)、維護(hù)文件系統(tǒng)的目錄樹形結(jié)構(gòu),記錄寫入的每個數(shù)據(jù)塊(Block)與其歸屬文件的對應(yīng)關(guān)系。
- 管理文件系統(tǒng)命名空間;
- 配置副本策略,默認(rèn)3副本策略;
- 管理數(shù)據(jù)塊的映射信息(Blockmap);
- 處理客戶端的讀寫請求。
3、 DataNode
DataNode會通過心跳和NameNode保持通信,處理實際的操作。
- 存儲實際的數(shù)據(jù)塊;
- 執(zhí)行數(shù)據(jù)塊的讀寫操作。
4、 Secondary NameNode
Secondary NameNode的作用是消費EditsLog,定期地合并FsImage和EditsLog,生成新的FsImage文件,并推送給NameNode,降低了NameNode的壓力。 在緊急情況下,可輔助恢復(fù)NameNode。
SecondaryNameNode機制:
- SecondaryNameNode不是NameNode掛了的備用節(jié)點
- 主要功能只是定期合并日志, 防止日志文件變得過大
- 合并過后的鏡像文件在NameNode上也會保存一份
SecondaryNameNode工作過程:
- SNN向NameNode發(fā)起同步請求, 此時NameNode會將日志都寫到新的日志當(dāng)中;
- SNN向NameNode下載鏡像文件和日志文件;
- SNN開始Merge這兩份文件并生成新的鏡像文件;
- SNN向NameNode傳回新的鏡像文件;
- NameNode文件將新的鏡像文件和日志文件替換成當(dāng)前正在使用的文件
四、HDFS讀寫過程
4.1.寫入流程
- client向namenode通信,請求上傳文件
- namenode判斷是否可上傳: namenode檢查用戶是否有上傳的權(quán)限、目標(biāo)文件是否已存在、父目錄是否存在
- 文件切分:client將文件切分成0~128M大小的block塊(邏輯切分)
- client請求block塊的存儲位置
- namenode返回datanode地址dn1、dn2、dn3(默認(rèn)三副本地址)
- client通過FSDataOutputStream模塊請求dn1上傳數(shù)據(jù),建立連接管道(本質(zhì)上是一個 RPC 調(diào)用,建立 pipeline)
- 當(dāng)dn1收到請求后會繼續(xù)調(diào)用dn2, dn2調(diào)用dn3,將整個通信管道建立完成,然后逐級返回client,即圖中的ack校驗
- client開始往dn1上傳第一個Block(先從磁盤讀取數(shù)據(jù)放到一個本地內(nèi)存緩存),以Packet為單位(默認(rèn)64k),dn1收到一個Packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應(yīng)答隊列等待應(yīng)答
- 當(dāng)一個Block傳輸完成之后,client再次請求NameNode上傳第二個Block的服務(wù)器(重復(fù)執(zhí)行4-8步)
- 傳輸完畢之后,客戶端關(guān)閉流資源,并且會告訴hdfs數(shù)據(jù)傳輸完畢,然后hdfs收到傳輸完畢就恢復(fù)元數(shù)據(jù)
4.2.讀取流程
- Client 向 NameNode 發(fā)起 RPC 請求,來確定請求文件 block 所在的位置;
- NameNode 會視情況返回文件的部分或者全部 block 列表,對于每個 block,NameNode 都會返回含有該 block 副本的 DataNode 地址;
- 這些返回的 DataNode 地址,會按照集群拓?fù)浣Y(jié)構(gòu)得出 DataNode 與客戶端的距離,然后進(jìn)行排序,排序兩個規(guī)則:網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)中距離Client近的排靠前;心跳機制中超時匯報的 DataNode 狀態(tài)為 STALE,這樣的排靠后;
- Client 選取排序靠前的 DataNode 來讀取 block,如果客戶端本身就是 DataNode,那么將從本地直接獲取數(shù)據(jù);底層上本質(zhì)是建立 Socket Stream(FSDataInputStream),重復(fù)的調(diào)用父類 DataInputStream 的 read 方法,直到這個塊上的數(shù)據(jù)讀取完畢;
- 當(dāng)讀完列表的 block 后,若文件讀取還沒有結(jié)束,客戶端會繼續(xù)向 NameNode 獲取下一批的 block 列表;
- 讀取完一個 block 都會進(jìn)行 checksum 驗證,如果讀取 DataNode 時出現(xiàn)錯誤,客戶端會通知 NameNode,然后再從下一個擁有該 block 副本的 DataNode 繼續(xù)讀。
- read 方法是并行的讀取 block 信息,不是一塊一塊的讀??;NameNode 只是返回 Client 請求包含塊的 DataNode 地址,并不是返回請求塊的數(shù)據(jù);
- 最終讀取來所有的 block 會合并成一個完整的最終文件。(摘錄博友)
五、HDFS客戶端常用命令
5.1.HDFS客戶端訪問命令使用
對于客戶端shell命令的具體使用可以查看 help 幫助, 熟悉Linux 常用命令的人可能一看這些命令就會有種很熟悉對的感覺。
[winner_spark@hdp105 root]$ hdfs dfs -help
如下為常用的命令:
# 創(chuàng)建文件夾
hdfs dfs -mkdir -p /tmp/kangll
# 上傳文件 test.sh 到HDFS
hdfs dfs -put test.sh /tmp/kangll
# 查看文件
hdfs dfs -ls /tmp/kangll
# 下載到本地 /tmp 文件夾
hdfs dfs -get test.sh /tmp/kangll /tmp
# 查看test.sh 文件內(nèi)容 -less 或者 -more也可以
hdfs dfs -cat /tmp/kangll/test.sh
# 查看 文件或者文件夾 大小
hdfs dfs -du -h /tmp/kangll
#判斷當(dāng)前路徑是否存在
hadoop fs -test -d /tmp/kangll
# 文件權(quán)限修改
hdfs dfs -chmod 775 /tmp/kangll/test.sh
hdfs dfs -chown winner_spark:hadoop /tmp/kangll/test.sh
# 刪除test.sh 刪除后的文件會先進(jìn)入 垃圾桶
hdfs dfs -rm -r /tmp/kangll/test.sh
# -cp:從HDFS的一個路徑拷貝到HDFS的另一個路徑
hdfs dfs -cp /tmp/kangll/test.sh /tmp/
# 移動
hdfs dfs -mv /tmp/kangll/test.sh /tmp/
5.2.HDFS客戶端管理命令使用
如下介紹幾個常用的管理命令:
1、報告文件系統(tǒng)的基本信息和統(tǒng)計信息
hdfs dfsadmin -report
執(zhí)行部分結(jié)果如下:
[hdfs@hdp105 root]$ hdfs dfsadmin -report
Configured Capacity: 2253195592704 (2.05 TB)
Present Capacity: 2103420218371 (1.91 TB)
DFS Remaining: 1194928602115 (1.09 TB)
DFS Used: 908491616256 (846.10 GB)
DFS Used%: 43.19%
Replicated Blocks:
Under replicated blocks: 172
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
Low redundancy blocks with highest priority to recover: 0
Pending deletion blocks: 0
Erasure Coded Block Groups:
Low redundancy block groups: 0
Block groups with corrupt internal blocks: 0
Missing block groups: 0
Low redundancy blocks with highest priority to recover: 0
Pending deletion blocks: 0
-------------------------------------------------
Live datanodes (3): # 測試環(huán)境 3個datanode
Name: 192.168.2.152:1019 (hdp103)
Hostname: hdp103
Decommission Status : Normal # 節(jié)點狀態(tài)
Configured Capacity: 751065197568 (699.48 GB)
DFS Used: 302833778688 (282.04 GB)
Non DFS Used: 88004692992 (81.96 GB)
DFS Remaining: 359240115201 (334.57 GB)
DFS Used%: 40.32%
DFS Remaining%: 47.83%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 20
Last contact: Thu Aug 24 14:13:48 CST 2023
Last Block Report: Thu Aug 24 12:32:27 CST 2023
Num of Blocks: 38238
2、fs_image 文件導(dǎo)出解析到本地
獲取Namenode元數(shù)據(jù)fsImage鏡像文件,并且 解析為CSV文件。
# 獲取 fsimage, 獲取到的數(shù)據(jù)到二進(jìn)制文件
hdfs dfsadmin -fetchImage $BASEDIR/data
# 解析,數(shù)據(jù)解析為 csv 文件 , -o 為輸出路徑, -p輸出文件格式
hdfs oiv -i $BASEDIR/data/fsimage_* -o $BASEDIR/fs_distribution/fs_deli -p Delimited -delimiter ","
#可以 查看命令參數(shù)解釋 hdfs oiv -i -help
解析結(jié)果
包含的信息有:路徑,副本數(shù),日期,權(quán)限 ,所屬用戶和組等信息。
3、安全模式
HDFS中,安全模式是一種保護(hù)機制,它可以在NameNode節(jié)點出現(xiàn)故障或異常情況時,防止數(shù)據(jù)丟失或損壞。在安全模式下,HDFS集群只允許讀取數(shù)據(jù),禁止寫入數(shù)據(jù),同時也禁止執(zhí)行元數(shù)據(jù)修改操作。這意味著,當(dāng)NameNode節(jié)點處于安全模式下時,HDFS集群的數(shù)據(jù)將處于只讀狀態(tài),直到NameNode節(jié)點恢復(fù)正常并退出安全模式為止。
hdfs dfsadmin [-safemode enter | leave | get | wait | forceExit]
hdfs dfsadmin 的其他命令:
命令選項 |
描述 |
-report |
報告文件系統(tǒng)的基本信息和統(tǒng)計信息。 |
-safemode enter | leave | get | wait |
安全模式維護(hù)命令。安全模式是Namenode的一個狀態(tài),這種狀態(tài)下,Namenode |
-refreshNodes |
重新讀取hosts和exclude文件,更新允許連到Namenode的或那些需要退出或入編的Datanode的集合。 |
-finalizeUpgrade |
終結(jié)HDFS的升級操作。Datanode刪除前一個版本的工作目錄,之后Namenode也這樣做。這個操作完結(jié)整個升級過程。 |
-upgradeProgress status | details | force |
請求當(dāng)前系統(tǒng)的升級狀態(tài),狀態(tài)的細(xì)節(jié),或者強制升級操作進(jìn)行。 |
-metasave filename |
保存Namenode的主要數(shù)據(jù)結(jié)構(gòu)到hadoop.log.dir屬性指定的目錄下的<filename>文件。對于下面的每一項,<filename>中都會一行內(nèi)容與之對應(yīng) |
-setQuota <quota> <dirname>...<dirname> |
為每個目錄 <dirname>設(shè)定配額<quota>。目錄配額是一個長整型整數(shù),強制限定了目錄樹下的名字個數(shù)。 |
-clrQuota <dirname>...<dirname> |
為每一個目錄<dirname>清除配額設(shè)定。 |
-help [cmd] |
顯示給定命令的幫助信息,如果沒有給定命令,則顯示所有命令的幫助信息。 |
4、文件健康檢查和租約釋放
hdfs文件操作異常沒有正確關(guān)閉連接,造成租約沒有釋放,而程序可以讀取這個文件時獲取不到租約就會報錯。所以需要釋放租約, -retries 3 表示重試三次。
# 健康檢查
hdfs fsck /tmp/kangll/test.sh
# hdfs文件操作異常沒有正確關(guān)閉連接,造成租約沒有方式 需要釋放租約, -retries 3 重試三次
hdfs debug recoverLease -path $LINE -retries 3
執(zhí)行結(jié)果
hdfs fsck 的其他命令:
命令選項 |
描述 |
-move |
把損壞的文件移動到/lost+found |
-delete |
直接刪除損壞的文件 |
-files |
打印被檢測的文件 |
-openforwrite |
打印正在被寫入的文件,可能是文件寫入關(guān)閉異常 |
-includeSnapshots |
檢測的文件包括系統(tǒng)snapShot快照目錄下的 |
list-corruptfileblocks |
打印出丟失的塊和它們所屬的文件列表 |
-blocks |
打印block 信息 |
-locations |
打印 block 的位置,即在哪個節(jié)點 |
-racks |
打印block 所在的 rack |
-storagepolicies |
打印 block 存儲的策略信息 |
-blockId |
打印 block所屬塊的位置信息 |
5、har 歸檔
Hadoop存檔是特殊格式的存檔。Hadoop存檔映射到文件系統(tǒng)目錄。Hadoop歸檔文件總是帶有* .har擴(kuò)展名
- Hadoop存檔目錄包含元數(shù)據(jù)(采用_index和_masterindex形式)
- 數(shù)據(jù)部分data(part- *)文件。
- _index文件包含歸檔文件的名稱和部分文件中的位置。
hadoop archive -archiveName $fileName -p $src $subSrc $dest
歸檔啟動MR任務(wù)執(zhí)行完成后:?
har 歸檔雖然對 文件進(jìn)行了歸檔 減少了 block 數(shù)量,但是har 歸檔并沒有壓縮數(shù)據(jù)。
5.3. HDFS 命令總體劃分
Admin Commands:
命令 |
描述 |
cacheadmin |
配置 HDFS 緩存 |
crypto |
配置HDFS加密區(qū) |
debug |
執(zhí)行Debug Admin命令執(zhí)行HDFS的Debug命令 |
dfsadmin |
運行DFS管理客戶端 |
dfsrouteradmin |
管理基于路由的聯(lián)邦 |
ec |
運行HDFS ErasureCoding 客戶端 |
fsck |
運行DFS文件系統(tǒng)檢查工具 |
haadmin |
運行DFS HA 管理客戶端 |
jmxget |
從NameNode或DataNode獲取JMX導(dǎo)出的值 |
oev |
an edits file 應(yīng)用于 離線 edits viewer |
oiv |
an fsimage 應(yīng)用于離線 fsimage viewer |
oiv_legacy |
apply the offline fsimage viewer to a legacy fsimage |
storagepolicies |
list/get/set block storage policies |
Client Commands:
命令 |
描述 |
classpath |
打印獲取hadoop jar和所需庫所需的類路徑 |
dfs |
在文件系統(tǒng)上運行filesystem命令 |
envvars |
顯示計算的Hadoop環(huán)境變量 |
fetchdt |
從NameNode獲取一個委托令牌 |
getconf |
從配置中獲取配置值 |
groups |
獲取用戶所屬的組 |
lsSnapshottableDir |
列出當(dāng)前用戶擁有的所有可快照目錄 |
Daemon Commands:
命令 |
描述 |
balancer |
運行集群平衡實用程序 |
datanode |
運行DFS datanode |
dfsrouter |
運行DFS路由器 |
diskbalancer |
將數(shù)據(jù)均勻地分布在給定節(jié)點的硬盤上 |
httpfs |
運行HttpFS server, HDFS的HTTP網(wǎng)關(guān) |
journalnode |
運行DFS journalnode |
mover |
運行實用程序以跨存儲類型移動塊副本 |
namenode |
運行DFS namenode |
nfs3 |
運行NFS v3網(wǎng)關(guān) |
portmap |
運行portmap服務(wù) |
對于命令的具體可以可以使用 help 幫助 查看具體使用,我們平時使用做多的就是 hdfs dfs :
[winner_spark@hdp105 root]$ hdfs dfs -help
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>]
[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
[-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] [-v] [-x] <path> ...]
[-expunge]
[-find <path> ... <expression> ...]
[-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
[-head <file>]
[-help [cmd ...]]
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touch [-a] [-m] [-t TIMESTAMP ] [-c] <path> ...]
[-touchz <path> ...]
[-truncate [-w] <length> <path> ...]
[-usage [cmd ...]]
HDFS 知識框架圖:?
?
?————————————————
參考鏈接:Hadoop --- HDFS介紹_hadoop hdfs_三水寫代碼的博客-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-680334.html
參考鏈接:Hadoop之HDFS簡介_hadoop的hdfs_數(shù)新網(wǎng)絡(luò)的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-680334.html
到了這里,關(guān)于【Hadoop】HDFS讀寫流程和客戶端命令使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!