大数据系列——Hadoop理论
概述
Hadoop 是一個開源的分布式計算和存儲框架,由 Apache 基金會開發和維護。
通過組合大量的商用計算機于一體形成集群,可提供可靠的、可伸縮的應用層計算和存儲服務,將數據序列化為字節流來存儲,主要用于處理海量數據的存儲和分析運算。
核心組件包括分布式文件系統(HDFS)、MapReduce、YARN;HDFS為海量的數據提供了存儲,MapReduce為海量的數據提供了計算,YARN為MapReduce的計算任務提供了資源分配和調度。
主要有下面三個發行版:Apache(原始版)、Cloudera、Hortonworks。
下面從如下幾個方面介紹下其相關理論:
目錄
概述
架構
核心知識點
部署方式
優缺點分析
常見應用場景
調優經驗
API應用:
Hadoop是專門用來處理大數據應用的,下面簡單介紹下大數據的相關知識:
大數據(Big Data):指無法在一定時間范圍內用常規軟件工具進行捕捉、管理和處理的數據集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的信息資產。
數據存儲單位: bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB。
? 1 Byte = 8 bit 1 K = 1054 Byte 1 MB = 1054 K
? 1 G = 1054 M 1T = 1054G 1P = 1054T
數據形式:結構化數據 、半結構化數據、非結構化數據(例如:網絡日志、音頻、視頻、圖片、地理位置信息)。
大數據應用需要解決的主要問題:海量數據的 存儲 和 分析計算。
分析計算一般包括三種類型:查詢、離線計算、實時計算
查詢方式:Hive、Pig等
離線計算方式:MapReduce、Spark Core、Flink DataSet等
實時計算方式:Spark Streaming、Flink DataStream、Storm等
大數據特點:Volume(大量)、Velocity(快速)、Variety(多樣性)、Value(低價值密度)。
架構
核心知識點
1、存儲模型
1)、數據塊Block
文件是以數據塊Block的形式最終存儲在節點上,Block的內容是字節流,也就是Hadoop會將文件線性以字節流的形式切分到每個Block中,針對一個Block這些塊都是按順序生成。
每個Block有offset、id、loction等元數據信息來描述Block,其中offset表示偏移量,文件的第一個block塊偏移量為0,通過offset可以將文件的所有塊合并到一起形成文件;id用于標識Block,用于形成映射,便于節點內查找數據塊;location用于標識Block所在的節點位置,便于集群內查找數據塊。
每個Block的大小支持自定義,可依據硬件的I/O特性來調整,默認情況下64M(Hadoop 1)、128M(Hadoop 2),默認值都是經過推敲的,一般應用無需更改。
2)、數據塊的副本
Block具有副本(replication),沒有主從概念,副本是滿足可靠性和性能的關鍵,副本不能出現在同一個節點中,不然若節點掛了,副本也就失效了。
創建文件時可以指定副本數大小,上傳后只能修改副本數。
默認副本數為3,可以通過hdfs-site.xml中dfs.replication參數來設置。
HDFS的塊采取冗余存儲,即一個數據塊會存儲多份。這有利于數據的傳輸,容易檢查錯誤并做錯誤恢復處理,保證數據的可靠性。
PS:
HDFS中存儲的文件的副本數由上傳文件時設置的副本數決定。無論以后怎么更改系統副本系數,這個文件的副本數都不會改變;
在上傳文件時優先使用啟動命令中指定的副本數,如果啟動命令中沒有指定則使用hdfs-site.xml中dfs.replication設置的默認值;
3)、數據塊的操作
創建文件形成數據塊后,不能再修改Block,也就是不能再修改文件已生成的內容。
文件支持追加數據,將追劇的數據放在最后的Block內,若追加內容大小超過Block的塊大小,自動切分生成一下個Block,依次類推。
數據塊損壞后會自動復制一個新的數據塊出來,DataNode(后續介紹)有一個自檢的功能,數據塊創建3周后,自動觸發校驗和運算(checksum算法),以保證集群中數據塊的安全。
2、程序結構及架構組成
1)、程序結構
sbin目錄:存放啟動或停止hadoop相關服務的腳本
bin目錄:存放對hadoop相關服務(HDFS,YARN)進行操作的腳本
etc目錄:hadoop的配置文件目錄,存放hadoop的配置文件
share目錄:存放hadoop的依賴jar包和文檔,文檔可以被刪除掉
lib目錄:存放hadoop的本地庫(對數據進行壓縮解壓縮功能)
2)、架構組成
Hadoop由幾個核心組件組成:HDFS、MapReduce、Yarn;
a、HDFS 采用的是master/slave架構設計 , 一個HDFS集群包含一個單獨的 NameNode(命名節點) 和多個 DataNode(數據節點)。
b、MapReduce是一個計算框架, 分為幾個計算階段:輸入分片(input split) 、 map階段 、 combiner(化合)階段 、 shuffle 階段??、 reduce 階段。
c、Yarn是一個資源調度框架,用于管理集群的硬件資源,安排并調度MapReduce任務執行。
3、元數據持久化
NameNode存的元數據主要有兩種:文件屬性、每個塊存在哪個DataNode上(也就是location)。在持久化的時候,文件屬性會持久化,location不會持久化。恢復的時候,NameNode會丟失塊的位置信息。
1)、HDFS實現:
任何對文件系統元數據產生修改的操作,Namenode都會在內存中保存,同時會在磁盤上保存兩個元數據管理文件來,FsImage(鏡像文件) 和 EditsLog(編輯日志),起到防止數據丟失和快速回復數據的作用。
FsImage(鏡像文件):存儲內存所有的元數據狀態,是內存命名空間元數據在磁盤的鏡像文件。
EditsLog(編輯日志):任何對文件系統元數據產生修改的操作,Namenode都會使用一種稱為EditsLog的事務日志記錄下來,是各種元數據操作的 write-ahead-log (寫入之前日志)文件 , 在體現帶內存數據變化前首先會將操作記入editlog中 , 以防止數據丟失。
這個日志只保存最近FsImage文件之后的增量預寫日志,記錄內容相對較少。
HDFS采用的是最近時點的 FsImage + 增量的 EditsLog的持久化方案,滾動將增量的 EditsLog 更新到 FsImage,以保證更近時點的 FsImage 和更小體積的 EditsLog,所以由 FsImage 和 EditsLog 兩個文件相結合就可以構造完整的內存數據。
2)、傳統持久化實現:
傳統方式一般采用下面兩種方式來實現持久化。
a、日志文件(文本文件)
采用日志文件記錄(append)實時發生的增刪改操作(mkdir /abc),通過讀取日志文件重放每一行指令來恢復數據。
優點:完整性比較好
缺點:加載恢復數據慢、占空間
b、鏡像、快照、dump、db(二進制文件)
采用間隔的(小時,天,10分鐘,1分鐘,5秒鐘)時間,將內存全量數據寫到磁盤上做鏡像,通過導入鏡像來恢復數據。
優點:恢復速度快相比于日志文件
缺點:因為是間隔的,容易丟失一部分數據
4、副本策略? 和 負載均衡
1)、副本策略
每個Block的副本存放時會采取一種存放策略,由這種策略來確定副本的存放過程,也叫“機架感知”,默認是關閉的,若要開啟,需要通過腳本實現,且根據實際情況來描述集群內機架的真實分布。
a、放置策略
第一個副本:
client在集群內且在某個DataNode上,則直接放在本DataNode上;
client在集群內但不在DataNode上,則優先放置在本client所在機架內的任意一個DataNode上;
client不在集群內,則優先放置在和本client所在機架的就近機架內的任意一個DataNode上;
第二個副本:放置在與第一個副本不同的機架上的任意一個DataNode上。
第三個副本:隨機節點。
b、讀取順序
如果本機有數據, 則直接在本機讀取數據。
如果和本機同機架的節點中有數據,則直接在當前節點中讀取。
如果該 HDFS 集群跨多個數據中心, 則優先讀取本數據中心的數據。
Client在與NameNode進行具體交互的時候,會觸發副本放置策略,NameNode會根據副本放置策略,在返回DataNode信息時做一個排序(根據距離),Client本機上的DataNode會排在第一位。然后Client會和第一個DataNode建立tcp連接,第一個DataNode和第二個DataNode建立tcp連接,第二個DataNode和第三
個DataNode建立tcp連接,這些連接鏈路被稱為“pipline”,最后會形成一個完成文件返回給Client。
c、副本策略的好處
如果本機數據損壞或者丟失, 那么客戶端可以從同機架的相鄰節點獲取數據, 速度要比跨機架獲取數據快。
如果本機所在的機架出現問題 , 那么之前在存儲的的時候沒有把所有的副本都放在一個機架內 , 這就能保證數據的安全性。
2)、負載均衡
當發現集群內部數據分布發生傾斜時,會啟動一個負載均衡算法工具腳本,對各節點上的數據存儲進行重新分布調整,從而讓數據均勻的分布在各個DataNode上,均衡IO性能,防止數據傾斜,整個過程稱為“負載均衡”。
a、負載均衡滿足的原則:
數據平衡不能導致數據塊減少,數據塊備份丟失
管理員可以中止數據平衡進程
每次移動的數據量以及占用的網絡資源,必須是可控的
數據均衡過程,不能影響namenode的正常工作
b、算法原理:
第一步:數據均衡服務(Rebalancing Server)首先要求 NameNode 生成 DataNode 數據分布分析報告,獲取每個DataNode磁盤使用情況
第二步:Rebalancing Server匯總需要移動的數據分布情況,計算具體數據塊遷移路線圖。數據塊遷移路線圖,確保網絡內最短路徑
第三步:開始數據塊遷移任務,Proxy Source Data Node復制一塊需要移動數據塊
第四步:將復制的數據塊復制到目標DataNode上
第五步:刪除原始數據塊
第六步:目標DataNode向Proxy Source Data Node確認該數據塊遷移完成
第七步:Proxy Source Data Node向Rebalancing Server確認本次數據塊遷移完成。然后繼續執行這個過程,直至集群達到數據均衡標準
在第二步中,HDFS會把當前的DataNode節點,根據閾值的設定情況劃分到Over、Above、Below、Under四個組中。在移動數據塊的時候,Over組、Above組中的塊向Below組、Under組移動。四個組定義如下:
?①Over? 組:此組中的DataNode均滿足? DataNode_usedSpace_percent > Cluster_usedSpace_percent + threshold
?②Above組:此組中的DataNode均滿足? Cluster_usedSpace_percent + threshold > DataNode_ usedSpace _percent > Cluster_usedSpace_percent
?③Below組:此組中的DataNode均滿足? Cluster_usedSpace_percent > DataNode_ usedSpace_percent > Cluster_ usedSpace_percent – threshold
?④Under組:此組中的DataNode均滿足? Cluster_usedSpace_percent – threshold > DataNode_usedSpace_percent
c、算法腳本使用方法:
腳本路徑位于:Hadoop_Home/bin目錄下的start?balancer.sh
啟動命令:Hadoop_home/bin/start-balancer.sh –threshold
關閉命令:Hadoop_home/bin/stop-balancer.sh
影響算法的幾個參數:
threshold
默認設置:10,參數取值范圍:0-100
參數含義:判斷集群是否平衡的閾值。理論上,該參數設置的越小,整個集群就越平衡
dfs.balance.bandwidthPerSec
默認設置:1048576(1M/S)
參數含義:Balancer運行時允許占用的帶寬
在hdfs-site.xml文件中可以設置該參數,例如:
<property>
? <name>dfs.balance.bandwidthPerSec</name>
? <value>1048576</value>
</property>
5、安全模式
安全模式:是指在啟動HDFS后,先恢復元數據,接著DataNode和NameNode建立心跳,然后向NameNode匯報塊的信息,直到認為所有DataNode都處于安全狀態之后,然后等待30秒退出。這一過程稱為“安全模式”。
退出安全模式后,開始對外提供服務,同時自動檢查哪些數據塊的副本沒有達到指定數目,發現后并將這些數據塊復制到其他DataNode上,確保其副本數滿足設定要求。
1)、安全模式的特性
a、在此期間NameNode不會進行對外服務和復制數據塊。
b、NameNode檢測確認每個數據塊的副本數目達到設定最小值,那么該數據塊就會被認為是副本安全(safely replicated)的,否則認為不安全。
c、NameNode檢測確認所有數據塊滿足一定百分比(這個參數可配置)后,那么會確認副本安全。
d、在此模式下便于檢測與修復問題。
e、對文件系統進行檢查
2)、應用場景
??
a、啟動或者重啟hdfs時
b、HDFS維護升級時
3)、常規操作
#退出安全模式
hadoop dfsadmin -safemode leave
進入安全模式
hadoop dfsadmin -safemode enter
#查看安全模式狀態
hadoop dfsadmin -safemode get
#對hdfs文件系統進行檢查
hadoop fsck
#等待,直到安全模式結束
hadoop dfsadmin -safemode wait
6、心跳機制
確保整個集群高可用的手段中的一部分,主要用于監測集群內的節點是否在線,還有一些定時交互信息,本質是上一個RPC函數,RPC遠程過程調用來探明節點是否在線及傳遞信息。
集群中下面一些環節會用到心跳機制:
1)、NameNode 和 DataNode 間的通信及狀態監測,包括節點上block的使用情況等
2)、NodeManager向ResourceManager報告的當前資源信息,包括節點上CPU、內存、磁盤等使用情況
3)、ApplicationMaster向ResourceManager申請或返還資源信息
4)、JobTracker 和 TaskTracker 間的信息交互,包括分配任務、資源使用情況、任務運行狀態等
5)、監測各節點是否在線
心跳機制實現:
Master 啟動的時候會開啟一個Rpc Server, 用于接收Slave的連接及處理交互信息。
Slave? 啟動的時候會開啟一個Rpc Client,用于連接Server,然后每隔一定時間發送"心跳"信息給Master,然后Master通過心跳的返回值,給Slave下達交互信息。
7、HDFS
HDFS是一個分布式文件存儲系統,負責Hadoop中的數據存儲及管理,數據包括文件數據、文件元數據。
采用Master/Slave(M/S)架構設計 , 一個HDFS集群包含一個單獨的 NameNode(命名節點-主節點) 、Secondary NameNode(第二命名節點-備份主節點)和多個 DataNode(數據節點)。
1)、NameNode
在整個 HDFS 系統中扮演"管理員"的角色,因此一個 HDFS 集群中只有一個命名節點,負責整個集群的管理,具體有:
a、負責管理文件數據存儲及文件元數據,包括文件目錄樹結構、文件到數據庫block的映射關系、block副本及存儲位置
b、負責 DataNode 的狀態監控,存儲 DataNode 上報的block存儲信息
c、負責持久化元數據,以FsImage + Editlog兩個文件持久化到磁盤,發生問題可自動恢復數據,保證不丟元數據
d、監控并維護block及其副本的安全,自動監控block及其副本數,發現問題自動復制新bolck出來
e、對Client提供服務管理元數據
PS:
NameNode僅僅持久化文件屬性,不會持久化每個block的位置信息,DataNode上的block位置信息要自動匯報給NameNode。
因為若是存儲了block的位置信息,則當DataNode掛掉后,這些數據就會丟失,產生數據的不一致性,假如掛掉幾個DataNode,相互之間可能會有聯動效應,會給NameNode恢復數據操作造成“泛洪”操作。
2)、DataNode
負責整個集群的存儲及讀寫,具體有:
a、以Block為單位來存儲文件數據
b、周期性的向NameNode匯報心跳信息、數據塊信息(包括副本塊)
c、對Client提供數據的存儲和讀寫工作
3)、Secondary NameNode
輔助命名節點,相當于NameNode的冷備份(可以有多個),起到一個檢查點功能作用, 備份命名節點當前狀態,定期從 NameNode 拉取 FsImage 和 Editlog 兩個文件, 并對這兩個文件進行合并, 形成新的 FsImage 文件并傳回給 NameNode。
具體有:
a、備份當前命名節點狀態
b、合并FsImage + EditLog成新的FsImage反饋給 NameNode
實際操作流程如下:
a、當觸發檢查點時,即edits達到64M或者3600s時,NameNode先復制一份edits,更名為edits.new
b、然后再將fsimage和dits復制一份到Secondary NameNode,再將edits.new更名為edits
c、然后Secondary NameNode將復制過來的fsimage和edits合并成一個新的fsimage.ckpt
d、然后再從Secondary NameNode將fsimage.ckpt復制一份到NameNode
e、覆蓋掉之前的fsimage
4)、高可用及大容量
在Hadoop集群中,NameNode充當著集群大腦的角色,但集群中只能有一個活動的NameNode對外提供服務,存在單點故障和性能不足問題,所以在實際生產應用中必須增加高可用方案,保證集群高可用。
實現HA方案,一般采用QJM方式,具體包括下面幾個重要組件:
a、Zookeeper集群
???? 選舉和故障自動切換,產生Active的NameNode
b、NameNode(Active)
???? 處于活動狀態的命名節點,對外提供服務
c、NameNode(Standby)
???? 處于備用狀態的命名節點,不能提供對外服務,自動實時同步元數據,從Active的命名節點同步FsImage鏡像,從共享存儲NFS或QIM集群同步EditLogs增量日志,實現Active狀態的命名節點的熱備。
???? 在HA模式下,無需再啟動Secondary NameNode冷備節點,由NameNode(Standby)替代。
d、ZKFailoverController(ZKFC)
????? 是Zookeeper集群的一個客戶端,分別在NameNode(Active)、NameNode(Standby)上各部署一個,向Zookeeper集群上報命名節點的狀態,用于實現命名節點故障自動切換。
e、Quorum Journal Manager(QJM)
???? 運行JournalNode的一個集群,充當共享存儲的管理,可以部署在獨立節點并掛載NFS或和DataNode節點在一起,負責做Active和Standby狀態的兩個命名節點間的EditLogs增量日志數據同步,Active推數據到QJM,Standby從QJM拉數據。
???? 基本原理是用2N+1個節點存儲數據,每次有大多數(≥N+1)節點成功 寫入數據就認為本次寫成功,并保證數據高可用,該算法最多容忍N臺機器掛掉,如果多于N臺掛掉,則這個算法失效。
? ??
????
實現大容量方案,官方推薦 采用NameNode Federation 機制。
該方案主要思想:
a、提供多個NameNode,通過不同的namespace切分開來,每個NameNode相互獨立,分別服務于不同的應用。
b、所有DataNode為每個NameNode提供存儲服務,同時上報各自的可用存儲資源狀態給每個NameNode。
c、每個DataNode根據namespace來向負責該namespace的NadeNode上報其狀態及block信息。
該方案本質上是為不同的 NameNode 提供了共享 DataNode的能力,水平的擴充了NameNode,要實現支持大容量,需要在應用端對數據存儲做切分處理,不同的切分結果對應到不同的namespace(NameNode分管的)。
但由于還是一個NameNode,所以還是沒有解決HA,所以在實際生產應用中,若單個NameNode能滿足應用,采用HA即可;若單個NameNode不能滿足應用,需要采用HA + Federation,示意如下:
5)、初始化流程
a、 HDFS搭建時會格式化(首次執行),格式化操作會產生一個空的FsImage
b、 當NameNode啟動時,它從硬盤中讀取EditsLog和FsImage
c、 將所有EditsLog中的事務作用在內存中的FsImage上
d、 并將這個新版本的FsImage從內存中保存到本地磁盤上
e、 然后刪除舊的EditsLog,因為這個舊的EditsLog的事務都已經作用在FsImage上了
f、 NameNode啟動后會進入一個稱為安全模式的特殊狀態。
g、 處于安全模式的NameNode是不會進行數據塊的復制的。
h、 NameNode從所有的 DatNnode接收心跳信號和塊狀態報告。
i、 每當NameNode檢測確認某個數據塊的副本數目達到這個最小值,那么該數據塊就會被認為是副本安全(safely replicated)的。
j、 在一定百分比(這個參數可配置)的數據塊被NameNode檢測確認是安全之后(加上一個額外的30秒等待時間),NameNode將退出安全模式狀態。
k、 接下來它會確定還有哪些數據塊的副本沒有達到指定數目,并將這些數據塊復制到其他DataNode上。
6)、寫入流程
a、 Client和NN連接創建文件元數據
b、 NN判定元數據是否有效
c、 NN觸發副本放置策略,返回一個有序的DN列表
d、 Client和DN建立Pipeline連接并依次進行處理,具體操作如下:
???????? Client將塊切分成packet(64KB),并使用chunk(512B)+chucksum(4B)填充
???????? Client將packet放入發送隊列dataqueue中,并向第一個DN發送
???????? 第一個DN收到packet后本地保存并發送給第二個DN
???????? 第二個DN收到packet后本地保存并發送給第三個DN
???? 在這一個過程中,上游節點同時發送下一個packet。
e、當block傳輸完成,DN們各自向NN匯報,同時client繼續傳輸下一個block
f、直到依次將文件所有block寫入完畢。
PS:
在寫入過程中,副本數對于Client是透明的(即Client需要關系副本數,由NameNode自己處理),同時寫入副本和匯報block信息是并行處理的,提高處理能力。
7)、讀取流程
a、Client和NN交互文件元數據獲取fileBlockLocation
b、NN會按距離策略排序返回裝載目標文件信息塊的DN列表
c、Client會根據給出的文件offset連接所在block的DN獲取數據
d、直到把所有文件block信息獲取完畢,然后組裝成文件返回給Client
PS:
HDFS會盡量讓讀取程序讀取離它最近的副本。
如果在讀取程序的同一個機架上有一個副本,那么就讀取該副本。
如果一個HDFS集群跨越多個數據中心,那么客戶端也將首先讀本地數據中心的副本。
8、MapReduce
MapReduce是一個分布式處理數據的編程模型,Map和Reduce(映射和規約),用于并行計算海量數據。
Hadoop就是使用MapReduce來實現數據存儲及計算服務,Mapreduce是偏底層的技術,后期Pig、Hive、Spark、Flink等框架將簡化其應用復雜度,能夠提供腳本、sql語句的方式處理應用,然后再轉化成Mapreduce語句提供給HDFS執行。
MapReduce 與 HDFS 一樣采用了 Master/Slave(M/S) 架構設計, 主要由以下幾個組件組成:
a、Client
b、JobTracker
c、TaskTracker
d、HDFS
也就是NameNode和JobTracker用同一臺機子,其它的機子分別同一時候作為DataNode和TaskTracker節點。
這樣NameNode和JobTraceker作為調度節點。其它的機子就負責存儲和運算。
1)、組件介紹
client(client)
編寫MapReduce代碼,配置作業。提交作業。
JobTracker
? 初始化作業。分配作業,與TaskTracker通信。協調整個作業的運行;一個Hadoop集群僅僅有一個JobTracker。
? JobTracker守護進程是應用程序和Hadoop之間的紐帶。一旦提交代碼到集群上。JobTracker就會確定運行計劃,包括決定處理哪些文件、為不同的任務分配節點以及監控全部任務的運行。
? 假設任務失敗,JobTracker將自己主動重新啟動任務,但所分配的節點可能會不同。同一時候受到提前定義的重試次數限制。
TaskTracker
? 保持與JobTracker的通信,在分配的數據片段上運行Map或Reduce任務。
? Hadoop集群中能夠包括多個TaskTracker,內部也采用M/S架構,JobTracker作為主節點,TaskTracker作為從節點,負責運行 JobTracker 分配的單項任務并管理分配到的任務的運行情況。
? 其中:Task 分為 Map Task 和 Reduce Task 兩種 , 均由 TaskTracker 啟動。
? MapReduce 程序處理的基本單位:分片(split),split 包含一些元數據信息 , 比如數據起始位置 、 數據長度 、 數據所在節點等等 . 劃分方法由用戶決定 , split 的劃分大小與 HDFS 的 block 大小一致,split 的多少決定了 Map Task 的數目 , 因為每個 split 會交由一個 Map Task 處理 。
?Map Task 先將對應的 split 迭代解析成一個個鍵值對, 依次調用用戶自定義的 Map 函數進行處理, 最終將臨時結果存放到本次磁盤上, 其中臨時數據被分成若干個 partition(分區), 每一個 partition 將會被一個 ReduceTask 處理。
?ReduceTask 分為三個階段:第一步, 從遠程節點上讀取 Map Task 中間結果, 成為 Shuffle 階段。? 第二步, 按照 key 對 key/value 進行排序, 成為 sort 階段。 第三步,依次讀取, 調用用戶自定義的 reduce 函數處理, 并將最終的結果存到 HDFS 上, 稱為 Reduce 階段。
HDFS
保存作業的數據、配置信息、作業結果。
2)、作業生命周期
第一步:作業提交與初始化,然后交由 JobTracker 處理。
??????? JobTracker 會保存作業環境到 HDFS, 然后分配作業給 TaskTracker,同時啟動監控任務,監控作業運行狀態和任務運行狀態。
第二步:任務調度與監控, 任務調度和監控的功能均由 JobTracker 完成。
??????? TaskTracker 周期性地通過 Heartbeat 向 JobTracker 匯報本節點的資源使用情況及任務運行狀態。
第三步:任務運行環境準備, 運行環境準備包括JVM啟動和資源隔離,均由TaskTracker 實現。
??????? TaskTracker為每個Task啟動一個獨立的JVM 以避免不同Task在運行過程中相互影響;同時,TaskTracker使用了操作系統進程實現資源隔離以防止Task濫用資源。
第四步:任務執行 , TaskTracker 為 Task 準備好運行環境后,便會啟動Task。
??????? 在運行過 程中,每個 Task 的最新進度首先由 Task 通過 RPC 匯報給TaskTracker,再由 TaskTracker 匯報給JobTracker。
第五步:作業完成, 待所有 Task 執行完畢后 , 整個作業執行成功。
3)、作業運行機制
按照時間順序包括: 輸入分片(input split) 、 map階段 、 combiner(化合)階段 、 shuffle 階段??、 reduce 階段。
4)、錯誤處理機制
a、硬件故障?
因為MapReduce執行主要由 JobTraceker 和 TaskTracker 來完成,所以硬件故障就是指宿主這兩個進程的物理節點。
若 JobTracker 發生故障,則整改作業就失敗了,因為只有一個 JobTracker(Hadoop沒有提供 JobTracker 的高可用方案,需要應用方自己提供解決方案,一般做法就是提供冗余節點,借助Zookeeper來實現選舉)。
若 TaskTracker 發生故障,由于其在運行過程中不斷和 JobTracker 進行心跳通信,JobTracker 能夠實時掌握 TaskTracker 的運行狀態, 所以發生故障后會自動安排另外一個 TaskTracker 來執行失敗任務。
PS:
TaskTracker 發生故障時,
若處于 Map 階段,則重新開始后,本任務相關的所有 Map 任務都需要重新再執行一遍。
若處于 Reduce 階段,則重新開始后,只需要再執行一遍發生錯誤的 Reduce即可, 已完成的部分不需要再執行,可直接提取完成結果。
b、任務失敗??
任務失敗一般有下面幾種情況:
第一種:用戶代碼缺陷會導致它在運行過程中拋出異常。此時,任務JVM進程會自己主動退出,并向TaskTracker父進程發送錯誤消息,同時錯誤消息也會寫入log文件,最后TaskTracker將此次任務嘗試標記失敗。
第二種:對于進程崩潰引起的任務失敗。TaskTracker的監聽程序會發現進程退出,此時TaskTracker也會將此次任務嘗試標記為失敗。
第三種:對于死循環程序或運行時間太長的程序。由于TaskTracker沒有接收到進度更新,它也會將此次任務嘗試標記為失敗,并殺死程序相應的進程。
發現任務失敗時,
TaskTracker將TaskTracker自身的任務計數器減1, 以便向JobTracker申請新的任務。
TaskTracker也會通過心跳機制告訴JobTracker本地的一個任務嘗試失敗。JobTracker接到任務失敗的通知后,通過重置任務狀態,將其加入調度隊列來再一次分配該任務運行。
PS:
JobTracker 再次分配任務時,會嘗試避免將該任務再分配給上次發生錯誤的 TaskTracker 來執行, 嘗試一定次數(可配置),就不會再重試了,這個作業就執行失敗了。
9、Yarn
YARN:Yet Another Resource Negotiator,另一種資源協調者,在Hadoop2.0開始加入,早期的任務調度都集成在MapReduce處理。
Yarn是一個資源調度平臺,負責為運算程序提供服務器運算資源,相當于一個分布式的操作系統平臺,而MapReduce等運算程序則相當于運行于操作系統之上的應用程序。Hadoop的所有運算任務都是由Yarn來進行調度。
Yarn主要包括下面幾個組件:
a、Client
b、ResourceManager
c、NodeManager
d、ApplicationMaster
e、Container
1)、組件介紹
a、Client
?? 負責提交應用運算任務請求
b、ResourceManager
?? 負責集群資源的統一管理和調度, 整個集群只有一個,其主要任務為處理客戶端的請求、啟動或監控 ApplicationMaster 、監控 NodeManager、資源分配與調度。
??
c、NodeManager
?? 負責單節點資源的管理和使用, 整個集群有多個,其主要任務為處理單節點上的資源管理和任務管理、 處理來自 ReduceManager 的命令、 處理來自 ApplicationMaster 的命令。
d、ApplicationMaster
?? 負責應用程序的管理,每個應用一個,其主要任務是對數據的切分、為應用申請資源并進一步分配給內部任務、任務監控與容錯。
e、Container
?? 抽象任務運行環境,包括運行資源(節點、內存、 CPU)和環境變量,其主要任務是封裝任務啟動命令、任務運行環境等相關信息。
2)、運行機制
a、調度策略
??? Yarn采用雙層調度,ReduceManager 將資源分配給 ApplicationMaster , ApplicationMaster 將資源進一步分配給 Task。
??? 在Yarn中有三種調度器:FIFO Scheduler(先進先出調度),Capacity Scheduler(容器調度),FairScheduler(公平調度)。
b、運行過程
1) 用戶向 YARN 中提交應用程序 , 其中包括 ApplicationMaster 程序 , 啟動 ApplicationMaster 命令、 用戶程序等 .
????2) ReduceManager 為該程序分配第一個 Container(容器) , 并與對應的 NodeManager 通信 , 要求它在這個 Container 中啟動應用程序的 ApplicationMaster .
????3) ApplicationMaster 首先向 ReduceManager 注冊 , 這樣用戶可以直接通過 ReduceManager 查看應用程序的運行狀態 , 然后它將為各個任務申請資源 , 并監控它的狀態 , 直到運行結束??.
????4) ApplicationMaster 采用輪詢的方式通過 RPC 協議向 ReduceManager 申請和領取資源 .
????5) 一旦 ApplicationMaster 申請到資源后 , 便與對應的 NodeManager 通信 , 要求它啟動任務 .
????6) NodeManager 為任務設置好運行環境 ,(包括環境變量 、 jar包 、 二進制程序)后 , 將任務啟動命令寫到另一個腳本中 , 并通過運行該腳本啟動任務 .
????7) 各個任務通過某個 RPC 協議向 ApplicationMaster 匯報自己的狀態和進度 , 讓 ApplicationMaster 隨時掌握各個任務的運行狀態 , 從而可以在任務失敗時重新啟動任務 , 在應用程序運行過程中 , 用戶可以隨時通過 RPC 向 ApplicationMaster 查詢應用程序的當前運行狀態 .
????8) 應用程序完成后 , ApplicationMaster 向 ReduceManager 注銷并關閉自己 .
3)、高可用
在Yarn架構中,ResourceManager充當著資源管理的大腦角色,但只能有一個活動的ResourceManager對外提供服務,所以存在單節點故障,? 存在單點故障和性能不足問題,所以在實際生產應用中必須增加高可用方案,保證集群高可用。
實現HA方案,類似HDFS的HA方案,但沒有共享存儲,直接存儲在Zookeeper上,具體包括下面幾個重要組件:
a、Zookeeper集群
???? 選舉和故障自動切換,產生Active的ResourceManager
b、ResourceManager(Active)
???? 處于活動狀態的RM,對外提供服務
c、ResourceManager(Standby)
???? 處于備用狀態的命名節點,不能提供對外服務,通過共享Zookeeper集群上的狀態信息實現Active狀態的RM的熱備。
d、ZKFailoverController(ZKFC)
????? 是Zookeeper集群的一個客戶端,不是獨立的進程,只是一個線程,宿主在RM進程上,向Zookeeper集群上報RM的狀態,用于實現RM故障自動切換。
4)、資源隔離方案
???? Yarn 資源隔離支持兩種隔離方式分別為內存隔離與 CPU 隔離??
????1) 內存隔離是基于線程監控的方案, 可以決定應用程序的 '生死'
????2) CPU 隔離是基于 Cgroups(Linux提供的一種物理資源隔離機制) 的方案, 默認不對 CPU 資源進行隔離
5)、容錯機制????
a、ApplicationMaster 容錯
?????? ResourceManager 實時掌握 ApplicationMaster 的運行狀態,若 ApplicationMaster 運行失敗后,ResourceManager 會重新分配資源并啟動它,ApplicationMaster 在運行過程中會保存作業執行狀態到 HDFS 上, 用于發生錯誤時恢復數據并繼續執行,不用重新開始。
b、NodeManager 容錯
?????? ResourceManager 實時掌握 NodeManager 的運行狀態,若 NodeManager 運行任務失敗后, ResourceManager 會將失敗任務告訴對應的 ApplicationMaster,ApplicationMaster 會重新向 ResourceManager 申請資源Container,并重新運行失敗任務。
c、Container容錯
???????? ResourceManager 實時掌握 Container 的運行狀態,若在一定時間內 ApplicationMaster 沒有啟動已經分配到的 Container, 則 ResourceManager 會將其收回;若 Container 在運行過程中,由于意外原因導致運行失敗,則 ResourceManager 會 通知 ApplicationMaster,
???????? ApplicationMaster會對失敗的 Container 執行的任務進行容錯處理。
部署方式
1、單機模式
Hadoop 僅作為庫存在,可以在單計算機上執行 MapReduce 任務,僅用于開發者搭建學習和試驗環境。
2、偽集群模式
Hadoop 將以守護進程的形式在單機運行,一般用于開發者搭建學習和試驗環境。
3、集群模式
Hadoop 的生產環境模式,也就是說這才是 Hadoop 真正使用的模式,用于提供生產級服務。
優缺點分析
缺點:
1、不適合低延遲數據訪問且不支持隨機訪問? ?????
2、不支持多用戶并發寫入文件????
3、不支持修改已寫入文件內容,可支持追加新內容
4、命名空間受限制,因為NameNode只能是單節點,所有元數據都需要保存在內存中,內存的大小受限制,從而會引發如下缺點:
???? a、無法高效存儲大量的小文件,小文件元數據占據大量內存空間
???? b、性能瓶頸,只有一個NameNode節點,所有的DataNode和客戶端需要和NameNode通信,吞吐量受限
???? c、隔離問題,所有作業在同一個命名空間下
???? d、集群不支持高可用(HA)
??? 不過在2.0以后版本,通過下面兩種方式,克服了這一問題,保證了高可用(HA)和大容量:
??? 1)、NameNode HA
????????? a、采用NFS共享存儲解決方案。b、基于Qurom Journal Manager(QJM)解決方案
??? 2)、NameNode Federation
????????? a、采用Fedration方式,提供多個NameNode組成一個聯邦,然后將元數據切片分散到各個NameNode節點,每個分區使用一個NameNode。
?????????
????????? b、NameNode共用DataNode
優點:
1.處理超大文件,存儲海量數據,簡單的文件模型
?? 文件都是分塊以流式順序寫入,一次寫入,后續不允許修改,只能追加。
??
?? 通過分塊可以支持存儲超大的數據文件,便于數據傳輸,便于檢查錯誤并做錯誤恢復處理,保證數據的可靠性。
2、高效性
?? 能夠在節點之間動態的自動移動數據,并保證每個節點的動態平衡。
?? 可并行執行任務,處理超大數據文件,加快處理速度。
3、高容錯性
?? 能夠自動保存數據的多個副本且自動將失敗的任務重新分配再次執行。
?? 自動提供容錯機制,副本丟失會自動恢復。
?? 文件完整性校驗:通過CRC32校驗,用其他副本去掉損壞文件。
?? 節點宕機會自動恢復節點所承載的數據。
4、高擴展性
??
?? 支持在集群各節點間分配任務及所需數據,從而完成計算任務。
?? 可便利的動態伸縮節點,支持普通硬件的PC設備。
5、高可靠性
???? 元數據信息:FsImage + Editlog多份存儲,保證不丟數據且快速恢復
???? Heartbeat:檢測NameNode、DataNode等節點是否失效。
???
???? NameNode HA: 主備切換,保證高可用
???? NameNode Federation:NameNode分區分布且共享DataNode,保證命名服務容量不受限
常見應用場景
1、大型數據倉庫(靜態數倉)
??
???? 可支持超大容量的數據存儲(PB級),同時便于數據的分析、處理、統計。例如:搜索引擎、日志分析、商業智能、數據挖掘、用戶畫像等。
2、大型實時數據庫(實時數倉)
???? 為HBase提供底層存儲,可提供實時大數據業務訪問。例如:搜索引擎、在線旅游、廣告推薦、在線實時聯機查詢、電子商務、智能儀器推薦等。
3、大型分布式存儲分析
????? 支持海量數據分布式存儲,分布式計算。例如:日志分析、移動數據存儲分析、設備數據存儲分析、用戶行為存儲分析、機器學習等。
調優經驗
PS:后續逐漸把實踐調優過程補充上來
API應用:
各個平臺一般都有相應的操作組件,下面介紹下java和DoNet平臺下的訪問組件。
java平臺:
1、官方客戶端 Apache Hadoop Main? 推薦用這個
<dependency>
??????? <groupId>org.apache.hadoop</groupId>
??????? <artifactId>hadoop-core</artifactId>
??????? <version>版本</version>
</dependency>
<dependency>
??????? <groupId>org.apache.hadoop</groupId>
??????? <artifactId>hadoop-common</artifactId>
??????? <version>版本</version>
</dependency>
<dependency>
??????? <groupId>org.apache.hadoop</groupId>
??????? <artifactId>hadoop-hdfs</artifactId>
??? ????<version>版本</version>
</dependency>
<dependency>
??????? <groupId>org.apache.hadoop</groupId>
??????? <artifactId>hadoop-mapreduce-client-core</artifactId>
??????? <version>版本</version>
</dependency>
<dependency>
??????????? <groupId>org.apache.hadoop</groupId>
??????????? <artifactId>hadoop-yarn-common</artifactId>
??????????? <version>版本</version>
</dependency>
<dependency>
??????????? <groupId>org.apache.hadoop</groupId>
??????????? <artifactId>hadoop-yarn-api</artifactId>
??????????? <version>版本</version>
</dependency>
<dependency>
??????????? <groupId>org.apache.hadoop</groupId>
??????????? <artifactId>hadoop-yarn-client</artifactId>
??????????? <version>版本</version>
</dependency>
2、hadoop2lib? 一個jar包
DoNet平臺:
1、HttpHDFS 推薦使用這個
cloudera公司提供的一個訪問HDFS的http服務接口,獨立于hadoop服務。
2、HttpFS
Hadoop內嵌的一個訪問HDFS的http服務接口。
3、Hadoop.Client?
Nuget: 下載Hadoop.Client
4、Hadoop.WebHdfs.Client
Nuget: 下載Hadoop.WebHdfs.Client
5、Microsoft.Hadoop.Client
Nuget: 下載Microsoft.Hadoop.Client
總結
以上是生活随笔為你收集整理的大数据系列——Hadoop理论的全部內容,希望文章能夠幫你解決所遇到的問題。