HDFS總結
目錄
3、重新格式化namenode(切換到hadoop目錄下的bin目錄下)
4、重新啓動hadoop集羣(切換到hadoop目錄下的sbin目錄下)
6.使用hadoop dfsadmin -report查看使用情況
一、概述
- 在HDFS中,存在兩類主要的節點:NameNode 和DataNode
- NameNode負責管理DataNode,DataNode負責存儲數據
- 在存儲數據的時候會將數據進行切塊
- 爲了防止產生數據丟失,會將數據進行備份,備份稱之爲複本 - replication。在Hadoop中,默認複本數量爲3 備份兩次+之前的
1.指定NameNode的地址
2.指定DataNode的數據存放目錄
僞分佈式配置副本數遍必須爲1
二、Block
- 在存儲數據的時候會將數據進行切塊,每一個塊稱之爲是一個Block 一個文件切割多個Block
- Block是HDFS的基本存儲單位
- 在Hadoop2.0版本中,每一個Block默認是128M。可以通過dfs.blocksize來更改塊的大小,在更改的時候,單位是字節
- 如果一個文件的大小不足128M,那麼這個文件是多大在HDFS上就佔多大的地方
- 在HDFS中,會對Block進行編號 - BlockID
- 將數據切塊的意義:
- 便於存儲超大文件
- 便於進行快速的備份
1.文件上傳失敗:
2.解決方案:
PS:因爲之前安裝分佈式的時候,挖了個坑,爬出來之後忘記,埋上了,又掉進去了
查閱資料發現造成這個問題的原因可能是使用hadoop namenode -format格式化時格式化了多次造成那麼spaceID不一致,解決方案:
1、停止集羣(切換到/sbin目錄下)
$./stop-all.sh
2、刪除在hdfs中配置的元數據目錄
(即在core-site.xml中配置的hadoop.tmp.dir對應文件件)下面的所有數據;
- $ rm -rf /home/hadoop/tmp/*
3、重新格式化namenode(切換到hadoop目錄下的bin目錄下)
- $ ./hadoop namenode -format
4、重新啓動hadoop集羣(切換到hadoop目錄下的sbin目錄下)
-
$./start-all.sh
5.上傳成功
6.使用hadoop dfsadmin -report查看使用情況
7.查看
三、NameNode
- 管理DataNode和記錄元數據Meta
- 元數據包含:
- 記錄數據的虛擬存儲路徑 不存在的路徑
- 記錄文件的切塊數量 不同的文件切塊數量不同
- 記錄數據塊的存儲位置
- 記錄數據塊的複本數量 不同文件備份數量不同
- 記錄文件權限 校驗權限
- 元數據的大小是在150B左右
- NameNode將元數據維繫在內存以及磁盤中
- 元數據維繫在內存中的目的是爲了快速查詢
- 元數據維繫在磁盤中的目的是爲了崩潰恢復
- 元數據的存儲位置是由hadoop.tmp.dir屬性決定,如果不配置則默認使用/tmp
- 元數據在磁盤中是以edits文件和fsimage文件的形式存在
- edits:記錄寫操作
- fsimage:記錄元數據。fsimage中的元數據和內存中的元數據並不是同步的
- 當NameNode接收到寫請求之後,會先將該請求記錄到edits_inprogess文件中,如果記錄成功,則將該請求同步更新到內存中,修改內存中的元數據,內存修改完成之後會給客戶端返回一個ack表示成功
- 在HDFS中,會給每一次的寫操作分配一個編號 - 事務id - txid
- 當edits文件達到條件的時候會將操作更新到fsimage文件中,即修改fsimage文件中的元數據:
- 空間維度:當edits_inprogress文件達到指定大小的時候就會觸發更新,默認是64M,大小可以由fs.checkpoint.size(core-site.xml)來指定,默認單位是字節
- 時間維度:當距離上一次更新達到指定間隔時候的時候就會觸發更新,默認是1H,大小可以由fs.checkpoint.period來指定,默認單位是秒 3600S
- 重啓更新:NameNode重啓之後,會自動的將edits_inprogress中的操作更新到fsimage中
- 強制更新:hadoop dfsadmin -rollEdits
- 在更新的時候,會將edits_inprogress重命名爲edits_XXXXXX-XXXXXX,同時產生一個新的edits_inprogress
- 在Hadoop中,如果存在SecondaryNameNode,則更新過程是發生在SecondaryNameNode
- 在HDFS中,最核心的節點是NameNode。但是在Hadoop1.0版本中只能有1個NameNode,在Hadoop2.0版本中,進行了改變,允許多設置一個NameNode,代價是丟掉SecondaryNameNode
- NameNode通過心跳機制來管理DataNode:DataNode每隔定長時間會給NameNode發送心跳信息
- 默認情況下,DataNode每隔3s給NameNode發送一條信息
- 如果NameNode長時間(默認是10min)沒有收到某個DataNode的心跳信息,則認爲這個DataNode已經lost(丟失),此時NameNode會將這個DataNode中的數據再次備份,保證複本數量
- 心跳信息包含:
- 當前節點的狀態
- 當前節點中所存儲的數據塊信息
- NameNode重新啓動的時候,將edits中的操作更新到fsimage中,將fsimage中的元數據加載到內存中,等待DataNode的心跳(如果DataNode沒有心跳過來則要重新備份保證複本數量,校驗數據總量),這個過程稱之爲是安全模式(safe mode)。如果所有的校驗都成功,則HDFS會自動退出安全模式
- 四千個節點 半個小時會退出安全模式 如果退不出去可以強制退出安全模式 hadoop dfsadmin -safemode leave
- 因爲安全模式的問題,所以在僞分佈式下,複本數量必須爲1 - 如果複本數量不爲1,則重啓NameNode的時候,會導致HDFS一直處於安全模式
一.創建一個文件夾
二.刪除文件夾
三.元數據
- edits:記錄寫操作
- fsimage:記錄元數據。fsimage中的元數據和內存中的元數據並不是同步的
四、DataNode
- 用於存儲數據,注意數據是以Block形式存儲
- 數據在DataNode上的存儲位置由hadoop.tmp.dir屬性決定,存儲目錄是dfs/data/current/塊池/current/finalized/subdir0/subdir0
- DataNode會通過心跳機制(RPC方式)來向NameNode發送心跳信息
五、SecondaryNameNode
- SecondaryNameNode只是輔助NameNode進行元數據的合併
- SecondaryNameNode能起到一定的備份作用,但是不能做到和NameNode之間進行實時熱備 - 在實際開發中,一旦利用到SecondaryNameNode進行了備份,往往意味着數據已經產生了丟失
- 在HDFS中,最核心節點一定是NameNode,也因此在Hadoop2.0的完全分佈式中,爲了做到NameNode的熱備,捨棄了SecondaryNameNode
六、複本放置策略
- 在HDFS中,默認是多複本策略,默認複本數量爲3
- 複本放置策略:
- 第一個複本:如果是外部客戶端上傳數據,則此時NameNode會選擇一個相對空閒的節點存放第一個複本;如果是內部上傳,則第一個複本放在本節點上
- 第二個複本:在Hadoop2.7以前,第二個複本要放在和第一個複本不同機架的節點上;從Hadoop2.7開始,第二個複本放在和第一個複本相同機架的節點上
- 第三個複本:在Hadoop2.7以前,第三個複本是放在和第二個複本相同機架的節點上;從Hadoop2.7開始,第三個複本放在和第二個複本不同機架的節點上
- 更多複本:隨機挑選空閒節點存放
七、機架感知策略
- 在Hadoop所指的機架並不是物理結構而是邏輯結構
- 可以通過映射關係來指定節點對應的機架,也就意味着同一個物理機架上的節點可以映射到不同的邏輯機架上
- 實際使用中,一般會將一個或者幾個物理機架上的節點放在一個邏輯機架上
八.特點
- 能夠存儲超大文件 - 切塊
- 快速的應對和檢測故障 - 心跳
- 保證數據的高可靠 - 複本
- 簡易的一致性模型 - 一次寫入多次讀取,在Hadoop2.0開始,允許追加
- 能夠利用低廉的設備來進行橫向擴展
- 不建議存儲大量小文件
- 不支持低延遲訪問
- 不支持事務