1. 程式人生 > >HDFS(hadoop distributed File System)詳解

HDFS(hadoop distributed File System)詳解

 

HDFS(hadoop distributed File System)分散式檔案系統

    特點:高容錯性(多個文字副本儲存),價格低,高吞吐量。

    常見的系統  gfs,HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS。

    Hdfs總體上採用了master/slave 架構,主要由以下幾個元件組成:Client 、NameNode 、Secondary namenode 和DataNode

 

HDFS結構圖

一個HDFS叢集是有一個 Namenode和一定數目的 Datanode組成。 Namenode是一箇中心伺服器,負責管理檔案系統的 namespace和客戶端對檔案的訪問。

Namenode:執行nameSpace,一個檔案會被分為多個block,nameNode決定block會被對映到那個datanode, Datanode Namenode的指揮下進行 block的建立、刪除和複製。

 

HDFS讀寫原理

1. 客戶端要向HDFS寫資料,首先要跟namenode通訊以確認可以寫檔案並獲得接收檔案block的datanode,然後,客戶端按順序將檔案逐個block傳遞給相應datanode,並由接收到block的datanode負責向其他datanode複製block的副本

 

傳送過程是以流式寫入,檔案會被分為Block塊。

1. 客戶端將要讀取的檔案路徑傳送給namenode,namenode獲取檔案的元資訊(主要是block的存放位置資訊)返回給客戶端,客戶端根據返回的資訊找到相應datanode逐個獲取檔案的block並在客戶端本地進行資料追加合併從而獲得整個檔案 

 

HFDS架構

 

核心目標,因為硬體的錯誤是常態,而非異常情況,hdfs由上千個節點組成,所以hdfs的核心目標是錯誤檢測和快速,自動的恢復。

主要以流式讀取,做批處理。

1 master和slave架構

主要角色:NameNode,dataNode,scendaryNameNode。

NameNode是master節點,大領導,負責管理整個hdfs,以及檔案目錄樹和檔案和目錄。和資料塊的對映,處理客戶端的讀寫請求,具體包括namespace(檔案目錄)和block管理( 其中包括 filename->block,block->datanode list的對應關係)。

NameNode提供的是始終被動接收服務的server,主要有三類協議介面:ClientProtocol介面、DatanodeProtocol介面、NamenodeProtocol介面。

 

 

dataNode slave節點,用來幹活,主要是用來存取資料,(一個是塊管理(datanode之間的聯絡),一個物理儲存)。hdfs將檔案拆分為多個block,block存在一個或者多個datanode中。執行資料塊的讀寫操作。

 

secondaryNameNode 是NameNode的冷備份。

合併fsimage和fsedits然後再發給namenode。預設是1小時,定期查詢,減少Namenode的負擔。

 

 

 NameNode的核心是FSNamesysem,包括Fsdirectory(管理目錄),blocksMAP(維護塊資訊), LeaseManagr維護租約資訊;此外,還通過DatanodeDescriptor、corruptReplicas等維護資料結點(DN)狀態、壞副本等資訊;

fsname->block列表的對映

所有有效blocks集合

block與其所屬的datanodes之間的對映(該對映是通過block reports動態構建的,維護在namenode的記憶體中。每個datanode在啟動時向namenode報告其自身node上的block)

每個datanode與其上的blocklist的對映

採用心跳檢測根據LRU演算法更新的機器(datanode)列表

FSNamesystem體系結構

 

FSDirectory

FSDirectory用於維護當前系統中的檔案樹,儲存整個檔案系統的目錄狀態 FSDirectory通過FSImage及FSEditLog儲存目錄結構的某一時刻映象及對映象的修改(從namenode本地磁碟讀取元資料資訊和向本地磁碟寫入元資料資訊,並登記對目錄結構所作的修改到日誌檔案);另外,FSDirectory儲存了檔名和資料塊的對映關係。

 

 

blocksMAP  namenode中是通過block->datanode list的方式來維護一個block的副本是儲存在哪幾個datanodes上的對應關係的。

 

 

hdfs工作原理

a. Client將FileA按64M分塊。分成兩塊,block1和Block2;

 

b. Client向nameNode傳送寫資料請求,如圖藍色虛線①------>。

 

c. NameNode節點,記錄block資訊。並返回可用的DataNode,如粉色虛線②--------->。

 

    Block1: host2,host1,host3

 

    Block2: host7,host8,host4

---------------------

