摘要:為了保證元數據文件的高可用系統,一般的做法,將設置成一逗號分隔的多個目錄,這個目錄至少不要在一塊磁盤上,最后在不同的機器上。
Hadoop
Hadoop由兩部分組成,分別是分布式文件系統(HDFS)和分布式計算框架MapReduce
HDFS架構圖
負責文件元數據信息的操作以及客戶端的請求
管理HDFS文件系統的命名空間
維護文件樹中所有的文件和文件夾的元數據信息以及文件到快的對應關系和塊到節點的對應關系
單個NameNode支持4000臺DataNode集群
NameNode在內存中保存著整個文件系統的名字空間和文件數據塊的地址映射
元數據文件名,文件目錄結構,文件創建時間,文件副本數,文件權限,每個文件的block列表
fsimage:元數據鏡像文件,里面記錄了自最后一次檢查點之前HDFS文件系統中所有目錄和文件的序列化信息;
注意:Block的位置信息不會保存到fsimage,Block保存在哪個DataNode由DataNode啟動時上報。
edits:操作日志文件,保存了自最后一次檢查點之后所有對HDFS文件的操作,比如:增加文件、重名名文件、刪除文件
在NameNode啟動的時候,先將fsimage中的文件系統元數據信息加載到內存,然后根據edits中的記錄將內存中的元數據同步到最新狀態;所以,這兩個文件一旦損壞或丟失,將導致整個HDFS文件系統不可用。
為了保證元數據文件的高可用系統,一般的做法,將dfs.namenode.name.dir設置成一逗號分隔的多個目錄,這個目錄至少不要在一塊磁盤上,最后在不同的機器上。
為了避免edits文件過大,SecondaryNameNode會按照時間閾值或者大小閾值,周期性的將fsimage和edits合并,然后將最新的fsimage推送給NameNode。
SecondaryNameNode鏡像備份
日志與鏡像的定期合并
DataNode處理文件內容的讀寫請求
一個數據快在DataNode以文件存儲在磁盤上,包括兩個文件,一個是數據本身,一個是元數據,包括數據塊的長度,塊數據的校驗和,以及時間戳
DataNode啟動后,周期性的向NameNode上報所有的塊信息。
每3秒保持一次心跳,如果超過10分鐘沒有收到某個DataNode的心跳,則認為該節點不可用。
文件劃分成塊,默認大小128M,以快為單位,每個快有多個副本(默認3個)存儲不同的機器上。
BlockBlock數據塊是HDFS文件系統基本的存儲單位
小于一個快的文件,不會占據整個快的空間
使用Block有利于容災備份
Hadoop1.x 默認64M,Hadoop2.X默認128M
Block數據塊大小設置較大的原因:
減少文件尋址時間
減少管理快的數據開銷,因每個快都需要在NameNode上有對應的記錄
對數據快進行讀寫,減少建立網絡的連接成本
優點
一個文件的大小可以大于網絡中任意一個磁盤的容量
使用抽象塊而非整個文件作為存儲單元,大大簡化了存儲子系統的設計
塊還非常適合用于數據備份進而提供數據容錯能力和提高可用性
合并流程將hdfs更新記錄寫入一個新的文件--edits.new
將fsimage和edits文件通過http協議發送至secondary namenode
將fsimage和edits合并,生成一個新的文件fsimage.ckpt。
將生成的fsimage.ckpt文件通過http協議發送至NameNode
重命名fsimage.ckpt為fsimage,edits.new為edits
讀流程客戶端通過調用FileSystem對象中的open()方法來讀取需要的數據
DistributedFileSystem會通過RPC協議調用NameNode來確定請求文件塊所在的位置
NameNode只會返回所調用文件中開始的幾個塊而不是全部返回。對于每個返回的塊,都包含塊所在的DataNode的地址。隨后,這些返回的DataNode會按照Hadoop集群的拓撲結構得出客戶端的距離,然后在進行排序。如果客戶端本身就是DataNode,那么它就從本地讀取文件。其次,DistributedFileSystem會向客戶端返回一個支持定位的輸入流對象FSDataInputStream,用于給客戶端讀取數據。FSDataInputStream包含一個DFSInputStream對象,這個對象來管理DataNode和NameNode之間的IO
當以上步驟完成時,客戶端便會在這個輸入流上調用read()方法
DFSInputStream對象中包含文件開始部分數據塊所在的DataNode地址,首先它會連接文件第一個塊最近的DataNode,隨后在數據流中重復調用read方法,直到這個塊讀完為止。
當第一個塊讀取完畢時,DFSInputStream會關閉連接,并查找存儲下一個數據塊距離客戶端最近的DataNode,以上這些步驟對客戶端來說都是透明的。
客戶端按照DFSInputStream打開和DataNode連接返回的數據流的順序讀取該塊,它也會調用NameNode來檢查下一組塊所在的DataNode位置信息。當完成所有塊的讀取時,客戶端則會在DFSInputStream中調用close()方法。
寫流程客戶端發送請求,調用DistributedFileSystem API的create方法去請求namenode,并告訴namenode上傳文件的文件名、文件大小、文件擁有者。
namenode根據以上信息算出文件需要切成多少塊block,以及block要存放在哪個datanode上,并將這些信息返回給客戶端。
客戶端調用FSDataInputStream API的write方法首先將其中一個block寫在datanode上,每一個block默認都有3個副本,并不是由客戶端分別往3個datanode上寫3份,而是由
已經上傳了block的datanode產生新的線程,由這個namenode按照放置副本規則往其它datanode寫副本,這樣的優勢就是快。
寫完后返回給客戶端一個信息,然后客戶端在將信息反饋給namenode。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71563.html
摘要:說明本文所有操作均在環境下進行。任何可以使用來編寫的應用,最終會由編寫。書中分別介紹了如何使用和結合進行開發。工具會創建作業,發送給各個,同時監控整個作業的執行過程。準備好的運行環境之后開始搭建的運行環境,參考單節點集群配置。 說明 本文所有操作均在 linux 環境下進行。 轉載請注明出處。 任何可以使用JavaScript來編寫的應用,最終會由JavaScript編寫。 作為...
閱讀 1402·2021-11-22 09:34
閱讀 1378·2021-09-22 14:57
閱讀 3400·2021-09-10 10:50
閱讀 1370·2019-08-30 15:54
閱讀 3690·2019-08-29 17:02
閱讀 3472·2019-08-29 12:54
閱讀 2611·2019-08-27 10:57
閱讀 3316·2019-08-26 12:24