Hadoop大資料實戰系列文章之HDFS檔案系統

testingbang發表於2020-11-06

Hadoop 附帶了一個名為 HDFS(Hadoop分散式檔案系統)的分散式檔案系統,專門

儲存超大資料檔案,為整個 Hadoop 生態圈提供了基礎的儲存服務。

本章內容:

1) HDFS 檔案系統的特點,以及不適用的場景

2) HDFS 檔案系統重點知識點:體系架構和資料讀寫流程

3) 關於操作 HDFS 檔案系統的一些基本使用者命令

1. HDFS 特點 :

HDFS 專為解決大資料儲存問題而產生的,其具備了以下特點:

1) HDFS 檔案系統可儲存超大檔案

每個磁碟都有預設的資料塊大小,這是磁碟在對資料進行讀和寫時要求的最小單位,檔案系統是要構建於磁碟上的,檔案系統的也有塊的邏輯概念,通常是磁碟塊的整數倍,通常檔案系統為幾千個位元組,而磁碟塊一般為 512個位元組。

HDFS 是一種檔案系統,自身也有塊(block)的概念,其檔案塊要比普通單一磁

盤上檔案系統大的多,預設是 64MB。

HDFS 上的塊之所以設計的如此之大,其目的是為了最小化定址開銷。

HDFS檔案的大小可以大於網路中任意一個磁碟的容量,檔案的所有塊並不需要儲存在一個磁碟上,因此可以利用叢集上任意一個磁碟進行儲存,由於具備這種分散式儲存的邏輯,所以可以儲存超大的檔案,通常 G、T、P 級別。

2) 一次寫入,多次讀取

一個檔案經過建立、寫入和關閉之後就不需要改變,這個假設簡化了資料一致性的問題,同時提高資料訪問的吞吐量。

3) 執行在普通廉價的機器上

Hadoop 的設計對硬體要求低,無需昂貴的高可用性機器上,因為在 HDFS 設計中充分考慮到了資料的可靠性、安全性和高可用性。

2. 不適用於 於 HDFS 的場景:

1) 低延遲

HDFS 不適用於實時查詢這種對延遲要求高的場景,例如:股票實盤。往往應對低延遲資料訪問場景需要透過資料庫訪問索引的方案來解決,Hadoop 生態圈中的Hbase 具有這種隨機讀、低延遲等特點。

2) 大量小檔案

對於 Hadoop 系統,小檔案通常定義為遠小於HDFS的block size (預設64MB)的檔案,由於每個檔案都會產生各自的MetaData後設資料,Hadoop透過Namenode來儲存這些資訊,若小檔案過多,容易導致 Namenode 儲存出現瓶頸。

3) 多使用者更新

為了保證併發性,HDFS 需要一次寫入多次讀取,目前不支援多使用者寫入,若要修改,也是透過追加的方式新增到檔案的末尾處,出現太多檔案需要更新的情況,Hadoop是不支援的。針對有多人寫入資料的場景,可以考慮採用 Hbase 的方案。

4) 結構化資料

HDFS適合儲存半結構化和非結構化資料,若有嚴格的結構化資料儲存場景,也可以考慮採用 Hbase 的方案。

5) 資料量並不大

通常 Hadoop 適用於 TB、PB 資料,若待處理的資料只有幾十 GB 的話,不建議使用 Hadoop,因為沒有任何好處。

3. HDFS 體系 架構

HDFS 是一個主/從(Master/Slave)體系架構,由於分散式儲存的性質,叢集擁有兩類節點 NameNode 和 DataNode。

NameNode(名位元組點):系統中通常只有一個,中心伺服器的角色,管理儲存和檢索多個 DataNode 的實際資料所需的所有後設資料。

DataNode(資料節點):系統中通常有多個,是檔案系統中真正儲存資料的地方,在NameNode 統一排程下進行資料塊的建立、刪除和複製。

Hadoop大資料實戰系列文章之HDFS檔案系統

圖中的 Client 是 HDFS 的客戶端,是應用程式可透過該模組與 NameNode 和DataNode 進行互動,進行檔案的讀寫操作。

4. HDFS 資料塊複製

為了系統容錯,檔案系統會對所有資料塊進行副本複製多份,Hadoop 是預設 3 副本管理。

Hadoop大資料實戰系列文章之HDFS檔案系統

複本管理策略是執行客戶端的節點上放一個複本(若客戶端執行在叢集之外,會隨機選擇一個節點),第二個複本會放在與第一個不同且隨機另外選擇的機架中節點上,第三個複本與第二個複本放在相同機架,切隨機選擇另一個節點。所存在其他複本,則放在叢集中隨機選擇的節點上,不過系統會盡量避免在相同機架上放太多複本。

所有有關塊複製的決策統一由NameNode負責,NameNode會週期性地接受叢集中資料節點 DataNode 的心跳和塊報告。一個心跳的到達表示這個資料節點是正常的。一個塊報告包括該資料節點上所有塊的列表。

5. HDFS 讀取 和 寫入 流程

1) 讀檔案的過程:

Hadoop大資料實戰系列文章之HDFS檔案系統

