HDFS原理概念掃盲
1、概述
hdfs檔案系統主要設計為了儲存大檔案的檔案系統;如果有個TB級別的檔案,我們該怎麼儲存呢?分散式檔案系統未出現的時候,一個檔案只能儲存在個伺服器上,可想而知,單個伺服器根本就儲存不了這麼大的檔案;退而求其次,就算一個伺服器可以儲存這麼大的檔案,你如果想開啟這個檔案,效率會高嗎
hdfs的出現就是為了解決上面的問題
hdfs為了滿足大檔案的儲存和可讀性,對資料進行切成多個小塊進行儲存,同時為了保證資料的可靠性,又對每個小塊資料做複製,然後分別儲存到多個節點中
hdfs2.7.3後,預設每個塊的大小是128MB,在hdfs1.0的時候,預設每個塊的大小是64MB
可以通過修改hdfs的配置檔案自定義塊大小
hdfs-site.xml檔案中的dfs.blocksize
預設每個塊的副本數是3,可以通過修改hdfs的配置檔案自定義副本數
hdfs-site.xml的dfs.replication
二、hdfs的結構體系
hdfs是一個分散式的檔案系統,採用主從(master/slave)的結構體系,一個hdfs叢集由NameNode和多個datanode組成,其中namenode作為主節點,DataNode為從節點
Namenode簡稱NN
DataNode簡稱DN
NN的作用
a、儲存元資料資訊
b、元資料儲存兩份,一份在記憶體中,一份在硬碟中
c、儲存檔案、block、datanode的對映關係
DN的作用
a、儲存block資訊
b、block儲存在硬碟中
c、維護block和檔案的對映關係
資料儲存在記憶體中是為了讀取效能,保證效率,資料儲存在硬碟中,為了持久化資料,保證資料不丟失
三、hdfs的優缺點
1、hdfs的優點
a、支援超大檔案
支援超大檔案,這裡的超大檔案幾百MB,幾百GB,甚至TB級別大小的檔案,一般來說hadoop的檔案系統會儲存TB級別或者 PB級別的資料,所以在企業節點中,資料節點可能有上千個
b、檢測和快速 應對 硬體故障
在叢集中 環境中,硬體故障是常見的問題,因為 有上千臺伺服器,這樣會導致高故障率,因此故障檢測和自動 恢復 是hdfs檔案系統 的一個設計目標
c、流式資料訪問
Hdfs的資料處理規模比較大,應用一次要 訪問大量的 資料,同時這些應用一般都是批量處理,而不是使用者互動式 處理,應用程式能以流的形式訪問資料集,主要是資料的吞吐量,而不是訪問速度;適合做離線資料的處理
d、簡化的一致性模型
大部分 hdfs操作檔案時,需要一次 寫入,多次讀取,在 hdfs檔案系統中,一個檔案塊一旦經過 建立,寫入,關閉後就不允許 修改了,在hdfs2.7後 ,才允許對block進行追加修改,但是不能改變已有的資料,這樣簡單的一致性模型,保證資料操作的簡單化
e、高容錯性
資料自動儲存多個 副本,副本丟失自動恢復
f、可構建在廉價的機器上
構建在廉價的機器上,可以啟動通過擴充套件機器 個數裡線性提高儲存能力
2、hdfs的缺點
a、低延遲資料訪問
低延遲資料 ,如果使用者進行互動的應用,比如京東,需要資料在毫秒後者秒級範圍內得到響應,由於 hadoop對高吞吐 模型 做了優化,犧牲了獲取資料的延遲,所以對於低延時的應用,不適合 用hadoop,而且hdfs的資料也不是結構化的資料
b、不適合大量小檔案
Hdfs支援超大的檔案,是通過資料分別在不同的資料節點,資料的元資料儲存在namenode上,namenode的記憶體大小決定了hdfs可以儲存的檔案數量,雖然現在 記憶體已經很大,但是大量的 小檔案還是會 影響namenode的節點效能,每個block會佔用一片記憶體空間
c、不支援多次寫入檔案,修改檔案
為了保證吞吐量,設計為這樣
四、hdfs的技術細節
1、Block
資料塊(block)是hdfs儲存檔案的基本單位
在hdfs中,有一個特別重要的概念,資料塊(block),前面介紹過,在hdfs儲存的檔案都是超大資料的檔案,我們可以把這個超大規模的檔案以一個標準切分成幾塊,分別儲存到不同的磁碟上,這個標準就是block
a、為了儲存大檔案,一個伺服器很難儲存超大型的檔案,拆分的話,檔案塊可以儲存在不同的磁碟,在hdfs檔案系統中,一個檔案可以分成不同的block儲存在不同的磁碟上
b、簡化儲存系統,這樣就不需要管理檔案,而是直接管理檔案塊就可以了
c、有利於資料的複製,在hdfs系統中,一個block塊一般會複製三份(可以修改),比如複製一個1TB的資料和複製多個128MB的檔案複製哪個更快?
對於一個檔案而言,一個block id從0開始,按照固定的大小,順序對檔案進行劃分和編號,劃分好的每一塊稱一個block。Hdfs預設的block的大小是128MB,所以一個256MB的檔案,共有256/128=2個塊
不同於普通的檔案系統(比如ext4或者ntfs),hdfs中,如果一個檔案小於一個數據塊的大小,並不用佔用整個資料儲存空間,而是僅僅會佔用檔案實際大小的空間
2、Namenode
Namenode是維護hdfs中的元資訊,包括檔案和block之間的對映關係,block數量的資訊,block和datanode之間的關係資訊,資料格式參照入下
Filename replicas block-ids id2host /test/log,3,{b1,b2},{b1:[host0,host1,host2]} ,{b2:[host3,host4,host5]}
Namenode中的元資料資訊儲存在記憶體/磁碟中,記憶體中為實時資訊,磁碟中為資料的持久化儲存使用使用
在磁碟中儲存的資訊主要下面兩個
fsimage:元資料的映象檔案,儲存namenode元資料資訊
edit:操作日誌檔案(比如你上次,追加內容,這裡只有寫操作的日誌,讀操作不會記錄)
下面重點講一下這2個檔案流程
上面的流程如果明白了,就會發現有2個問題
a、一般namenode會持續執行,不會被啟動,那麼edit檔案會增長很大,這個時候就不好管理
b、如果edit檔案增長到很大,那麼每次namenode啟動合併edit檔案和fsimage就會很久,那namenode啟動就會很慢
這個時候就有了SNN(second NameNode)
聽名字,大家以為SNN是NN的熱備份,其實SNN是NN的協助者,幫助進行元資料合併的
a、SNN會定時通過http的get方法從NN獲取最新的edit和fsimage檔案
b、然後NN會生成一個空的edit檔案,該檔案繼續接受client的i寫請求操作日誌
c、SNN拿到最新的edit檔案和fsimage檔案,進行合併,生成最新的fsimage檔案
d、SNN通過http的post方法把最新的fsimage檔案傳送到NN
e、這樣就把上面那2個檔案解決了
觸發checkpoint的條件有3個
a、預設是3600s合併一次,可以通過修改fs.checkpoint.period自定義
b、根據edit.log檔案的大小觸發合併,預設是64MB會觸發合併,可以通過修改fs.checkpoint.size自定義
3、Datanode
在hadoop中,資料是存放在datanode上面的,是以block的形式儲存的,datanode節點會不斷的向namenode節點發送心跳報告,初始化,每個資料節點將當前儲存的資料告知namenode節點,通過向namenode主動傳送心跳保持聯絡,3s會發送一次
Datanode節點在工作的過程中,資料節點仍會不斷的更新namenode節點與之對應的元資料資訊,並接受來自namenode節點的指令,建立,移動或者刪除本地磁碟上的資料塊
如果10min都沒有收到nd的心跳,則認為其已經掛了,並copy其上的block到其他dn
五、hdfs的執行流程
1、讀資料流程
a、client向遠端namenode發起讀請求
b、NN會視情況返回檔案的部分或者全部block列表,對於每個block,namenode都會返回該block的地址和副本的DN的地址
c、客戶端會選取最接近的DN來讀取block
d、讀取完當前的block的資料後,關閉與當前的DN的連線,併為讀取下一個block尋找最佳的DN
e、當讀完列表的block後,且檔案讀取還沒有結束,客戶端會繼續向NN獲取下一批的block列表
f、讀取完一個block都會進行checksum驗證,如果讀取的時候出現錯誤,client會通知NN,然後在從下一個擁有該block塊的DN繼續讀取資料
2、寫資料流程
a、client向namenode發起寫請求
b、NN會檢查路徑是否存在、許可權是否正確、檔案是否存在
c、條件滿足後,client開始寫入檔案,首先開發庫會將檔案拆分成多個packets,並在內部以資料佇列的形式來管理這些packet,並向NN申請新的blocks,獲取用來儲存block和副本的DN的列表,
d、開始已經pipiline(管道)的形式將packet寫入到第一個DN中,當第一個DN寫入成功後,在將其傳遞給下一個DN,直到最後一個DN儲存完成
e、然後開始上傳下一個packet
3、刪除流程
a、現在NN上執行節點名字的刪除
b、當NN上執行delete方式時,他這是標記操作涉及需要被刪除的資料塊,而不是主動聯絡這些資料塊所在的DN節點
c、當儲存這些資料庫的DN節點向NN節點發送心跳時,在心跳應答裡,NN會向DN發出指令,從而把資料刪除
d、所以在執行delete方法後一段時間內,資料塊才會被刪除掉
&n