大資料之Hadoop學習《一》——認識HDFS
title: 大資料之Hadoop學習<一>————認識HDFS
date: 2018-11-12 20:31:36
tags: Hadoop
categories: 大資料
toc: true
點選檢視我的部落格:Josonlee’s Blog
文章目錄
分散式檔案系統 HDFS
分散式檔案系統(Distributed FileSystem)是指檔案系統管理的物理儲存資源不一定直接連線在本地節點上,而是通過計算機網路與節點相連。
Hadoop有若干檔案系統,HDFS只是其中一個,但HDFS是其重要組成部分。HDFS由java的org.apache.hadoop.fs.FileSystem
定義,並實現了java.io.Closeable
介面,繼承了org.apache.hadoop.conf
我們可以通過命令列下 hadoop dfs -ls hdfs:///
訪問HDFS檔案系統
HDFS特點
- 儲存超大檔案
- 流式檔案訪問
- 高效訪問模式:一次寫入、多次訪問
- 只支援檔案追加操作,不能修改
- 追加操作要在hdfs-site.xml中的 dfs.support.append 設定為true才行
- 普通商用硬體上即可執行(實際上普通PC還是不OK,那速度,這都是氪金玩家玩的,hh)
- 低時間延遲的資料訪問
- 以高時延為代價,獲取高資料吞吐量
- 響應時間秒級、毫秒級的資料訪問,應該採用HBase
- 多使用者在寫入檔案時有鎖機制,只支援單個寫入者
- 不適合存大量小檔案
由於 Namenode 將檔案系統的元資料儲存在記憶體中,因此
HDFS所能儲存的檔案總數受限於Namenode的記憶體容量
根據經驗,每個檔案、目錄和資料塊的儲存資訊大約佔150
位元組,儲存100萬個檔案大約需要300M記憶體
名稱解釋
- Cluster 叢集
- Rack 機架
- Client 客戶機
- Namenode 名稱節點
- Datanode 資料節點
- Secondary NameNode 輔助(第二)名稱節點
- Metadata 元資料
- Block 塊
- 整體結構
- Namenode和Secondary Namenode
Namenode是HDFS的智腦,維護整個系統的目錄樹及目錄樹中的檔案和目錄
這些資訊以映象檔案(FSImage)和編輯日誌檔案(edit log)的形式永久儲存在本地磁碟上,在系統啟動時被載入到記憶體
映象檔案(檔案系統映象),HDFS元資料的完整快照,每次Namenode啟動時會載入最新的映象
Secondary Namenode不能按照名字以為是Namenode的備份,他只是負責將映象檔案和編輯日誌合併,以此來控制 edits 檔案的大小在合理的範圍,縮短集
群重啟時Namenode重建fsimage的時間。一般每個叢集都有單獨執行在一臺伺服器上的一個Secondary Namenode。Secondary Namenode也有恢復部分資料的作用
- Datanode
資料節點,HDFS是master/slave結構,Namenode是主,Datanode是從。它存放的是實際的資料塊,塊在檔案系統中會產生兩個檔案(實際的資料檔案和塊的附加資訊檔案,包含資料的校驗和、生成時間)
Datanode通過心跳和namenode通訊
- block
塊,檔案系統進行資料讀寫的最小單位,hadoop 2.7之前的塊(block)預設64M,之後是128M,可以在 hdfs-site.xml
檔案中 dfs.block.size
項中配置塊大小,dfs.replication
配置備份份數
HDFS上檔案會被分成若干塊分開儲存,使得檔案可以比磁碟容量大,提供容錯能力,也簡化了儲存子系統
不同於普通檔案系統(即使檔案大小小於塊大小,仍佔一個塊的大小),HDFS小於一個塊大小的檔案不會佔用整個塊的空間
- MetaData
元資料包括檔案系統目錄樹資訊和檔案和塊對應關係的資訊
- 檔案系統目錄樹資訊
- 檔名,目錄名
- 檔案和目錄的從屬關係
- 檔案和目錄的大小,建立及最後訪問時間
- 許可權
- 檔案和塊的對應關係
- 檔案由哪些塊組成、塊ID
- 每個塊的存放位置
其儲存是依賴本地檔案:映象檔案和編輯日誌檔案,前者儲存上面提到的兩類,後者儲存的是客戶端請求新建、移動、寫檔案操作時的記錄(先記錄在編輯日誌,成功後才更改記憶體中資料)
HDFS容錯能力
- 可靠性(不出錯)、可用性(出錯還能提供服務)
- 檔案系統的容錯性 引用:HDFS的容錯能力
1)心跳機制,在Namenode和Datanode之間維持心跳檢測,當由於網路故障之類的原因,導致Datanode發出的心跳包沒有被Namenode正常收到的時候,Namenode就不會將任何新的IO操作派發給那個Datanode,該Datanode上的資料被認為是無效的,因此Namenode會檢測是否有檔案block的副本數目小於設定值,如果小於就自動開始複製新的副本並分發到其他Datanode節點。
2)檢測檔案block的完整性,HDFS會記錄每個新建立的檔案的所有block的校驗和。當以後檢索這些檔案的時候,從某個節點獲取block,會首先確認校驗和是否一致,如果不一致,會從其他Datanode節點上獲取該block的副本。
3)叢集的負載均衡,由於節點的失效或者增加,可能導致資料分佈的不均勻,當某個Datanode節點的空閒空間大於一個臨界值的時候,HDFS會自動從其他Datanode遷移資料過來。
4)Namenode上的fsimage和edits日誌檔案是HDFS的核心資料結構,如果這些檔案損壞了,HDFS將失效。因而,Namenode可以配置成支援維護多個FsImage和Editlog的拷貝。任何對FsImage或者Editlog的修改,都將同步到它們的副本上。它總是選取最近的一致的FsImage和Editlog使用。Namenode在HDFS是單點存在,如果Namenode所在的機器錯誤,手工的干預是必須的。
5)檔案的刪除,刪除並不是馬上從Namenode移出namespace,而是放在/trash目錄隨時可恢復,直到超過設定時間才被正式移除。
- hadoop本身的容錯性
- 支援升級、回滾,升級出現不相容等可以回滾
- 可參考:Hadoop(七)HDFS容錯機制詳解
HDFS 副本儲存機制
hdfs提供的是三副本放置策略,每個塊在HDFS叢集中會儲存多份,預設3份。其目的是平衡二者:提高資料儲存的可靠性、可用性(多備份一些),減少資料寫入的開銷(少備份一些)
三副本放置策略:
- 寫請求方所在機器是其中一個Datanode,則第一份副本直接存放在本地,否則隨機在叢集中選擇一個Datanode
- 第二個副本存放於不同第一個副本的所在的機架
- 第三個副本存放於第二個副本所在的機架,但是屬於不同的節點
超過三份副本可隨機放置,但滿足:一個節點最多放一個副本,副本數少於機架數的兩倍,則一個機架不能放超過兩份副本
HDFS讀寫檔案流程
圖片引自:Hadoop–HDFS之讀寫流程
寫入檔案
讀取檔案
操作HDFS
命令列 文件:命令手冊
HDFS的基本命令
-mkdir 在HDFS建立目錄 hdfs dfs -mkdir /data
-ls 檢視根目錄 hdfs dfs -ls /
-ls -R 檢視目錄與子目錄
-put 上傳一個檔案 hdfs dfs -put data.txt /data/input
-moveFromLocal 上傳一個檔案,會刪除本地檔案:ctrl + X
-copyFromLocal 上傳一個檔案,與put一樣
-copyToLocal 下載檔案 hdfs dfs -copyToLocal /data/input/data.txt
-get 下載檔案 hdfs dfs -get /data/input/data.txt
-rm 刪除檔案 hdfs dfs -rm /data/input/data.txt
-getmerge 將目錄所有的檔案先合併,再下載
-cp 拷貝: hdfs dfs -cp /data/input/data.txt /data/input/data01.txt
-mv 移動: hdfs dfs -mv /data/input/data.txt /data/input/data02.txt
-count 統計目錄下的檔案個數
-text、-cat 檢視檔案的內容 hdfs dfs -cat /data/input/data.txt
-balancer 平衡操作
- 啟動、關閉hdfs服務:start-dfs.sh/stop-dfs.sh
- jps 檢視服務程序
HDFS的管理命令
hdfs version 檢視版本
hdfs namenode [ -format ] 格式化
hdfs fsck <path> [ -files [ -blocks [ -locations | -racks ] ] ] 檢視HDFS檔案對應的檔案塊資訊(Block)和位置資訊
hdfs dfsadmin -report 檔案系統使用報告
hdfs dfsadmin -safemode [ get | enter | leave ] 進入、退出安全模式
hdfs -help 幫助
java API
- Configuration:HDFS環境配置類
- FileSystem:分散式檔案系統類
- Path:HDFS檔案路徑類
- FSDataInputStream / FSDataOutputStream:檔案系統輸入輸出流類
- URI:檔案資源定位類
順便提一下HDFS的URI格式是:hdfs://namenode主機名[或namenode的IP]:埠/檔案路徑
參考資料:
上一篇記錄了Hadoop偽分散式環境的搭建,接下來是MapReduce程式編寫,及配置eclipse連結hdfs伺服器
點選檢視我的部落格:Josonlee’s Blog