摘要: 這篇文章會詳細介紹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文件的大小可以大於網絡中任意一個磁盤的容量,文件的所有塊並不需要存儲在一個磁盤上,因此可以利用集群上任意一個磁盤進行存儲,由於具備這種分布式存儲的邏輯,所以可以存儲超大的文件,通常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統一調度下進行數據塊的創建、刪除和復制。
圖中的Client是HDFS的客戶端,是應用程序可通過該模塊與NameNode和DataNode進行交互,進行文件的讀寫操作。
4. HDFS數據塊復制
為了系統容錯,文件系統會對所有數據塊進行副本復制多份,Hadoop是默認3副本管理。
復本管理策略是運行客戶端的節點上放一個復本(若客戶端運行在集群之外,會隨機選擇一個節點),第二個復本會放在與第一個不同且隨機另外選擇的機架中節點上,第三個復本與第二個復本放在相同機架,切隨機選擇另一個節點。所存在其他復本,則放在集群中隨機選擇的節點上,不過系統會盡量避免在相同機架上放太多復本。
所有有關塊復制的決策統一由NameNode負責,NameNode會周期性地接受集群中數據節點DataNode的心跳和塊報告。一個心跳的到達表示這個數據節點是正常的。一個塊報告包括該數據節點上所有塊的列表。
5. HDFS讀取和寫入流程
1) 讀文件的過程:
首先Client通過File System的Open函數打開文件,Distributed File System用RPC調用NameNode節點,得到文件的數據塊信息。對於每一個數據塊,NameNode節點返回保存數據塊的數據節點的地址。Distributed File System返回FSDataInputStream給客戶端,用來讀取數據。客戶端調用stream的read()函數開始讀取數據。DFSInputStream連接保存此文件第一個數據塊的最近的數據節點。DataNode從數據節點讀到客戶端(client),當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的連接,然后連接此文件下一個數據塊的最近的數據節點。當客戶端讀取完畢數據的時候,調用FSDataInputStream的close函數。
在讀取數據的過程中,如果客戶端在與數據節點通信出現錯誤,則嘗試連接包含此數據塊的下一個數據節點。失敗的數據節點將被記錄,以后不再連接。
2) 寫文件的過程:
客戶端調用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) 下載文件、目錄(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根目錄大小。即各文件和文件夾大小之和 |
這時,你已經了解了HDFS和HDFS的操作命令,接下來我會繼續介紹Mapreduce計算框架,Mapreduce在hadoop中又起到什么作用呢?