原理:

 

        NameNode具有RackAware機架感知功能,這個可以配置。

 

        若client為DataNode節點,那儲存block時,規則為:副本1,同client的節點上;副本2,不同機架節點上;副本3,同第二個副本機架的另一個節點上;其他副本隨機挑選。

 

        若client不為DataNode節點,那儲存block時,規則為:副本1,隨機選擇一個節點上;副本2,不同副本1,機架上;副本3,同副本2相同的另一個節點上;其他副本隨機挑選。

 

d. client向DataNode傳送block1;傳送過程是以流式寫入。

 

流式寫入過程,

 

        1>將64M的block1按64k的package劃分;

 

        2>然後將第一個package傳送給host2;

 

        3>host2接收完後,將第一個package傳送給host1,同時client想host2傳送第二個package;

 

        4>host1接收完第一個package後,傳送給host3,同時接收host2發來的第二個package。

 

        5>以此類推,如圖紅線實線所示,直到將block1傳送完畢。

 

        6>host2,host1,host3向NameNode,host2向Client傳送通知,說“訊息傳送完了”。如圖粉紅顏色實線所示。

 

        7>client收到host2發來的訊息後,向namenode傳送訊息,說我寫完了。這樣就真完成了。如圖黃色粗實線

 

        8>傳送完block1後,再向host7,host8,host4傳送block2,如圖藍色實線所示。

 

        9>傳送完block2後,host7,host8,host4向NameNode,host7向Client傳送通知,如圖淺綠色實線所示。

 

        10>client向NameNode傳送訊息,說我寫完了,如圖黃色粗實線。。。這樣就完畢了。

---------------------

 

Hadoop檔案的常用操作:

 檢視檔案命令,可以列出path目錄下的內容,包括檔名,許可權,所有者,大小和修改時間等。

 命令格式 

 hdfs dfs -ls path    檢視檔案列表 

 hdfs dfs -lsr path   遞迴檢視檔案列表

 hdfs dfs -du path   檢視path下的磁碟情況,單位位元組 

 使用示例 hdfs dfs -ls /   檢視當前目錄 hdfs dfs -lsr /   遞迴檢視當前目錄

 建立資料夾

 命令格式 hdfs dfs -mkdir path 

 使用示例 hdfs dfs -mkdir /user/trunk

 建立檔案

 命令格式: 

 hdfs dfs -touchz path 使用示例: hdfs dfs -touchz /user/test1.txt 

賦予許可權

命令格式 hdfs dfs –chmod [許可權引數][擁有者][組] path 使用示例 hdfs dfs –chmod 777 /user/test.txt 許可權: 

讀(r):4; 寫(w):2; 執行(x):1

上傳檔案

命令格式 hdfs dfs - put 原始檔夾  目標資料夾 

使用示例 hdfs dfs -put /home/hadoop/data/record     /guide/todayData 

 上傳record整個資料夾(含資料夾) 

hdfs dfs -put /home/hadoop/data/record/*   /guide/todayData  

上傳record中的所有檔案(不含資料夾) 

類似命令 hdfs dfs -copyFromLocal 原始檔夾  目標資料夾  

作用同put hdfs dfs -moveFromLocal 原始檔夾  目標資料夾  上傳後刪除本地

下載檔案

命令格式 hdfs dfs -get 原始檔夾  目標資料夾 

類似上傳命令 

類似命令 hdfs dfs -copyToLocal 原始檔夾  目標資料夾 

作用同get hdfs dfs -moveToLocal 原始檔夾  目標資料夾  get後刪除原始檔

檢視檔案

內容命令格式 hadoop fs -cat path 

從頭檢視這個檔案

 hadoop fs -tail path 從尾部檢視最後1K 

使用示例 

 hadoop fs -cat /user/trunk/test.txt

 hadoop fs -tail /user/trunk/test.txt

 

fs  VS  dfs從兩個命令的定義中可以看到這兩者之間似乎沒有什麼區別。

 fs涉及到一個通用的檔案系統,使用面最廣,可以指向任何的檔案系統,如local,hdfs等。 

但是dfs僅是針對hdfs的,只能操作HDFS檔案系統相關,包括與Local FS間的操作。 什麼時候用dfs,什麼時候用fs? 

絕大部分都可以使用dfs命令。 僅在本地與hadoop分散式檔案系統的互動操作中,可以考慮使用fs命令。

 hadoop fs  VS  hdfs dfs 兩者的相同和不同。