你的最后一篇 HDFS奏候,面試必備循集!

Hadoop

1. Hadoop 介紹

The Apache Hadoop project develops open-source software for reliable, scalable, 
distributed computing.
The Apache Hadoop software library is a framework that allows for the distributed 
processing of large data sets across clusters of computers using simple 
programming models. It is designed to scale up from single servers to thousands of 
machines, each offering local computation and storage. Rather than rely on 
hardware to deliver high-availability, the library itself is designed to detect and 
handle failures at the application layer, so delivering a highly-available service on 
top of a cluster of computers, each of which may be prone to failures.

Hadoop 是開(kāi)源的可靠、可伸縮的分布式計(jì)算軟件蔗草。從單臺(tái)服務(wù)器擴(kuò)展到數(shù)千臺(tái)機(jī)器咒彤,每臺(tái)都能提供本地計(jì)算和存儲(chǔ)疆柔,通過(guò)簡(jiǎn)單的編程模型跨計(jì)算機(jī)集群對(duì)大型數(shù)據(jù)集進(jìn)行分布式處理。與依賴硬件來(lái)提供高可用不用镶柱,Hadoop 本身的設(shè)計(jì)目的就是在每一臺(tái)服務(wù)器都有可能發(fā)生故障的前提下設(shè)計(jì)完成的旷档。

Hadoop 的開(kāi)發(fā)過(guò)程主要經(jīng)歷了 1.x、2.x 和 3.x歇拆,現(xiàn)在主流還是使用 2.x 和 3.x 居多鞋屈,2.x 版本比 1.x 版本多了 Yarn 資源調(diào)度框架,3.x 版本在 2.x 版本的基礎(chǔ)上天生支持 HA(Hadoop 高可用)查吊。

2. Hadoop 集群配置

2.1 Hadoop 集群安裝

初學(xué)者應(yīng)該多關(guān)注 Hadoop Apache 官網(wǎng)谐区,官網(wǎng)上有安裝及報(bào)錯(cuò)資料。Hadoop 單節(jié)點(diǎn)偽分布式安裝介紹網(wǎng)址如下:

Hadoop 偽分布式安裝

初學(xué)者使用虛擬機(jī)或者云服務(wù)器主機(jī)進(jìn)行 Hadoop 偽分布式安裝即可逻卖。

2.2 Hadoop 配置

在完成 Hadoop 安裝之后宋列,默認(rèn)配置即可,但是有些參數(shù)依舊重要评也,我們要了解知道炼杖,為以后 Hadoop 集群配置調(diào)優(yōu)打下基礎(chǔ)。

  1. 日志

    Hadoop 使用 Apache log4j 來(lái)記錄日志盗迟,編輯 conf/log4j.properties 文件可以改變 Hadoop 守護(hù)進(jìn)程的日志配置坤邪。

  2. 機(jī)架感知

    Hadoop 組件可識(shí)別機(jī)架。Hadoop 會(huì)將 HDFS 塊利用機(jī)架感知放置在不同的機(jī)架上罚缕,以此來(lái)進(jìn)行容災(zāi)和容錯(cuò)艇纺。如果網(wǎng)絡(luò)交換機(jī)集群中發(fā)生故障,但是集群存在分區(qū)邮弹,這將提供數(shù)據(jù)可用性黔衡。

    默認(rèn)使用機(jī)架標(biāo)識(shí)符和主機(jī) IP 來(lái)進(jìn)行標(biāo)識(shí)。同樣腌乡,如果我們有特殊需求可以進(jìn)行定制化機(jī)架感知盟劫。

    Hadoop 官網(wǎng)關(guān)于機(jī)架感知介紹

2.3 運(yùn)行進(jìn)程

Hadoop 安裝啟動(dòng)后使用 jps 命令可以看到有哪些啟動(dòng)進(jìn)程。

  1. NameNode

    是 HDFS 的主服務(wù)器与纽,管理文件系統(tǒng)的目錄樹(shù)以及對(duì)集群中存儲(chǔ)文件的訪問(wèn)侣签,保存有 metadate,不斷讀取記錄集群中 DataNode 主機(jī)狀況和工作狀態(tài)急迂。

  2. SecondaryNameNode

    NameNode 的冷備影所,負(fù)責(zé)周期性的合并 esimage 以及 editslog ,減少 NameNode 的工作量僚碎。

  3. DataNode

    負(fù)責(zé)管理各個(gè)存儲(chǔ)節(jié)點(diǎn)猴娩,每個(gè)存儲(chǔ)數(shù)據(jù)的節(jié)點(diǎn)都有一個(gè) DataNode 守護(hù)進(jìn)程。

  4. ResourceManager

    負(fù)責(zé)調(diào)度 DataManager 上的資源,每個(gè) DataNode 都有一個(gè) NodeManager (TaskTracker)來(lái)執(zhí)行實(shí)際工作胀溺。

  5. NodeManager

    管理 slave 節(jié)點(diǎn)的資源。

3 Hadoop 架構(gòu)設(shè)計(jì)

3.1 HDFS的設(shè)計(jì)

Hadoop 以流式數(shù)據(jù)訪問(wèn)模式來(lái)存儲(chǔ)超大文件皆看,運(yùn)行于商業(yè)硬件集群上仓坞。

HDFS 架構(gòu)
  1. 超大文件

    "超大文件"在這里指具有幾百 MB,幾百 GB 甚至幾百 TB 大小的文件腰吟。

  2. 流式數(shù)據(jù)訪問(wèn)

    HDFS 的構(gòu)建思路是這樣的:一次寫(xiě)入无埃、多次讀取是最高效的訪問(wèn)模式,數(shù)據(jù)集通常由數(shù)據(jù)源生成或從數(shù)據(jù)源復(fù)制而來(lái)毛雇,接著長(zhǎng)時(shí)間在此數(shù)據(jù)集上進(jìn)行各種分析嫉称。每次分析都將涉及該數(shù)據(jù)集的大部分甚至全部,因此讀取整個(gè)數(shù)據(jù)集的時(shí)間延遲比讀取第一條記錄的時(shí)間延遲更重要灵疮。

  3. 商用硬件

    Hadoop 并不需要運(yùn)行在昂貴且高可靠的硬件上织阅,它是設(shè)計(jì)運(yùn)行在商用硬件的集群上,因此至少對(duì)于龐大的集群來(lái)說(shuō)震捣,節(jié)點(diǎn)故障的概率還是非常高的荔棉。HDFS 遇到上述故障時(shí),被設(shè)計(jì)成能夠繼續(xù)運(yùn)行且不讓用戶察覺(jué)到明顯的中斷蒿赢。

  4. 低時(shí)間延遲的數(shù)據(jù)訪問(wèn)

    要求低時(shí)間延遲數(shù)據(jù)訪問(wèn)的應(yīng)用润樱,例如幾十毫秒范圍,不適合在 HDFS 上運(yùn)行羡棵,HDFS 是為高數(shù)據(jù)吞吐量應(yīng)用優(yōu)化的壹若,這可能會(huì)以提高時(shí)間延遲為代價(jià),對(duì)于低延遲的訪問(wèn)需求皂冰,HBase 是更好的選擇店展。

  5. 大量的小文件

    由于 namenode 將文件系統(tǒng)的元數(shù)據(jù)存儲(chǔ)在內(nèi)存中,因此該文件系統(tǒng)所能存儲(chǔ)的文件總數(shù)受限于 namenode 的內(nèi)存總量灼擂。根據(jù)經(jīng)驗(yàn)壁查,每個(gè)文件、目錄和數(shù)據(jù)塊的存儲(chǔ)信息大約占 150 字節(jié)剔应。因此睡腿,距離來(lái)說(shuō),如果有一百萬(wàn)個(gè)文件峻贮,且每個(gè)文件占一個(gè)數(shù)據(jù)塊席怪,那至少需要 300 MB 的內(nèi)存。盡管存儲(chǔ)上百萬(wàn)個(gè)文件是可行的纤控,但是存儲(chǔ)數(shù)十億個(gè)文件就超出了當(dāng)前硬件的能力挂捻。

  6. 多用戶寫(xiě)入,任意修改文件

    HDFS 中的文件寫(xiě)入只支持單個(gè)寫(xiě)入者船万,而且寫(xiě)操作總是以"只添加"方式在文件末尾寫(xiě)數(shù)據(jù)刻撒。它不支持多個(gè)寫(xiě)入者的操作骨田,也不支持在文件的任意位置進(jìn)行修改

