一敌厘、Hadoop
Hadoop是Apache開源的大數(shù)據(jù)存儲(chǔ)及分析的工具。
-
數(shù)據(jù)存儲(chǔ)
- 以自帶的旗艦級(jí)分布式文件系統(tǒng)HDFS(Hadoop Distributed FileSystem)虐骑,存儲(chǔ)大數(shù)據(jù)文件。
-
數(shù)據(jù)分析
- 基于MapReduce框架的分析系統(tǒng)赎线,適合的問題有
- 需要以批處理的方式從分析整個(gè)數(shù)據(jù)集的問題
- 一次寫入廷没,多次讀取
- hadoop以數(shù)據(jù)本地化的特性來實(shí)現(xiàn)數(shù)據(jù)的快速分析。
- 基于MapReduce框架的分析系統(tǒng)赎线,適合的問題有
下圖展示的是最基礎(chǔ)的Hadoop的框架及常用的周邊服務(wù)
二垂寥、HDFS假設(shè)及目標(biāo)
HDFS是一種高容錯(cuò)颠黎、以流式數(shù)據(jù)訪問模式存儲(chǔ)超大文件,運(yùn)行于商用(低成本)硬件集群上滞项。它包含一下假設(shè)及目標(biāo):
-
節(jié)點(diǎn)故障
- Hadoop并不需要運(yùn)行在昂貴且高可靠的硬件上狭归,它是設(shè)計(jì)運(yùn)行在商用硬件(在各種零售商店都能買到的普通硬件)集群上的,因此對(duì)于龐大的集群來說節(jié)點(diǎn)故障與其說是一個(gè)異常不如說是一種正澄呐校現(xiàn)象过椎。所以快速監(jiān)測(cè)故障并自動(dòng)恢復(fù)是HDFS的核心架構(gòu)目標(biāo)。
-
大文件
- HDFS支持幾百M(fèi)B戏仓、幾百GB甚至幾百TB的文件疚宇。
- HDFS的設(shè)計(jì)思路是一次寫入竞惋、多次讀取是最高效的訪問模式,所以一旦文件被創(chuàng)建灰嫉、寫入、關(guān)閉后嗓奢,除了在文件最后追加以及清除文件全部?jī)?nèi)容之外讼撒,其他操作均被禁止。
- 也正是因?yàn)榇笪募脑騂adoop認(rèn)為移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)更合適股耽,即計(jì)算本地性根盒。
-
流式數(shù)據(jù)訪問
- 流式訪問相對(duì)于隨機(jī)訪問,只需一次尋址物蝙,然后順序讀取數(shù)據(jù)塊炎滞。
- HDFS認(rèn)為每次分析都將涉及到數(shù)據(jù)集的大部分甚至全部(即批處理,非交互式使用)诬乞,因此讀取整個(gè)數(shù)據(jù)集的時(shí)間延遲比讀取第一條記錄的時(shí)間延遲更重要(即強(qiáng)調(diào)高吞吐册赛,非低時(shí)間延遲訪問)。
從上面的假設(shè)和目標(biāo)我們很容易推斷出哪些應(yīng)用不適合在HDFS上運(yùn)行:
-
低時(shí)間延遲的數(shù)據(jù)訪問
- 要求幾十毫秒的應(yīng)用不適合在HDFS上運(yùn)行震嫉。HDFS是為高數(shù)據(jù)吞吐量應(yīng)用優(yōu)化的森瘪,這可能會(huì)以提高實(shí)踐延遲為代價(jià)。
-
大量的小文件
- 由于namenode將文件系統(tǒng)的元數(shù)據(jù)存儲(chǔ)在內(nèi)存中票堵,因此文件系統(tǒng)的文件總數(shù)受限于namenode的內(nèi)存容量扼睬。因此大量的小文件很可能使得OOM。
-
多用戶寫入悴势,任意修改文件
- HDFS文件寫入只支持單個(gè)寫入者窗宇,并且寫操作總是以只添加的方式在文件末尾寫數(shù)據(jù),不支持多寫入特纤、任意位置修改军俊。
三、HDFS基本概念
1 數(shù)據(jù)塊
HDFS將文件劃分為不同的塊(chunk)捧存,作為獨(dú)立的存儲(chǔ)單元蝇完,默認(rèn)為128M(可通過hdfs-site.xml
的dfs.blocksize
屬性來修改)。HDFS的塊比磁盤的塊(512B)大矗蕊,目的是為了最小化尋址的開銷短蜕。如果塊足夠大,從磁盤傳輸數(shù)據(jù)的時(shí)間會(huì)明顯大于定位這個(gè)塊開始位置所需的時(shí)間傻咖。
對(duì)文件進(jìn)行塊的抽象朋魔,有以下好處:
- 一個(gè)文件的大小可以大于網(wǎng)絡(luò)中任意一個(gè)磁盤的容量
- 簡(jiǎn)化了存儲(chǔ)子系統(tǒng)的設(shè)計(jì):塊大小固定,計(jì)算磁盤能存儲(chǔ)的塊相對(duì)容易卿操,簡(jiǎn)化管理存儲(chǔ)警检;將塊的存儲(chǔ)和元數(shù)據(jù)的存儲(chǔ)分離孙援。
- 適用于數(shù)據(jù)備份進(jìn)而提供數(shù)據(jù)容錯(cuò)能力和提高可用性。
2 NameNode和DataNode
HDFS集群有兩類節(jié)點(diǎn)以master-slaves的模式運(yùn)行扇雕,即一個(gè)namenode(master)和多個(gè)datanode(slaves)拓售。
namenode
- namenode管理文件系統(tǒng)的命名空間,它維護(hù)著文件系統(tǒng)樹及整棵樹內(nèi)所有的文件和目錄镶奉。這些信息以兩個(gè)文件形式永久保存在本地磁盤:文件系統(tǒng)鏡像(FsImage)和編輯日志(EditLog)础淤。
- namenode也記錄著每個(gè)文件中各個(gè)塊所在的datanode信息,但它不保存到文件中哨苛,而是在內(nèi)存中鸽凶,在系統(tǒng)啟動(dòng)時(shí)根據(jù)datanode的信息重建,并根據(jù)datanode發(fā)送的心跳信息更新文件塊所在的datanode映射關(guān)系建峭。
- namenode還負(fù)責(zé)控制客戶端(client)訪問文件玻侥。客戶端通過hadoop披露的文件系統(tǒng)命名空間來進(jìn)行文件操作亿蒸〈绽迹客戶端首先向namenode詢問文件塊所在的datanode,然后連接datanode發(fā)送讀寫的請(qǐng)求边锁。
- namenode分為活動(dòng)namenode(active namenode)票摇,輔助namenode(secondary namenode:負(fù)責(zé)定期合并FsImage和EditLog(checkpoint),以防止EditLog過大砚蓬,一般運(yùn)行在獨(dú)立的機(jī)器上矢门,因?yàn)樗枰鷑amenode同樣的內(nèi)存大小)灰蛙,備用namenode(standby namenode:當(dāng)主namenode發(fā)生故障時(shí)可進(jìn)行熱替換)
datanode
- datanode是文件系統(tǒng)的工作節(jié)點(diǎn)祟剔,存儲(chǔ)文件塊,并定時(shí)向namenode發(fā)送他們所存儲(chǔ)的塊列表摩梧。
- 一個(gè)文件一般來說會(huì)被切分為多個(gè)數(shù)據(jù)塊存儲(chǔ)到一系列的datanode中物延。
- datanode還負(fù)責(zé)塊創(chuàng)建、檢測(cè)仅父、根據(jù)namenode的指示創(chuàng)建復(fù)本叛薯。
下圖展示了client、namenode笙纤、datanode之間的通信過程耗溜。
3 FsImage和EditLog
EditLog
文件系統(tǒng)客戶端執(zhí)行寫操作時(shí),這些事務(wù)首先會(huì)被記錄到EditLog中省容。namenode在內(nèi)存中維護(hù)文件系統(tǒng)元數(shù)據(jù)抖拴,當(dāng)編輯日志被修改時(shí),相關(guān)元數(shù)據(jù)也同步更新腥椒。內(nèi)存中的元數(shù)據(jù)可支持客戶端的讀操作阿宅。
EditLog在概念上是單個(gè)實(shí)體候衍,但它體現(xiàn)為磁盤上的多個(gè)文件,
FsImage
每個(gè)fsImage文件都是文件元數(shù)據(jù)的一個(gè)完整的永久性檢查點(diǎn)洒放。包含了文件系統(tǒng)中的所有目錄信息(修改時(shí)間蛉鹿、訪問許可和配額元數(shù)據(jù))和文件信息(復(fù)本數(shù)、修改時(shí)間往湿、訪問時(shí)間妖异、訪問許可、塊大小煌茴、組成一個(gè)文件的塊等)的序列化數(shù)據(jù)。數(shù)據(jù)塊存儲(chǔ)在datanode日川,但fsimage并不描述datanode蔓腐,取而代之的是namenode將這種塊和datanode的映射關(guān)系存儲(chǔ)在內(nèi)存中。當(dāng)datanode加入集群時(shí)龄句,namenode向datanode索取塊列表以建立塊映射關(guān)系回论;namenode還將定時(shí)根據(jù)datanode上報(bào)的信息更新塊映射。
fsImage默認(rèn)存儲(chǔ)在
file://${hadoop.tmp.dir}/dfs/name
下分歇,可通過修改dfs.namenode.name.dir
或者hadoop.tmp.dir
的值來更換存儲(chǔ)位置
并非每個(gè)寫操作都會(huì)更新該文件傀蓉,因?yàn)閒simage是一個(gè)大型文件,如果頻繁執(zhí)行寫操作职抡,會(huì)使系統(tǒng)運(yùn)行緩慢葬燎。但這不影響系統(tǒng)的恢復(fù)能力,當(dāng)namenode啟動(dòng)或者發(fā)生故障重啟時(shí)缚甩,最近的fsimage文件會(huì)被load進(jìn)內(nèi)存作為構(gòu)建元數(shù)據(jù)的最近狀態(tài)谱净,然后再從相關(guān)點(diǎn)開始向前執(zhí)行EditLog中的每個(gè)事務(wù)。
為了減少啟動(dòng)時(shí)恢復(fù)的EditLog事務(wù)的時(shí)間擅威,HDFS會(huì)在輔助namenode或者備用namenode上執(zhí)行fsimage和EditLog的合并壕探,創(chuàng)建元數(shù)據(jù)檢查點(diǎn)。創(chuàng)建檢查點(diǎn)的步驟如下:
- 輔助namenode請(qǐng)求主namenode停止使用正在驚醒的EditLog文件郊丛,這樣新的編輯日志操作記錄到一個(gè)新文件中李请。
- 輔助namenode從主namenode獲取最近的fsimage和edits文件(采用HTTP GET)
- 輔助namenode將fsimage文件載入內(nèi)存,逐一執(zhí)行edits文件中的事務(wù)厉熟,創(chuàng)建新的合并后的fsimage文件导盅。
- 輔助namenode將新的fsimage文件發(fā)送回主namenode(使用HTTP PUT),主namenode將其保存為臨時(shí)的.ckpt文件
- 主namenode重新命名臨時(shí)的fsimage文件揍瑟,便于日后使用
最終认轨,主namenode擁有最新的fsimage和一個(gè)更小的正在進(jìn)行中的editLog文件窟勃。上面的過程也解釋了為何輔助namenode需要和主namenode相近的內(nèi)存需求空間(輔助namenode也需要將fsimage載入內(nèi)存)袱院。
創(chuàng)建檢查點(diǎn)的觸發(fā)條件收兩個(gè)參數(shù)的控制蔑匣。
dfs.namenode.checkpoint.period
(單位為秒)來控制時(shí)間間隔掸掸,dfs.namenode.checkpoint.txns
控制從上一個(gè)檢查點(diǎn)開始編輯日志的事務(wù)個(gè)數(shù)(檢查頻率通過dfs.namenode.check.period
來控制)。
在安全模式下也可手動(dòng)執(zhí)行
hadoop dfsadmin -saveNamespace
來執(zhí)行檢查點(diǎn)的創(chuàng)建纪蜒。
4 復(fù)本
HDFS將文件的數(shù)據(jù)塊衷恭,在不同機(jī)器上存儲(chǔ)多份(復(fù)本)以達(dá)到容錯(cuò)。每個(gè)文件塊的復(fù)本個(gè)數(shù)可以通過dfs.replication
來配置纯续,默認(rèn)為3随珠。namenode根據(jù)內(nèi)存中的塊的映射關(guān)系,來決定復(fù)本存放的位置猬错。
選擇策略:
- 在運(yùn)行客戶端的datanode上房第一個(gè)復(fù)本(如果客戶端運(yùn)行在集群之外窗看,就隨機(jī)選擇一個(gè)節(jié)點(diǎn),但會(huì)避免存儲(chǔ)太慢或者太忙的節(jié)點(diǎn))
- 第2個(gè)復(fù)本放在與第一個(gè)不同且隨機(jī)另外選擇的機(jī)架中節(jié)點(diǎn)上
- 第3個(gè)復(fù)本放在與第二個(gè)復(fù)本相同的機(jī)架上倦炒,且隨機(jī)選擇另一個(gè)節(jié)點(diǎn)
- 其他復(fù)本放在集群中隨機(jī)選擇的節(jié)點(diǎn)上显沈,不過系統(tǒng)會(huì)盡量避免在同一個(gè)機(jī)架上房太多的復(fù)本(最大值為(復(fù)本數(shù) - 1 )/機(jī)架數(shù) + 2)
一旦選擇復(fù)本位置,就根據(jù)網(wǎng)絡(luò)拓?fù)鋭?chuàng)建一個(gè)管線逢唤。如果復(fù)本數(shù)為3拉讯,則有如下的管線
5 安全模式
namenode啟動(dòng)時(shí),首先將fsimage文件載入內(nèi)存鳖藕,并執(zhí)行編輯日志的各項(xiàng)編輯操作魔慷。一旦在內(nèi)存中成功建立文件系統(tǒng)的元數(shù)據(jù)的映像,則創(chuàng)建一個(gè)新的fsimage文件和一個(gè)空白的EditLog文件著恩。這個(gè)過程中院尔,namenode運(yùn)行在安全模式,意味著namenode文件系統(tǒng)對(duì)于客戶端是只讀的喉誊。
在安全模式下召边,各個(gè)datanode會(huì)向namenode發(fā)送最新的塊列表信息,當(dāng)滿足“最小復(fù)本條件”裹驰,namenode會(huì)在30秒后退出安全模式隧熙。“最小復(fù)本條件”是指整個(gè)文件系統(tǒng)中有99.9%的塊滿足最小復(fù)本數(shù)幻林,在啟動(dòng)一個(gè)剛剛格式化的HDFS集群是贞盯,那namenode不會(huì)進(jìn)入安全模式。
- 通過
hdfs dfsadmin -safemode get
來查看是否處于安全模式- 通過
hdfs dfsadmin -safemode enter
進(jìn)入安全模式- 通過hdfs dfsadmin -safemode leave離開安全模式
安全模式的相關(guān)配置如下: