1. 程式人生 > >大資料之Hadoop學習《一》——認識HDFS

大資料之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記憶體

名稱解釋

  1. Cluster 叢集
  2. Rack 機架
  3. Client 客戶機
  4. Namenode 名稱節點
  5. Datanode 資料節點
  6. Secondary NameNode 輔助(第二)名稱節點
  7. Metadata 元資料
  8. 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容錯能力

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目錄隨時可恢復,直到超過設定時間才被正式移除。

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的管理命令

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