HDFS架構詳解
HDFS底層架構:
1.分佈式文件系統:
·物理層存儲的分佈式
基於客戶機/服務器模式
通常一個分佈式文件系統提供多個供用戶訪問的服務器
·通常情況下都會提供備份和容錯的功能
·通常情況下都基於操作系統的本地文件系統
-ext3,ext4
-NTFS
·分佈式文件系統優點
1)傳統文件系統最的問題是容量和吞吐量的限制
2)多用戶多應用的並行讀寫是分佈式文件系統產生的根源
一塊硬盤的讀寫性能,比不上多塊硬盤同時讀寫的性能
1HDD(硬盤)=75MB/sec
1000HDDs=75GB/sec
3)擴充存儲空間的成本低廉
4)可提供冗餘備份
5)可以爲分佈式計算提供基礎
2.HDFS基本概念:
·HDFS是一個分佈式文件系統
·HDFS是一個使用Java實現的、分佈式的、可橫向擴展(代表可以動態的創建和卸載節點)的文件系統
·HDFS是Hadoop的核心組件
·基於*nix
·HDFS具有很高的容錯性,提供了高吞吐量的數據訪問
·HDFS適用於一次寫入多次查詢的情況,不支持併發寫情況,小文件不合適
·HDFS前提和設計目標
·硬件錯誤是常態
錯誤檢測和快速、自動的恢復是HDFS最核心的架構目標
·存儲超大文件
HDFS適合大量存儲,總存儲量可以達到PB、EB級
HDFS適合大文件,單個文件一般在百MB級以上
文件數目適中
·流式數據訪問
HDFS適合用於處理批量,而不適合隨機定位訪問
·簡單的一致性模型
HDFS的應用程序需要對文件實行一次性寫。多次讀的訪問模式
不能修改已寫入的數據
·程序採用“數據就近”原則分配節點執行
移動計算比移動數據的代價要低
·運行在普通廉價的服務器上
HDFS設計理念之一就是讓它能運行在普通的硬件之上,即便硬件出現故障,也可以通過容錯策略來保證數據的高可用
·HDFS侷限性
·不適合低延遲數據訪問
高吞吐量可能要求以高延遲作爲代價
HBase可以彌補不足
·無法搞笑存儲大量小文件
文件數量大小的限制由NameNode來決定
·不支持多用戶寫入及任意修改文件
·HDFS基本概念--塊
·HDFS基本存儲單位是塊,傳統的塊存儲介質中,塊是讀寫的最小數據單位(扇區)
·HDFS也使用的塊的概念,Hadoop1.X版本默認大小爲64M,2.X默認爲128M
可自行在hdfs-site.xml中配置:
1.X版本修改:dfs.block.size,2.X版本修改:dfs.blocksize
默認單位爲比特,兆與比特計算方法:128*1024*1024
每個塊有一個自己的全局ID
·HDFS將一個文件分爲一個或數個塊來存儲
每個塊是獨立的存儲單位
以塊爲單位在集羣服務器上分配存儲
·HDFS基本概念--塊帶來的好處
·一個文件的大小可以大於網絡中任意一個磁盤的容量
·簡化了存儲子系統的設計,簡化了存儲管理,消除了對元數據的顧慮
·塊適合用於數據備份,提供了容錯能力和可用性
·HDFS基本概念--塊的冗餘備份
·每個塊在集羣上會存儲多份副本
默認複製份數爲三份
可針對每個文件配置,由客戶端指定
可以動態修改
·簡化了存儲子系統的設計,簡化了存儲管理,消除了對元數據的顧慮
·塊適合用於數據備份,提供了容錯性和可用性
3.HDFS體系架構
·HDFS的元數據包括
-文件系統目錄樹信息
文件名,目錄名
文件和目錄的從屬關係
文件和目錄的大小,創建及最後訪問時間
文件和目錄的權限
-文件和塊的對應關係
文件有哪些塊組成
·NameNode職責詳解
·管理文件系統的命名空間
·記錄每個文件數據塊在各個DataNode上的位置和副本信息
·協調客戶端對文件的訪問
·記錄命名空間內的改動或空間本身屬性的改動
·NameNode使用事物日誌記錄HDFS元數據的變化。使用映像文件存儲文件系統的命名空間,包括文件映射,文件屬性等
·通過檢查點(Checkpoint)更新影像文件,Secondary NameNode輔助完成處理
NameNode主要功能:接受客戶端的讀寫服務
NameNode保存metadate信息包括:
·文件owership和permissions
·文件包含哪些塊
·Block保存在哪個DataNode(由DataNode啓動時上報)
NameNode的metadate信息在啓動後會加載到內存
·metadata存儲到磁盤文件名爲”fsimage”
·Block的位置信息不會保存到fsimage
·edits記錄對metadata的操作日誌
Secondary NameNode不是NameNode的備份(但可以做備份),它的主要工作是幫助NameNode合併edits log。減少NameNode啓動的時間
Secondary NameNode執行合併時機:
·根據配置文件設置的時間間隔fs.checkpoint.period 默認3600秒
·根據配置文件設置edits log大小fs.checkpoint。Size 規定edits文件的最大值默認是64MB
·DataNode職責詳解
·負責所在物理節點的存儲管理
·一次寫入,多次讀取(不修改)
·文件用數據塊組成,典型的塊大小事64MB和128MB
·數據塊儘量散佈到各個節點
DataNode:
·存儲數據(Block)
·啓動DataNode線程的時候會向NameNode彙報block信息
·通過向NameNode發送心跳保持與其聯繫(3秒一次),如果NameNode10分鐘沒有收到DataNode的心跳,則認爲其已經lost,並copy其上的block到其他DataNode
Block的副本放置策略
·第一個副本:放置在上傳文件DataNode;如果是集羣外提交,則隨機挑選一臺磁盤不太滿,CPU不太忙的節點
·第二個副本:放置在於第一個副本不同的機架的節點上
·第三個副本:與第二個副本相同機架的節點
·更多副本:隨機節點
·HDFS讀文件流程
·HDFS寫文件流程
HDFS文件權限:
·與Linux文件權限類似
r:read;w:write;x:execute,權限x對於文件忽略,對於文件夾表示是否允許訪問其內容
·如果Linux系統用戶xxx使用hadoop命令創建一個文件,那麼這個文件在HDFS中owner就是xxx
·HDFS的權限目的:阻止好人做錯事,而不是阻止壞人做壞事。HDFS相信,你告訴我你是誰,我就認爲你是誰
2.HDFS可靠性:
·冗餘副本策略
可以在hdfs-site.xml中設置複製因子指定副本數量
所有數據塊都有副本
DataNode啓東時,遍歷本地文件系統,產生一份hdfs數據塊和本地文件的對應關係列表彙報給namenode
·機架策略
集羣一般放在不同的機架上,機架間帶寬要比機架內帶寬要小
默認在一個機架內存放兩個副本,在另一個機架內再放一個副本,這樣可以防止機架失效時丟失數據,也可以提高帶寬利用率
·心跳機制
NameNode週期性從datanode接收心跳信號和塊報告
NameNode根據塊報告驗證元數據
沒有按時發送心跳的datanode會被標記爲宕機,不會再給它任何I/O請求
如果datanode失效造成副本數量下降,並且低於預先設置的闕值,namenode會檢測出這些數據塊,並在合適的時機進行重新複製
重新複製的原因還包括數據副本本身損壞、磁盤錯誤,複製因子被增大等
·安全模式
NameNode啓動時會先經過一個“安全模式”階段
安全模式階段不會產生數據寫
在此階段NameNode收集各個datanode的報告,當數據塊達到最小副本數以上時,會被認爲是“安全”的
在一定比例(可設置)的數據塊被確定爲“安全”後,再過若干時間,安全模式結束
在檢測到副本數不足的數據塊時,該塊會被複制至到達到最小副本數
·校驗和
HDFS客戶端軟件實現了對HDFS文件內容的校驗和(Checksum)檢查
在文件創立時,會計算每個數據塊的校驗和
校驗和會作爲單獨一個隱藏文件保存在命名空間下
客戶端獲取文件時可以檢查數據塊對應的校驗和是否和隱藏文件中的相同,從而發現數據塊是否損壞
如果正在讀取的數據塊損壞,則可以繼續讀取其他副本
·回收站
刪除文件時,其實是放入回收站/trash
回收站裏的文件可以快速恢復
可以設置一個時間閾(yu)值,當回收站裏文件的存放時間超過這個閾值,就被徹底刪除,並且釋放佔用的數據塊
默認的回收站是關閉的,可以通過在core-site.xml中添加fs.trash.interval來打開並配置時間閾值,時間單位是分
·元數據保護
映像文件和事務日誌是NameNode的核心數據。可以配置爲擁有多個副本
副本會降低NameNode的處理速度,但增加安全性
NameNode依然是單點,如果發生故障要手工切換,Hadoop2.X的版本中可配置NameNode HA解決問題
HDFS Shell操作
·HDFS Shell文檔地址
http://hadoop.apache.org/docs/r2.7.2/hadoop-projrct-dist/hadoop-common/FileSystemShell.html
·HDFS集中式緩存管理文檔地址
http://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/DistributedCacheDeploy.html
·HDFS小文件歸檔文檔地址
http://hadoop.apache.org/docs/r2.7.2/hadoop-archives/HadoopArchives.html
1.hadoopfs
2.hadoopdfs
3.hdfsdfs
*hadoop fs使用於任何不同的文件系統,比如本地文件系統和HDFS文件系統
*hadoop dfs只能適用於HDFS文件系統
*hdfs dfs跟hadoopdfs的命令作用一樣,也只能適用於HDFS文件系統
Hdfs -help hdfs幫助命令
Hdfs dfs -mkdir -p <path>(路徑) 創建一個目錄
Hdfs dfs -put 指定文件路徑 指定hdfs傳輸路徑 通過put命令上傳文件
Hdfs dfs -cat 指定文件路徑 查看文件
Hdfs dfs -get 指定文件路徑 .(這個點表示當前路徑) 下載文件
Hdfs dfs -rm -r 指定文件路徑 刪除文件
Hdfs dfs -ls har:///conf(指定路徑)/conf.har(har(歸檔)文件) 壓縮文件
Hdfs dfs -cp har:///conf(指定路徑)/conf.har(har(歸檔)文件)/har 解壓縮文件
Linux開發環境搭建:
·Linux基礎環境配置
·JDK、Maven、XManager配置
·Linux編碼演示
HDFS java 編程:
·上傳文件
·刪除文件
·下載文件
·HDFS Java API文檔地址
http://hadoop.apache.org/docs/current/api/
Hadoop高可用集羣
1.HDFS HA架構詳解:
1)HDFS HA背景
· HDSF集羣中NameNode存在單點故障(SPOF)。對於只有一個NameNode的集羣,如果NameNode機器出現意外downtime,那麼整個集羣將無法使用,直到NameNode重新啓動
· 影響HDFS集羣不可用主要包括以下兩種情況
NameNode機器宕機,將導致集羣不可用,重啓NameNode之後纔可使用
計劃內的軟件或硬件升級(NameNode節點),導致集羣在短時間內不可用
· HDFS的HA就是爲了解決上述問題,通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,比如處理來自客戶端的RPC請求,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。
2)HDFS HA架構:
3)HDFSHA配置要素
·NameNode機器:兩臺配置對等的物理機器,它們分別運行Active和StandbyNode。
·JouralNode機器:運行JouralNodes的機器。JouralNode守護進程相當的輕量級,可以和hadoop的其他進程部署在一起,比如NameNode、DataNode、ResourceManager等,至少需要3個且爲奇數,如果你運行了N個JNS,那麼它可以允許(N-1)/2個JNS進程失效並且不影響工作
·在HA集羣中,standby namenode還會對namespace進行checkpoint操作(繼承Backup Namenode的特性),因此,就不需要在HA集羣中運行SecondaryNamenode、CheckpointNode或者BackupNode。
·hdfs-site.xml重要配置
·dfs.nameservices - HDFS NN的邏輯名稱,例如:myhdfs
·dfs.ha.namenodes.myhdfs - 給定服務邏輯名稱myhdfs的節點列表
·dfs.namenode.rpc-address.myhdfs.nn1 - myhdfs中nn1對外服務的RPC地址
·dfs.namenode.http-address.myhdfs.nn1 - myhdfs中nn1對外服務http地址
·dfs.namenode.shared.edits.dir - NameNode元數據在JournalNode存放位置
·dfs.namenode.edits.dir - JournalNode在本地磁盤存放數據的位置
·dfs.ha.automatic-failover.enabled - 開啓NameNode失敗自動切換
·dfs.ha.fencing.methods - 配置隔離機制,通常爲sshfence
HDFS自動故障轉移:
·在自動故障轉移中,主要由兩個組件組成
·zookeeper集羣:
1.故障監控:失效檢測,每個NameNode將會和zookepper建立一個持久session,如果NameNode失效。那麼次session將會過期失效,此後zookeeper將會通知另一個Namenode,然後觸發Failover。
2.NameNode選舉:Zookeeper提供了簡單的機制來實現Active Node選舉,如果當前Active失效,Standby將會獲取一個特定的排它鎖(lock),那麼獲取(持有)鎖的Node接下來將會成爲Active。
· ZKFC是一個zookeeper客戶端,它主要用來監測和管理NameNodes的狀態,每個NameNode機器上都會運行一個ZKFC程序,它的職責爲:
1.健康監測:ZKFC間歇性的ping NameNode,得到NameNode返回狀態,如果NameNode失效或者不健康,那麼ZKFC將會標記其爲不健康
2.Zookeeper會話管理:當本地Nanenode運行良好時,ZKFC將會持有一個zookeeper session,如果本地NameNode爲Active,它同時也持有一個“排他鎖”(znode),如果session過期,那麼次lock所對應的znode也將會被刪除
3.選舉:當集羣中其中一個NameNode宕機,ZK會自動將另一個激活
2.Zookeeper集羣安裝:
1)Zookeeper概述
Zookeeper是一個開源分佈式協調服務,獨特的Leader-Follwer的集羣結構,很好的解決了分佈式單點問題。目前主要用於諸如:統一命名服務、配置管理、鎖服務、集羣管理等場景。
·Zookeeper中的角色主要有以下三類,如下表所示:
·Zookeeper系統模型
·Zookeeper設計目的
·最終一致性:client不論連接到哪個Server,展示給它都是同一個視圖
·可靠性:具有簡單、健壯、良好的性能,如果消息m被到一臺服務器接受,那麼它將被所有的服務器接受
·實時性:Zookeeper保證客戶端將在一個時間間隔範圍內獲得服務器的更新信息,或者服務器失效的信息。但由於網絡延遲等原因,Zookeeper不能保證兩個客戶端能同時得到剛更新的數據,如果需要更新數據,應該在讀數據之前調用sync()接口
·等待無關性:慢的或者失效的client不得干預快速的client的請求,使得每個client都能有效的等待
·原子性:更新智能成功或者失敗,沒有中間狀態
·順序性:包括全局有序和偏序兩種:全局有序是指如果在一臺服務器上消息a在消息b前發佈。則在所有Server上消息a都將在消息b前被髮布;偏序是指如果一個消息b在消息a後被同一個發送者發佈,a必將排在b前面
·Zookeeper總結
- 核心特性:解決單點問題,數據一致性
- API使用:簡單清晰
- 使用場景:統一命名服務、配置管理、鎖服務、集羣管理
- 穩定性:權限,監控,容災
1)Zookeeper單節點安裝
·前置環境
- 主機名、IP、防火牆、selinux、java環境配置
·下載解壓
- http://archive.apache.org/dist/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz
·配置
- 複製配置文件:cp conf/zoo_sample.cfg conf/zoo.cfg
- 配置數據存儲目錄:dataDir=/usr/local/zookeeper-3.4.5/data
- 啓動:bin/zaServer.shstart
- 查看狀態:bin/zkServer.shstartus
- 進入命令行:bin/zkCli.sh
Dain修改zoo.conf
- server.1=hadoop01.jkxy.com:2888:3888
- server.2=hadoop02.jkxy.com:2888:3888
- server.3=hadoop03.jkxy.com:2888:3888
- maxClientCnxns=0 #服務器最大連接數,默認是10,改爲0表示沒限制
- dataDir=/usr/local/zookeeper-3.4.5/data #數據存儲目錄
- autopurge.snapRetainCount=3 #快照數
- autopurge.purgeInterval=1 #快找清理時間,默認爲0
3.HDFSHA配置
1)HDFS架構回顧
4.YARNHA架構詳解
1)YARN HA架構
Shell操作:
Hdfs路徑的寫法:1)hdfs://chen:9000/ 2)/ 3)a
|more 可以分頁顯示信息
HDFS的Trash回收站:
和Linux系統的回收站設計一樣,HDFS會爲每一個用戶創建一個回收站目錄:/user/用戶名/.Trash/,每一個被用戶通過Shell刪除的文件/目錄,在系統回收站中都有一個週期,也就是當系統回收站中的文件/目錄在一段時間之後沒有被用戶回覆的話,HDFS就會自動的把這個文件/目錄徹底刪除,之後,用戶就永遠也找不回這個文件/目錄了。
配置:在每個節點(不僅僅是主節點)上添加配置core-site.xml,增加如下內容:
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>