3.2 HDFS 的概念

3.2.1 數(shù)據(jù)塊

和普通的文件系統(tǒng)相同,HDFS 同樣也有(block)的概念声怔,默認(rèn)為 128 MB态贤。HDFS 上的文件也被劃分為塊大小的多個(gè)分塊(chunk),作為獨(dú)立的存儲(chǔ)單元醋火。HDFS 中小于一個(gè)塊大小的文件不會(huì)占據(jù)整個(gè)塊的空間悠汽。

HDFS 中塊為什么默認(rèn) 128 MB

HDFS 中的塊默認(rèn)為 128 MB,是為了最小化尋址開(kāi)銷(xiāo)芥驳。如果塊足夠大柿冲,從磁盤(pán)傳輸數(shù)據(jù)的時(shí)間會(huì)明顯大于定位這個(gè)塊開(kāi)始位置所需的時(shí)間。因此傳輸一個(gè)由多個(gè)快組成的大文件的時(shí)間取決于磁盤(pán)傳輸速率兆旬。

但是這個(gè)塊大小的參數(shù)也不能設(shè)置的過(guò)大假抄,MapReduce 中的 map 任務(wù)通常一次只處理一個(gè)塊中的數(shù)據(jù),因此如果任務(wù)數(shù)太少(少于集群中的節(jié)點(diǎn)數(shù)量)丽猬,作業(yè)的運(yùn)行速度就會(huì)比較慢慨亲。

文件分塊的好處

  1. 設(shè)計(jì)成分塊,那么一個(gè)文件的大小可以大于網(wǎng)絡(luò)中任意一個(gè)磁盤(pán)的容量宝鼓。文件中的所有塊并不需要存儲(chǔ)在同一個(gè)磁盤(pán)上刑棵,分塊后可以利用集群中任意一個(gè)機(jī)器進(jìn)行存儲(chǔ)。
  2. 使用抽象塊而非整個(gè)文件作為存儲(chǔ)單元愚铡,簡(jiǎn)化了存儲(chǔ)子系統(tǒng)的設(shè)計(jì)蛉签,簡(jiǎn)化了存儲(chǔ)管理,同時(shí)也消除了對(duì)元數(shù)據(jù)的顧慮(塊只要存儲(chǔ)的大塊文件沥寥,而文件的元數(shù)據(jù)碍舍,如權(quán)限信息,并不需要與塊一起存儲(chǔ)邑雅,這樣的話其他系統(tǒng)就可以單獨(dú)管理這些元數(shù)據(jù))片橡。
  3. 塊非常適用于數(shù)據(jù)備份進(jìn)而提供數(shù)據(jù)容錯(cuò)能力和提高可用性。HDFS 中每個(gè)塊的默認(rèn)副本數(shù)為 3淮野,使用機(jī)架感知捧书,將這些塊分布在不同的服務(wù)器上,既能減少集群中單個(gè)機(jī)器的讀取負(fù)載骤星,又能進(jìn)行容錯(cuò)容災(zāi)经瓷。

3.2.2 塊緩存