首先 Client 透過 File System 的 Open 函式開啟檔案,Distributed File System 用RPC 呼叫 NameNode 節點,得到檔案的資料塊資訊。對於每一個資料塊,NameNode節點返回儲存資料塊的資料節點的地址。Distributed File System 返回FSDataInputStream 給客戶端,用來讀取資料。客戶端呼叫 stream 的 read()函式開始讀取資料。DFSInputStream 連線儲存此檔案第一個資料塊的最近的資料節點。DataNode從資料節點讀到客戶端(client),當此資料塊讀取完畢時,DFSInputStream關閉和此資料節點的連線,然後連線此檔案下一個資料塊的最近的資料節點。當客戶端讀取完畢資料的時候,呼叫 FSDataInputStream的 close 函式。

在讀取資料的過程中,如果客戶端在與資料節點通訊出現錯誤,則嘗試連線包含此資料塊的下一個資料節點。失敗的資料節點將被記錄,以後不再連線。

2) 寫檔案的過程:

Hadoop大資料實戰系列文章之HDFS檔案系統

客戶端呼叫 create()來建立檔案,Distributed File System用RPC呼叫NameNode節點,在檔案系統的名稱空間中建立一個新的檔案。NameNode節點首先確定檔案原來不存在,並且客戶端有建立檔案的許可權,然後建立新檔案。

Distributed File System返回DFSOutputStream,客戶端用於寫資料。客戶端開始寫入資料,DFSOutputStream 將資料分成塊,寫入 Data Queue。Data Queue 由 DataStreamer讀取,並通知NameNode節點分配資料節點,用來儲存資料塊(每塊預設複製3塊)。分配的資料節點放在一個Pipeline裡。Data Streamer將資料塊寫入Pipeline中的第一個資料節點。第一個資料節點將資料塊傳送給第二個資料節點。第二個資料節點將資料傳送給第三個資料節點。

DFSOutputStream為發出去的資料塊儲存了Ack Queue,等待Pipeline中的資料節點告知資料已經寫入成功。

6. 操作 HDFS 的 基本 命令

1) 列印檔案列表(ls)

標準寫法:

hadoop fs -ls hdfs:/ #hdfs: 明確說明是 HDFS 系統路徑

簡寫:

hadoop fs -ls / #預設是 HDFS 系統下的根目錄

列印指定子目錄:

hadoop fs -ls /package/test/ #HDFS 系統下某個目錄

2) 上傳檔案、目錄(put、copyFromLocal)

put 用法:

上傳新檔案:

hdfs fs -put file:/root/test.txt hdfs:/ #上傳本地 test.txt檔案到HDFS根目錄,HDFS

根目錄須無同名檔案,否則“File exists”

hdfs fs -put test.txt /test2.txt #上傳並重新命名檔案。

hdfs fs -put test1.txt test2.txt hdfs:/ #一次上傳多個檔案到 HDFS 路徑。

上傳資料夾:

hdfs fs -put mypkg /newpkg #上傳並重新命名了資料夾。

覆蓋上傳:

hdfs fs -put -f /root/test.txt / #如果 HDFS 目錄中有同名檔案會被覆蓋

copyFromLocal 用法:

上傳檔案並重新命名:

hadoop fs -copyFromLocal file:/test.txt hdfs:/test2.txt

覆蓋上傳:

hadoop fs -copyFromLocal -f test.txt /test.txt

3) 下載檔案、目錄(get、copyToLocal)

get 用法:

複製檔案到本地目錄:

hadoop fs -get hdfs:/test.txt file:/root/

複製檔案並重新命名,可以簡寫:

hadoop fs -get /test.txt /root/test.txt

copyToLocal 用法

複製檔案到本地目錄:

hadoop fs -copyToLocal hdfs:/test.txt file:/root/

複製檔案並重新命名,可以簡寫:

hadoop fs -copyToLocal /test.txt /root/test.txt

4) 複製檔案、目錄(cp)

從本地到 HDFS,同 put

hadoop fs -cp file:/test.txt hdfs:/test2.txt

從 HDFS 到 HDFS

hadoop fs -cp hdfs:/test.txt hdfs:/test2.txt

hadoop fs -cp /test.txt /test2.txt

5) 移動檔案(mv)

hadoop fs -mv hdfs:/test.txt hdfs:/dir/test.txt

hadoop fs -mv /test.txt /dir/test.txt

6) 刪除檔案、目錄(rm)

刪除指定檔案

hadoop fs -rm /a.txt

刪除全部 txt 檔案

hadoop fs -rm /*.txt

遞迴刪除全部檔案和目錄

hadoop fs -rm -R /dir/

7) 讀取檔案(cat、tail)

hadoop fs -cat /test.txt #以位元組碼的形式讀取

hadoop fs -tail /test.txt

8) 建立空檔案(touchz)

hadoop fs - touchz /newfile.txt

9) 建立資料夾(mkdir)

hadoop fs -mkdir /newdir /newdir2 #可以同時建立多個

hadoop fs -mkdir -p /newpkg/newpkg2/newpkg3 #同時建立父級目錄

10) 獲取邏輯空間檔案、目錄大小(du)

hadoop fs - du / #顯示 HDFS 根目錄中各檔案和資料夾大小

hadoop fs -du -h / #以最大單位顯示 HDFS 根目錄中各檔案和資料夾大小

hadoop fs -du -s / #僅顯示 HDFS 根目錄大小。即各檔案和資料夾大小之和


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942496/viewspace-2732505/,如需轉載,請註明出處,否則將追究法律責任。

相關文章