Hadoop (HDFS)
Hadoop Distributed File System焕济,分布式文件系統(tǒng)
架構(gòu)中的基本概念
-
block
- 基本存儲單位,一般64M盔几,比數(shù)據(jù)庫中的頁要大很多
- 基本的讀寫單位晴弃,類似于磁盤的頁,每次都是讀寫一個塊
- 每個塊都會被復(fù)制到多臺機器逊拍,默認(rèn)復(fù)制3份
- 配置大的block 減少搜尋時間肝匆,一般硬盤傳輸速率比尋道時間要快,大的塊可以減少尋道時間
- 每個塊都需要在NameNode上有對應(yīng)的記錄
- 對數(shù)據(jù)塊進行讀寫顺献,減少建立網(wǎng)絡(luò)的連接成本
- 一個大文件會被拆分成一個個的塊,然后存儲于不同的機器枯怖。如果一個文件少于Block大小注整,那么實際占用的空間為其文件的大小
-
NameNode
- 存儲文件的metadata,運行時所有數(shù)據(jù)都保存到內(nèi)存度硝,整個HDFS可存儲的文件數(shù)受限于NameNode的內(nèi)存大小
- 一個Block在NameNode中對應(yīng)一條記錄(一般一個block占用150字節(jié))肿轨,如果是大量的小文件,會消耗大量內(nèi)存蕊程。同時map task的數(shù)量是由splits來決定的椒袍,所以用MapReduce處理大量的小文件時,就會產(chǎn)生過多的map task藻茂,線程管理開銷將會增加作業(yè)時間驹暑。處理大量小文件的速度遠遠小于處理同等大小的大文件的速度玫恳。因此Hadoop建議存儲大文件
- 數(shù)據(jù)會定時保存到本地磁盤,但不保存block的位置信息优俘,而是由DataNode注冊時上報和運行時維護
- NameNode中與DataNode相關(guān)的信息并不保存到NameNode的文件系統(tǒng)中京办,而是NameNode每次重啟后,動態(tài)重建
- NameNode失效則整個HDFS都失效了帆焕,所以要保證NameNode的可用性
-
Secondary NameNode
- 定時與NameNode進行同步,定期合并文件系統(tǒng)鏡像和編輯日志惭婿,然后把合并后的傳給NameNode,替換其鏡像叶雹,并清空編輯日志财饥,類似于CheckPoint機制
- NameNode失效后仍需要手工將其設(shè)置成主機
-
DataNode
- 保存具體的block數(shù)據(jù)
- 負(fù)責(zé)數(shù)據(jù)的讀寫操作和復(fù)制操作
- DataNode啟動時會向NameNode報告當(dāng)前存儲的數(shù)據(jù)塊信息,后續(xù)也會定時報告修改信息
- DataNode之間會進行通信折晦,復(fù)制數(shù)據(jù)塊钥星,保證數(shù)據(jù)的冗余性
HDFS 可靠性
datanode不可靠,datanode定時發(fā)送心跳到Namenode筋遭,如果一段時間namenode沒有datanode的心跳姻氨,則認(rèn)為其失效执俩,這時Namenode就會將該節(jié)點的數(shù)據(jù)從該節(jié)點的復(fù)制節(jié)點中copy到另外的datanode中,來保證datanode的復(fù)制數(shù)[圖片上傳中...(hdfs-read.png-b7387-1550415506760-0)]
數(shù)據(jù)可以毀壞,和datanode失效一樣涯塔,如果通過檢驗碼檢測到數(shù)據(jù)有問題,同樣會復(fù)制一份正確的數(shù)據(jù)到健康的節(jié)點
Namenode也是有可能損壞的琼梆,要注意捶码,namenode損壞后整個HDFS就毀了了,所以要做好Namenode備份工作豁鲤,比如建立HA秽誊,或者把namenode數(shù)據(jù)寫入外部庫
HDFS - 寫文件
- 客戶端發(fā)起將數(shù)據(jù)寫入文件
- 數(shù)據(jù)會先寫入本地臨時文件,當(dāng)臨時文件達到一個block的大小時琳骡,HDFS client通知NameNode锅论,申請寫入文件
- NameNode在HDFS的文件系統(tǒng)中創(chuàng)建文件,并把blockid和datanode的列表返回給客戶端
- 客戶端收到信息楣号,將臨時文件寫入DataNodes
- 客戶端將文件內(nèi)容寫入第一個DataNode最易,一般以4Kb為單位進行傳輸
- 第一個DataNode接收后,將數(shù)據(jù)寫入本地磁盤炫狱,同時也傳輸給第二個DataNode
- 依此類推到最后一個DataNode藻懒,數(shù)據(jù)在DataNode之間是通過pipeline的方式進行復(fù)制的
- 后面的DataNode接收完數(shù)據(jù)后,都會發(fā)送一個確認(rèn)給前一個DataNode视译,最終第一個DataNode返回確認(rèn)給客戶端
- 當(dāng)客戶端接收到整個block的確認(rèn)后嬉荆,會向NameNode發(fā)送一個最終的確認(rèn)信息
- 如果寫入某個DataNode失敗,數(shù)據(jù)會繼續(xù)寫入其他的DataNode酷含。然后NameNode會找另外一個好的DataNode繼續(xù)復(fù)制鄙早,以保證冗余性
- 每個block都會有一個校驗碼汪茧,并存放到獨立的文件中,以便讀的時候來驗證其完整性
- 文件寫完后,客戶端關(guān)閉.NameNode提交文件,這時文件才可見.
HDFS-讀文件
- client向Namenode發(fā)送數(shù)據(jù)請求
- NameNode返回記錄的文件的block和block所在的所有的datanode蝶锋,包含復(fù)制節(jié)點
- client直接從DataNode中讀取數(shù)據(jù)陆爽,如果datanode讀取失敗則從復(fù)制節(jié)點中讀取
HDFS 命令
- fsck :檢查文件的完整性
- start-balancer.sh 重新平衡HDFS
- hdfs dfs -copyFromLocal 從本地磁盤復(fù)制文件到HDFS
- 未完待續(xù)