通常 datanode 從磁盤(pán)讀取塊,但是對(duì)于訪問(wèn)頻繁的文件洞难,其對(duì)應(yīng)的塊可能被顯式的緩存在 datanode 的內(nèi)存中舆吮,以堆外內(nèi)存(off-heap block cache)的形式存在。作業(yè)調(diào)度器(用于MapReduce、Spark和其他框架的)通過(guò)在緩存塊的 datanode 上運(yùn)行任務(wù)色冀,可以利用塊緩存的優(yōu)勢(shì)提高讀操作的性能潭袱。例如,連接(join)操作中使用的一小的查詢表就是塊緩存的很好的候選锋恬。

3.3 HDFS 文件讀取

HDFS 文件讀取
  1. 客戶端向 NameNode 發(fā)出寫(xiě)文件請(qǐng)求敌卓。
  2. 檢查是否已存在文件、檢查權(quán)限伶氢。若通過(guò)檢查,直接先將操作寫(xiě)入EditLog瘪吏,并返回輸出流對(duì)象癣防。
    (注:WAL,write ahead log掌眠,先寫(xiě) Log蕾盯,再寫(xiě)內(nèi)存,因?yàn)?EditLog 記錄的是最新的HDFS客戶端執(zhí)行所有的寫(xiě)操作蓝丙。如果后續(xù)真實(shí)寫(xiě)操作失敗了级遭,由于在真實(shí)寫(xiě)操作之前,操作就被寫(xiě)入 EditLog 中了渺尘,故 EditLog 中仍會(huì)有記錄挫鸽,我們不用擔(dān)心后續(xù) client 讀不到相應(yīng)的數(shù)據(jù)塊,因?yàn)樵诘?5 步中 DataNode 收到塊后會(huì)有一返回確認(rèn)信息鸥跟,若沒(méi)寫(xiě)成功丢郊,發(fā)送端沒(méi)收到確認(rèn)信息,會(huì)一直重試医咨,直到成功)
  3. client 端按 128 MB 的塊切分文件枫匾。
  4. client 將 NameNode 返回的分配的可寫(xiě)的 DataNode列表Data數(shù)據(jù) 一同發(fā)送給最近的第一個(gè) DataNode 節(jié)點(diǎn),此后 client 端和 NameNode 分配的多個(gè) DataNode 構(gòu)成 pipeline 管道拟淮,client 端向輸出流對(duì)象中寫(xiě)數(shù)據(jù)干茉。client 每向第一個(gè) DataNode 寫(xiě)入一個(gè)packet,這個(gè)packet便會(huì)直接在 pipeline 里傳給第二個(gè)很泊、第三個(gè)…DataNode角虫。
    (注:并不是寫(xiě)好一個(gè)塊或一整個(gè)文件后才向后分發(fā))
  5. 每個(gè) DataNode 寫(xiě)完一個(gè)塊后,會(huì)返回確認(rèn)信息委造。
    (注:并不是每寫(xiě)完一個(gè) packet 后就返回確認(rèn)信息上遥,個(gè)人覺(jué)得因?yàn)?packet 中的每個(gè) chunk 都攜帶校驗(yàn)信息,沒(méi)必要每寫(xiě)一個(gè)就匯報(bào)一下争涌,這樣效率太慢粉楚。正確的做法是寫(xiě)完一個(gè) block 塊后,對(duì)校驗(yàn)信息進(jìn)行匯總分析,就能得出是否有塊寫(xiě)錯(cuò)的情況發(fā)生)
  6. 寫(xiě)完數(shù)據(jù)模软,關(guān)閉輸輸出流伟骨。
  7. 發(fā)送完成信號(hào)給 NameNode。
    (注:發(fā)送完成信號(hào)的時(shí)機(jī)取決于集群是強(qiáng)一致性還是最終一致性燃异,強(qiáng)一致性則需要所有 DataNode 寫(xiě)完后才向 NameNode 匯報(bào)携狭。最終一致性則其中任意一個(gè) DataNode 寫(xiě)完后就能單獨(dú)向 NameNode 匯報(bào),HDFS 一般情況下都是強(qiáng)調(diào)強(qiáng)一致性)

