2019/11/19 Caesar
前言
入門大數(shù)據(jù)技術(shù),當(dāng)選Hadoop。可以說Hadoop是大數(shù)據(jù)生態(tài)的基礎(chǔ),Hadoop是一套行業(yè)大數(shù)據(jù)標(biāo)準(zhǔn)開源文件,可以實(shí)現(xiàn)在分布式環(huán)境下提供海量數(shù)據(jù)的處理能力,我們就從Hadoop來開始學(xué)習(xí)大數(shù)據(jù)!
Hadoop是什么
??Hadoop在分布式環(huán)境下提供了海量數(shù)據(jù)的處理能力。幾乎所有主流廠商都圍繞Hadoop開發(fā)工具、開源軟件、商業(yè)化工具和技術(shù)服務(wù)。
Hadoop組成
- HDFS : Hadoop Distributed File System 分布式文件系統(tǒng)
- YARN : Yet Another Resource Negotiator 資源管理調(diào)度系統(tǒng)
- Mapreduce :分布式計(jì)算框架
HDFS
1. HDFS架構(gòu)

主從架構(gòu):
NameNode (名稱節(jié)點(diǎn)):NameNode維護(hù)文件系統(tǒng)名稱空間。對文件系統(tǒng)名稱空間或其屬性的任何更改均由NameNode記錄。應(yīng)用程序可以指定HDFS應(yīng)該維護(hù)的文件副本的數(shù)量。文件的副本數(shù)稱為該文件的復(fù)制因子。此信息由NameNode存儲。NameNode是所有HDFS元數(shù)據(jù)的仲裁器和存儲庫。
DataNode (數(shù)據(jù)節(jié)點(diǎn)):DataNode是存儲數(shù)據(jù)的集群節(jié)點(diǎn)。
2. HDFS如何實(shí)現(xiàn)數(shù)據(jù)容錯(cuò)
2.1 數(shù)據(jù)復(fù)制
??HDFS將所有存儲其中的文件分成若干個(gè)塊,除最后一個(gè)塊,其余塊大小相等,默認(rèn)為128M,可根據(jù)文件配置。復(fù)制文件的塊的目的是為了容錯(cuò),應(yīng)用程序可以指定復(fù)制的副本數(shù),即需要存儲幾份相同的數(shù)據(jù)。
??NameNode決定所有塊復(fù)制的細(xì)節(jié)。它定期從眾多 DataNode 中接受心跳信號和 Block Report,其中 Block Report 包含 DataNode 上所有塊的列表。圖示如下:

2.2 機(jī)制感知策略(可略)
??HDFS 通過機(jī)制感知策略,一種特定的算法來確定塊的位置。
??NameNode和JobTracker通過調(diào)用管理員配置模塊中的APIresolve來獲取集群里每個(gè)slave的機(jī)架id。該API將slave的DNS名稱(或者IP地址)轉(zhuǎn)換成機(jī)架id。使用哪個(gè)模塊是通過配置項(xiàng)topology.node.switch.mapping.impl來指定的。模塊的默認(rèn)實(shí)現(xiàn)會調(diào)用topology.script.file.name配置項(xiàng)指定的一個(gè)的腳本/命令。 如果topology.script.file.name未被設(shè)置,對于所有傳入的IP地址,模塊會返回/default-rack作為機(jī)架id。在Map/Reduce部分還有一個(gè)額外的配置項(xiàng)mapred.cache.task.levels,該參數(shù)決定cache的級數(shù)(在網(wǎng)絡(luò)拓?fù)渲校@?,如果默認(rèn)值是2,會建立兩級的cache- 一級針對主機(jī)(主機(jī) -> 任務(wù)的映射)另一級針對機(jī)架(機(jī)架 -> 任務(wù)的映射)。
2.3 副本放置策略
??HDFS 通過副本放置策略在集群上不同節(jié)點(diǎn)放置副本,副本數(shù)可通過配置文件更改,下面介紹大多數(shù)情況下采用的策略。
??當(dāng)復(fù)制因子為3時(shí),HDFS的放置策略是將一個(gè)副本放置在本地機(jī)架的一個(gè)節(jié)點(diǎn)上,將另一個(gè)副本放置在本地機(jī)架的不同節(jié)點(diǎn)上,將最后一個(gè)副本放置在不同機(jī)架的不同節(jié)點(diǎn)上。如果復(fù)制因子大于3,則在確定每個(gè)機(jī)架的副本數(shù)量低于上限(基本上是(副本-1)/機(jī)架+ 2)以下的同時(shí),隨機(jī)確定第4個(gè)及以下副本的位置。使用此策略,文件的副本不會均勻分布在機(jī)架上。三分之一的副本位于一個(gè)節(jié)點(diǎn)上,三分之二的副本位于一個(gè)機(jī)架上,其余三分之一則均勻分布在其余機(jī)架上。由于NameNode不允許DataNode具有同一塊的多個(gè)副本,因此創(chuàng)建的副本的最大數(shù)量是當(dāng)時(shí)DataNode的總數(shù)。
2.4 安全模式
??HDFS啟動后,NameNode進(jìn)入一個(gè)特殊的狀態(tài),稱為安全模式。在安全模式下,NameNode不會發(fā)生數(shù)據(jù)塊的復(fù)制,NameNode從DataNode接收心跳和Blockreport消息。Blockreport包含DataNode托管的數(shù)據(jù)塊列表。每個(gè)Block都有指定的最小副本數(shù)。如果一個(gè)Block的副本數(shù)達(dá)到最小副本數(shù),就被NameNode認(rèn)為是已經(jīng)安全復(fù)制的Block,即滿足HDFS對于數(shù)據(jù)冗余容錯(cuò)的要求。經(jīng)過一定百分比的Block被檢查為安全復(fù)制的時(shí)間,再加上30S后,NameNode推出安全模式,至于那些沒有達(dá)到最小副本數(shù)的Block,NameNode會將它們復(fù)制到其他DataNode。
3. HDFS元數(shù)據(jù)管理
3.1 NameNode
??HDFS命名空間由NameNode存儲,NameNode有兩種重要的數(shù)據(jù)結(jié)構(gòu),分別是FsImage 和 EditLog。稱為EditLog的事務(wù)日志來永久記錄文件系統(tǒng)元數(shù)據(jù)發(fā)生的每個(gè)更改。例如,在HDFS中創(chuàng)建一個(gè)新文件將導(dǎo)致NameNode將一條記錄插入到EditLog中。NameNode使用其本地主機(jī)OS文件系統(tǒng)中的文件來存儲EditLog。整個(gè)文件系統(tǒng)名稱空間(包括塊到文件的映射和文件系統(tǒng)屬性)存儲在名為FsImage的文件中。FsImage也作為文件存儲在NameNode的本地文件系統(tǒng)中。
3.2 SecondyNameNode
??SecondyNameNode 是 NameNode 冷備,一般放在與 NameNode 不同位置的主機(jī)上。SecondyNameNode 主要有兩個(gè)作用。一是在 NameNode 工作的時(shí)候, SecondyNameNode 通過對 NameNode 中 FsImage 和 EditLog 的操作來完成備份,提高 NameNode 的啟動效率。二是在 NameNode宕掉的時(shí)候, 用來恢復(fù)數(shù)據(jù),不過不能代替 NameNode 的作用,因?yàn)樗鼪]有元數(shù)據(jù)更新機(jī)制。
3.2.1 備份過程
??FsImage 存儲著塊到文件的映射和文件系統(tǒng)屬性,Edits 存儲著文件系統(tǒng)元數(shù)據(jù)發(fā)生的每個(gè)更改。在 NameNode 中,隨著運(yùn)行時(shí)間持續(xù), Edits 文件越來越大, 如果 NameNode 再次啟動,會將記錄在 Edits 文件的操作合并在 FsImage 文件中,并清空 Edits。但是因?yàn)?Edits 文件過大,啟動效率低。所以 SecondyNameNode 會經(jīng)常性將 FsImage 和 Edits 通過網(wǎng)絡(luò)拷貝到當(dāng)前節(jié)點(diǎn)進(jìn)行數(shù)據(jù)合并,再拷貝回 NameNode,并清空 Edits。同時(shí) SecondyNameNode 也保留了 元數(shù)據(jù)。觸發(fā)拷貝可以是兩個(gè)條件,一個(gè)是時(shí)間因素(超過默認(rèn)時(shí)間觸發(fā)),一個(gè)是 Edits 文件大?。ǔ^大小觸發(fā))。
4. 文件讀寫
4.1 讀文件
??假設(shè)需求是在 HDFS 中下載文件至 Linux 本地,即讀文件。客戶端 Client 向 NameNode 發(fā)起讀文件請求, NameNode 會做權(quán)限檢查,確定 Client 是否有權(quán)限進(jìn)行讀文件,然后經(jīng)過算法分析,獲取文件的 Block 列表,列表包含內(nèi)容為 各Block存儲的最近的 DataNode,將列表返回給 Client。Client 獲取到位置信息后,和對應(yīng)的 DataNode 之間建立 pipeline 管道(水管),通過管道以 pakage 為單位將 Block 數(shù)據(jù)拷貝到 Client,然后由 Client 將各 Block 合并成一個(gè)最終的文件。
4.2 寫文件
??假設(shè)需求是往 HDFS 中上傳文件,即寫文件??蛻舳?Client 向 NameNode 發(fā)起寫文件請求, NameNode 會做權(quán)限檢查,確定 Client 是否有權(quán)限進(jìn)行寫文件, NameNode 通過檢測
” DataNode 信息池“ 來獲取壓力不太大的 DataNode 列表,將列表返回給 Client。Client 獲取到位置信息后,和最近的一個(gè) DataNode 之間建立 pipeline 管道(水管),通過管道以 pakage 為單位將 Block 數(shù)據(jù)拷貝到此 DataNode,然后該 DataNode 再與下一個(gè) DataNode 建立管道,以此類推,將
Block 數(shù)據(jù)傳輸下去,在 DataNode 之間有一種應(yīng)答機(jī)制:ack應(yīng)答機(jī)制,當(dāng) DataNode 成功保存數(shù)據(jù)后,向前一個(gè) DataNode 報(bào)告?zhèn)鬏敵晒?,并關(guān)閉管道。最終 Client 成功地將數(shù)據(jù)寫入若干個(gè) DataNode中。