概念
1.適合一次寫入,多次讀出司致。
2.優(yōu)點:高容錯(多副本)拆吆;適合大數(shù)據(jù);可用廉價服務器
3.缺點:不適合低延時訪問數(shù)據(jù)脂矫;無法高效對大量小文件進行存儲枣耀;不支持并發(fā)寫入;不能隨機修改(只能append)
特點
高容錯 : 由于 HDFS 采用數(shù)據(jù)的多副本方案庭再,所以部分硬件的損壞不會導致全部數(shù)據(jù)的丟失
高吞吐量 : HDFS 設計的重點是支持高吞吐量的數(shù)據(jù)訪問捞奕,而不是低延遲的數(shù)據(jù)訪問。
大文件支持 : HDFS 適合于大文件的存儲佩微,文檔的大小應該是是 GB 到 TB 級別的缝彬。
簡單一致性模型 : HDFS 更適合于一次寫入多次讀取 (write-once-read-many) 的訪問模型。支持將內容追加到文件末尾哺眯,但不支持數(shù)據(jù)的隨機訪問谷浅,不能從文件任意位置新增數(shù)據(jù)
跨平臺移植性 : HDFS 具有良好的跨平臺移植性,這使得其他大數(shù)據(jù)計算框架都將其作為數(shù)據(jù)持久化存儲的首選方案
Block
1.2.x/3.x默認128M奶卓;1.x默認64M一疯;本地模式32M
2.尋址時間為傳輸時間1%最好
3.Block太大,在磁盤上的傳輸時間過長夺姑,Map太少
4.Block太小墩邀,尋址時間過長
5.磁盤傳輸速度決定Block大小
window操作HDFS API只需要hadoop/bin和hadoop.client。依靠jar調用bin里的命令操作盏浙。
讀寫流程
三個單位
1.block是最大的一個單位眉睹,它是最終存儲在DataNode上的數(shù)據(jù)粒度荔茬。由dfs.block.size參數(shù)決定。默認是128M竹海。
2.packet是中等單位慕蔚,它是dfsClient流向DataNode的粒度,以dfs.write.packet.size參數(shù)決定斋配,默認是64kb孔飒。注:這個參數(shù)是參考值,是指真正傳輸時艰争,會以這個參數(shù)為基準進行調整坏瞄。調整的原因是packet特定的結構,調整的目標是這個packet的大小剛好包含結構中所有的元素甩卓,同時也保證寫入DataNode后當前packet的大小不會超過設定值鸠匀。
3.chunk是最小的粒度,是dfsClient流向DataNode進行數(shù)據(jù)校驗的粒度猛频。默認512b
注:事實上一個chunk還包含4b的校驗值狮崩,因而寫入packet時是516b。數(shù)據(jù)與校驗值比例是128:1鹿寻,所以128M的block會有1M的校驗文件與之對應睦柴。
HDFS文件塊目錄結構
${dfs.datanode.data.dir}/
├── current
│ ├── BP-526805057-127.0.0.1-1411980876842
│ │ └── current
│ │ ├── VERSION
│ │ ├── finalized
│ │ │ ├── blk_1073741825
│ │ │ ├── blk_1073741825_1001.meta
│ │ │ ├── blk_1073741826
│ │ │ └── blk_1073741826_1002.meta
│ │ └── rbw
│ └── VERSION
└── in_use.lock
in_use.lock表示DataNode正在對文件夾進行操作
rbw是“replica being written”的意思,該目錄用于存儲用戶當前正在寫入的數(shù)據(jù)毡熏。
Block元數(shù)據(jù)文件(*.meta)由一個包含版本坦敌、類型信息的頭文件和一系列校驗值組成。校驗和也正是存在其中痢法。
寫流程
Client向NameNode發(fā)起RPC請求狱窘。
Namenode會檢查文件是否存才,是否有權限進行操作财搁,成功會為文件創(chuàng)建一個記錄蘸炸,否則讓客戶端拋出異常。
當客戶端開始寫文件尖奔,數(shù)據(jù)流入dfsOutputStream搭儒,dfsOutputStream內會有一個chunk大小的buff,當數(shù)據(jù)寫滿buff(或強制flush)時提茁,會計算checkSum值淹禾,然后填塞進packet。
當一個chunk填塞進packet后茴扁,仍不會立即發(fā)送铃岔,而是積累到一個packet填滿后,將這個packet放入dataqueue隊列峭火。進入dataqueue隊列的packet會被另一個線程按順序取出發(fā)送到datanode毁习。
client還會向NameNode申請blocks智嚷,獲取用來存儲replicas的合適datanode列表,列表大小根據(jù)Namenode中relication的設定而定纺且。
開始以pipline的形式將packet寫入所有replicas中纤勒。開發(fā)庫把packet以流的方式寫入第一個datanode,該datanode把該packet存儲之后隆檀,再傳遞給pipline的下一個datanode,直到最后一個datanode粹湃,最后一個datanode成功存儲返回ack packet(確認消息)恐仑,在pipline里傳遞至客戶端,客戶端開發(fā)庫內部維護著ack queue为鳄,成功收到datanode返回的ack packet后裳仆,會從 ack queue移除相應的packet。
如果傳輸過程中孤钦,有某個datanode出現(xiàn)故障歧斟,開發(fā)庫關閉pipline,出現(xiàn)故障的datanode會被移除偏形,剩余的block會繼續(xù)在剩下的datanode中以pipline的方式傳輸静袖,同時namenode會分配一個新的datanode,保證replicas的設定數(shù)量俊扭。
客戶端完成數(shù)據(jù)寫入后队橙,close掉數(shù)據(jù)流。
注1:生產者消費者模型萨惑,阻塞生產者的條件是dataqueue與ackqueue之和超過了一個block的packet上限
注2:只要寫入達到dfs.replication.min的副本數(shù)(默認1)捐康,寫操作就成功,并且這個塊可以在集群中異步復制庸蔼,直到達到目標副本數(shù)解总。
注3:namenode在addblock動作后不知道block副本元信息,知識返回給客戶端一個LocatedBlock對象姐仅,包含了存放Block的位置花枫。只有接收存儲block成功的消息后才正式記錄block位置。
讀操作:
1.Client向NameNode發(fā)起RPC請求
2.Namenode視情況返回全部或部分Block列表萍嬉,對于每個block乌昔,Namenode都會返回該block拷貝的DataNode地址。
3.客戶端選取離它最近的Datanode讀取block壤追,如果客戶端本身就是DataNode磕道,就直接本地讀取。
4.讀完當前block行冰,關閉與當前DataNode鏈接溺蕉。并選擇下一個block的最佳DataNode
5.當讀取完列表Block伶丐,如果還沒讀完,繼續(xù)向NameNode申請Block列表疯特。
注:讀取完一個block都會進行checksum驗證哗魂,如果讀取datanode時出現(xiàn)錯誤,客戶端會通知namenode漓雅,然后從下一個擁有該block的datanode繼續(xù)讀录别。
網絡拓撲
求路徑和
機架感知
BlockPlacementPolicyDefault(chooseTargetInOrder)
第一個副本在Client所處節(jié)點上。如果客戶端在集群外邻吞,隨機選一個
第二個副本在另一個機架隨機一個節(jié)點
第三個副本在第二個副本的機架的另一個隨機節(jié)點
NN和2NN工作機制
seen_txid:保存一個數(shù)字组题,就是最好一個edits_的數(shù)字
NN
fsImage:HDFS文件系統(tǒng)元數(shù)據(jù)的一個永久性檢查點,包含HDFS文件系統(tǒng)的所有目錄和文件inode的序列化信息
1.第一次啟動生成/之后加載Edits和fsImage鏡像
2.客戶端請求cud
3.cud操作先記錄在Edits.inprogress上
4.cud
2NN
5.2NN定期發(fā)送CheckPoint給NN抱冷,如果需要CheckPoint(edits寫滿或定時)
6.執(zhí)行CheckPoint崔列,滾動edits.inprogress,得到edits,拷貝fsImage旺遮,合成FsImage.ckpt
7.fsImage.ckpt返還給NN赵讯,重命名為新的fsImage
DN工作機制
1.DN:1個block分為兩塊數(shù)據(jù):數(shù)據(jù)本身和元信息(校驗和,長度耿眉,時間戳)
2.啟動去NN注冊
3.返回注冊成功
4.周期性上報塊信息
5.提交心跳(心跳返回結果帶有NameNode給DataNode的命令边翼,如復制數(shù)據(jù)塊到另一個DataNode或刪除數(shù)據(jù)塊),心跳默認3秒一次鸣剪,如果10分鐘沒有收到某個DataNode的心跳讯私,則認為該節(jié)點不可用。
心跳機制
NameNode 不會將任何新的 IO 請求轉發(fā)給標記為死亡的 DataNode, 也不會再使用這些 DataNode 上的數(shù)據(jù)
由于 DataNode 不再可用, 可能會導致某些塊的副本數(shù)小于指定值, NameNode 會跟蹤這些塊, 再必要的時候進行重新復制
數(shù)據(jù)完整性CheckSum
1.當DataNode讀取Block的時候西傀,它會計算CheckSum
2.如果計算后的CheckSum與Block創(chuàng)建時值不一樣斤寇,說明Block已經損壞。
3.Client讀取其他DataNode上的Block
4.常見校驗算法crc(32)拥褂,md5(128)娘锁,sha1(160)
5.DataNode在其他文件創(chuàng)建后周期驗證CheckSum
6.https://blog.csdn.net/qq_27087973/article/details/80401206