(第3篇)HDFS是什麼?HDFS適合做什麼?我們應該怎樣操作HDFS系統?

    HDFS文件系統

Hadoop 附帶了一個名爲 HDFS(Hadoop分佈式文件系統)的分佈式文件系統,專門存儲超大數據文件,爲整個Hadoop生態圈提供了基礎的存儲服務。

本章內容:

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

2) HDFS文件系統重點知識點:體系架構和數據讀寫流程

3) 關於操作HDFS文件系統的一些基本用戶命令

1. HDFS特點

HDFS專爲解決大數據存儲問題而產生的,其具備了以下特點:

1) HDFS文件系統可存儲超大文件

每個磁盤都有默認的數據塊大小,這是磁盤在對數據進行讀和寫時要求的最小單位,文件系統是要構建於磁盤上的,文件系統的也有塊的邏輯概念,通常是磁盤塊的整數倍,通常文件系統爲幾千個字節,而磁盤塊一般爲512個字節。

HDFS是一種文件系統,自身也有塊(block)的概念,其文件塊要比普通單一磁盤上文件系統大的多,默認是64MB

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

HDFS文件的大小可以大於網絡中任意一個磁盤的容量,文件的所有塊並不需要存儲在一個磁盤上,因此可以利用集羣上任意一個磁盤進行存儲,由於具備這種分佈式存儲的邏輯,所以可以存儲超大的文件,通常GTP級別

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適用於TBPB數據,若待處理的數據只有幾十GB的話,不建議使用Hadoop,因爲沒有任何好處。

3. HDFS體系架構

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

NameNode(名字節點):系統中通常只有一個,中心服務器的角色,管理存儲和檢索多個DataNode的實際數據所需的所有元數據

DataNode(數據節點):系統中通常有多個,是文件系統中真正存儲數據的地方,在NameNode統一調度下進行數據塊的創建、刪除和複製。

 wKioL1i9KcmCIznvAAB4PhOoKbo579.png

圖中的ClientHDFS的客戶端,是應用程序可通過該模塊與NameNode和DataNode進行交互,進行文件的讀寫操作。

4. HDFS數據塊複製

爲了系統容錯,文件系統會對所有數據塊進行副本複製多份,Hadoop是默認3副本管理。

wKioL1i9KpyiQG9YAACGRYANGLE426.png 

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

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

5. HDFS讀取寫入流程

1) 讀文件的過程:

wKioL1i9Kt6Tt0gKAAHxOTzccog276.png 

首先Client通過File System的Open函數打開文件Distributed File System用RPC調用NameNode節點,得到文件的數據塊信息。對於每一個數據塊,NameNode節點返回保存數據塊的數據節點的地址。Distributed File System返回FSDataInputStream給客戶端,用來讀取數據。客戶端調用stream的read()函數開始讀取數據。DFSInputStream連接保存此文件第一個數據塊的最近的數據節點。DataNode從數據節點讀到客戶端(client),當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的連接,然後連接此文件下一個數據塊的最近的數據節點。當客戶端讀取完畢數據的時候,調用FSDataInputStream的close函數。

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

2) 寫文件的過程:

wKiom1i9KuuzYBs4AAJLZczgjOs382.png 

客戶端調用create()來創建文件Distributed File System用RPC調用NameNode節點,在文件系統的命名空間中創建一個新的文件。NameNode節點首先確定文件原來不存在,並且客戶端有創建文件的權限,然後創建新文件。

Distributed File System返回DFSOutputStream,客戶端用於寫數據。客戶端開始寫入數據,DFSOutputStream將數據分成塊,寫入Data Queue。Data Queue由Data Streamer讀取,並通知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) 下載文件、目錄(getcopyToLocal

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根目錄大小。即各文件和文件夾大小之和 


這時,你已經瞭解了HDFS和HDFS的操作命令,接下來我會繼續介紹Mapreduce計算框架,Mapreduce在hadoop中又起到什麼作用呢?

wKioL1jI3sfT2FoQAABC3HPbV6s012.jpg


如何用4個月學會Hadoop開發並找到年薪25萬工作?

 

免費分享一套17年最新Hadoop大數據教程100Hadoop大數據必會面試題

因爲鏈接經常被和諧,需要的朋友請加微信 ganshiyun666 來獲取最新下載鏈接,註明“51CTO”

 

教程已幫助300+人成功轉型Hadoop開發,90%起薪超過20K,工資比之前翻了一倍。

百度Hadoop核心架構師親自錄製

內容包括0基礎入門、Hadoop生態系統、真實商業項目實戰3大部分。其中商業案例可以讓你接觸真實的生產環境,訓練自己的開發能力。

wKioL1mdQGiDPhHeAAAuZtp-5xs706.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章