3.4 HDFS 文件寫(xiě)入

HDFS 文件寫(xiě)入
  1. client 訪問(wèn) NameNode 回俐,查詢?cè)獢?shù)據(jù)信息逛腿,獲得這個(gè)文件的數(shù)據(jù)塊位置列表,返回輸入流對(duì)象仅颇。
  2. 就近挑選一臺(tái) datanode 服務(wù)器单默,請(qǐng)求建立輸入流 。
  3. DataNode 向輸入流中中寫(xiě)數(shù)據(jù)忘瓦,以 packet 為單位來(lái)校驗(yàn)搁廓。
  4. 關(guān)閉輸入流

3.5 讀寫(xiě)過(guò)程中保證數(shù)據(jù)完整性

HDFS 通過(guò)校驗(yàn)和保證數(shù)據(jù)完整性。因?yàn)槊總€(gè) chunk 中都有一個(gè)校驗(yàn)位耕皮,一個(gè)個(gè) chunk 構(gòu)成 packet 境蜕,一個(gè)個(gè) packet 最終形成 block ,故可在 block 上求校驗(yàn)和凌停。HDFS 的 client 端即實(shí)現(xiàn)了對(duì) HDFS 文件內(nèi)容的校驗(yàn)和(checksum)檢查粱年。當(dāng)客戶端創(chuàng)建一個(gè)新的 HDFS 文件時(shí)候,分塊后會(huì)計(jì)算這個(gè)文件每個(gè)數(shù)據(jù)塊的校驗(yàn)和罚拟,此校驗(yàn)和會(huì)以一個(gè)隱藏文件形式保存在同一個(gè) HDFS 命名空間下逼泣。當(dāng) client 端從HDFS 中讀取文件內(nèi)容后,它會(huì)檢查分塊時(shí)候計(jì)算出的校驗(yàn)和(隱藏文件里)和讀取到的文件塊中校驗(yàn)和是否匹配舟舒,如果不匹配拉庶,客戶端可以選擇從其他 DataNode 獲取該數(shù)據(jù)塊的副本。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秃励,一起剝皮案震驚了整個(gè)濱河市氏仗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夺鲜,老刑警劉巖皆尔,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異币励,居然都是意外死亡慷蠕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)食呻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)流炕,“玉大人澎现,你說(shuō)我怎么就攤上這事∶勘伲” “怎么了剑辫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)渠欺。 經(jīng)常有香客問(wèn)我妹蔽,道長(zhǎng),這世上最難降的妖魔是什么挠将? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任胳岂,我火速辦了婚禮,結(jié)果婚禮上舔稀,老公的妹妹穿的比我還像新娘乳丰。我一直安慰自己,他們只是感情好镶蹋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著赏半,像睡著了一般贺归。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上断箫,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天拂酣,我揣著相機(jī)與錄音,去河邊找鬼仲义。 笑死婶熬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的埃撵。 我是一名探鬼主播赵颅,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼暂刘!你這毒婦竟也來(lái)了饺谬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谣拣,失蹤者是張志新(化名)和其女友劉穎募寨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體森缠,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拔鹰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贵涵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片列肢。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恰画,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出例书,到底是詐尸還是另有隱情锣尉,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布决采,位于F島的核電站自沧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏树瞭。R本人自食惡果不足惜拇厢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晒喷。 院中可真熱鬧孝偎,春花似錦、人聲如沸凉敲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爷抓。三九已至势决,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蓝撇,已是汗流浹背果复。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渤昌,地道東北人虽抄。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像独柑,于是被迫代替她去往敵國(guó)和親迈窟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353