Hadoop
Apache™Hadoop®項目是為可靠的、可擴展的分布式計算而開發的一套開源軟件。
Hadoop軟件庫是一個框架,該框架允許使用簡單的編程模型跨計算機集群對大規模數據集進行分布式處理。
Hadoop旨在從單個服務器擴展到數千台機器,每台機器都提供本地計算和存儲。
Hadoop框架本身的設計會在應用層去檢測和處理各種故障,而不依賴於硬件層面的高可用,因此可以在計算機集群之上提供高可用服務,集群中的任何單個節點是容易出現故障的。
Hadoop項目包括以下模塊:
Hadoop Common: 支持其他Hadoop模塊的通用的公用程序。
Hadoop Distributed File System (HDFS™): 提供對應用程序數據的高吞吐量訪問的分布式文件(管理)系統。
Hadoop YARN: 作業調度和群集資源管理的框架。
Hadoop MapReduce: 一個基於YARN的分布式系統,用於並行處理大規模數據集。
Hadoop Ozone: Hadoop的對象存儲。
Apache的其他與Hadoop相關的項目包括:
HBase™: 可擴展的分布式NoSQL列存儲數據庫,支持大型表的結構化數據存儲。
Hive™: 提供數據匯總和即席查詢的數據倉庫基礎設施。
Cassandra™: 可擴展的多主數據庫,沒有單點故障。
Spark™: 用於Hadoop數據的快速通用計算引擎。Spark提供了一種簡單而富有表現力的編程模型,該模型支持廣泛的應用程序,包括ETL,機器學習,流處理和圖計算。
ZooKeeper™: 面向分布式應用程序的高性能協調服務。
Hadoop源碼結構圖
HDFS概述
HDFS產生背景
隨着數據量越來越大,在一個操作系統管轄的范圍內存不下了,那么就需要將數據分配到更多的操作系統管理的磁盤中,但是不方便管理和維護,迫切需要一種系統來管理多台機器上的數據文件,這就是分布式文件(管理)系統。HDFS只是分布式文件管理系統中的一個,其他有FastDFS等。
HDFS概念
首先,HDFS是一個文件系統,用於存儲文件,通過目錄樹來定位文件;
其次,HDFS是分布式的,由多台服務器聯合起來實現其功能,集群中服務器有各自的角色。
最后,HDFS的設計適合“一次寫入,多次讀取”的場景,支持追加,但不支持修改。適合用來做數據分析。
HDFS優缺點
優點
1)高容錯性
(1)數據自動保存多個副本。它通過增加副本的形式,提高容錯性;
(2)某一個副本丟失以后,它可以自動恢復。
2)適合大數據處理
(1)數據規模:能夠處理數據規模達到GB、TB、甚至PB級別的數據;
(2)文件規模:能夠處理百萬規模以上的文件數量,數量相當之大。
3)流式數據訪問,它能保證數據的一致性。
4)可構建在廉價機器上,通過多副本機制,提高可靠性。
缺點
1)不適合低延時數據訪問,比如毫秒級的存儲數據,是做不到的。
2)無法高效的對大量小文件進行存儲。
(1)存儲大量小文件的話,它會占用NameNode大量的內存來存儲文件、目錄和塊信息。這樣是不可取的,因為NameNode的內存總是有限的;
(2)小文件存儲的尋址時間會超過讀取時間,它違反了HDFS的設計目標。
3)不支持並發寫入、文件隨機修改。
(1)一個文件只能有一個寫,不允許多個線程同時寫;多份小文件然后merge。
(2)僅支持數據append(追加),不支持文件的隨機修改。
HDFS總體架構
HDFS 采用Master/Slave的架構來存儲數據,這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。一個HDFS集群是由一個NameNode和一定數目的DataNode組成的。
NameNode是一個中心服務器,負責管理文件系統的名字空間 (Namespace )及客戶端對文件的訪問。
集群中的DataNode一般是一個節點運行一個DataNode進程,負責管理它所在節點上的存儲。
HDFS架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。{Client(代表用戶)通過與 NameNode和DataNode 交互訪問HDFS中的文件。Client 提供了一個類似 POSIX 的文件系統接口供用戶調用。在Hadoop生態各組件里,分別有其對應的Client。比如,在HDFS里,是HDFS Client。同理,在Mapreduce里,是Mapreduce Client。}
1)Client:客戶端。
(1)負責文件切分。文件上傳HDFS的時候,Client將文件切分成一個個的Block(128Mb),然后進行存儲;
(2)與NameNode交互,獲取文件的位置信息;
(3)與DataNode交互,讀取或者寫入數據;
(4)Client提供一些命令來管理HDFS,比如啟動或者關閉HDFS;
(5)Client可以通過一些命令來訪問HDFS;
2)NameNode:就是Master,它是一個管理者。
(1)管理HDFS的名字空間-NameSpace;
(2)管理數據塊(Block)映射信息;
(3)配置副本策略;
(4)處理客戶端讀寫請求。
3) DataNode:就是Slave。NameNode下達命令,DataNode執行實際的操作。
(1)存儲實際的數據塊;
(2)執行數據塊的讀/寫操作。
4) Secondary NameNode:不是NameNode的熱備。當NameNode掛掉時,它並不能馬上替換NameNode並提供服務。而且NameNode和Secondary NameNode是一台機器上,機器掛了就全都掛了。
(1)輔助NameNode,分擔其工作量;
(2)定期合並鏡像-Fsimage和編輯日志-Edits,並推送給NameNode;
(3)在緊急情況下,可輔助恢復NameNode。
HDFS文件塊大小
HDFS中的文件在物理上是分塊存儲(block),塊的大小可以通過配置參數(dfs.blocksize)來設置,默認大小在hadoop2.x版本中是128M。HDFS的block比磁盤的block大,其目的是為了最小化尋址開銷。如果block設置得足夠大,從磁盤傳輸數據的時間會明顯大於定位這個block開始位置所需的時間。因而,傳輸一個由多個block組成的文件的時間取決於磁盤傳輸速率。如果尋址時間約為10ms,而傳輸速率為100MB/s,為了使尋址時間僅占傳輸時間的1%,我們要將塊大小設置約為100MB (10ms*100*100M/s=10ms/0.01*100M/s)。HDFS默認的block大小128MB。
HFDS的Shell操作
基本語法
$ bin/hadoop fs orders
$ hadoop fs可以用於其他文件系統,不止是hdfs文件系統內,使用范圍更廣。
$ hadoop dfs專門針對hdfs分布式文件系統。
hdfs dfs和hadoop dfs命令作用相同,相比於上面的命令更為推薦,並且當使用hadoop dfs時內部會被轉為hdfs dfs命令。
……………………………………………….
HDFS的數據流
HDFS寫數據流程(文件寫入)
1)Client通過Distributed FileSystem模塊向NameNode請求上傳文件,NameNode檢查目標文件是否已存在,父目錄是否存在。
2)NameNode返回是否可以上傳。
3)Client請求第一個 block上傳到哪幾個DataNode服務器上。
4)NameNode返回3個DataNode節點,分別為dn1、dn2、dn3。
5)Client通過FSDataOutputStream模塊請求dn1上傳數據,dn1收到請求會繼續調用dn2,然后dn2調用dn3,將整個通信管道建立完成。
6)dn1、dn2、dn3逐級應答Client。
7)Client開始往dn1上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet為單位,dn1收到一個packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答隊列等待應答。
8)當一個block傳輸完成之后,Client再次請求NameNode上傳第二個block的服務器。(重復執行3-7步)。
Hadoop副本節點選擇
第一個副本在Client所處的節點上。如果Client在集群外,隨機選一個。
第二個副本和第一個副本位於相同機架,隨機節點。
第三個副本位於不同機架,隨機節點。
HDFS讀數據流程
1)Client通過Distributed FileSystem模塊向NameNode請求下載文件,NameNode通過查詢元數據,找到文件塊所在的DataNode地址。
2)挑選一台DataNode(就近原則,然后隨機)服務器,請求讀取數據。
3)DataNode開始傳輸數據給Client(從磁盤里面讀取數據輸入流,以packet為單位來做校驗)。
4)Client以packet為單位接收,先在本地緩存,然后寫入目標文件。
NameNode和SecondaryNameNode
NameNode和SecondaryNameNode工作機制
1)第一階段:NameNode啟動
(1)第一次啟動NameNode格式化后,創建鏡像文件-fsimage和編輯日志-edits文件。如果不是第一次啟動,直接加載編輯日志和鏡像文件到內存。
(2)Client對元數據進行增刪改的請求。
(3)NameNode記錄操作日志,滾動更新日志。
(4)NameNode在內存中對數據進行增刪改查。
2)第二階段:Secondary NameNode工作
(1)Secondary NameNode詢問NameNode是否需要checkpoint。直接返回NameNode是否checkpoint的結果。
(2)Secondary NameNode請求執行checkpoint。
(3)NameNode滾動正在寫的edits日志。
(4)將滾動前的編輯日志和鏡像文件拷貝到Secondary NameNode。
(5)Secondary NameNode加載編輯日志和鏡像文件到內存,並合並。
(6)生成新的鏡像文件fsimage.chkpoint。
(7)拷貝fsimage.chkpoint到NameNode。
(8)NameNode將fsimage.chkpoint重新命名成fsimage。
Fsimage和Edits解析
1)概念
namenode被格式化之后,將在/.../data/tmp/dfs/name/current目錄中產生如下文件
edits_0000000000000000000
edits_inprogress_909090909090
fsimage_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid(343706233-edits_inprogress_)
VERSION
(1)Fsimage文件:HDFS文件系統元數據的一個永久性的檢查點,其中包含HDFS文件系統的所有目錄和文件idnode的序列化信息。
(2)Edits文件:存放HDFS文件系統的所有更新操作的路徑,文件系統客戶端執行的所有寫操作首先會被記錄到edits文件中。
(3)seen_txid文件保存的是一個數字,就是最后一個edits_的數字
(4)每次NameNode啟動的時候都會將fsimage文件讀入內存,並從00001開始到seen_txid中記錄的數字依次執行每個edits里面的更新操作,保證內存中的元數據信息是最新的、同步的,可以看成NameNode啟動的時候就將fsimage和edits文件進行了合並。
2)oiv查看fsimage文件
(1)查看oiv和oev命令
offline fsimage viewer
offline edits viewer
$ hdfs
oiv apply the offline fsimage viewer to an fsimage
oev apply the offline edits viewer to an edits file
(2)基本語法
hdfs oiv -p 文件類型 -i鏡像文件 -o 轉換后文件輸出路徑
$ hdfs oiv
Usage: bin/hdfs oiv [OPTIONS] -i INPUTFILE -o OUTPUTFILE
Offline Image Viewer
View a Hadoop fsimage INPUTFILE using the specified PROCESSOR,
saving the results in OUTPUTFILE.
3)oev查看edits文件
(1)基本語法
hdfs oev -p 文件類型 -i編輯日志 -o 轉換后文件輸出路徑
$ hdfs oev
Usage: bin/hdfs oev [OPTIONS] -i INPUT_FILE -o OUTPUT_FILE
Offline edits viewer
Parse a Hadoop edits log file INPUT_FILE and save results
in OUTPUT_FILE.
checkpoint時間設置
(1)通常情況下,SecondaryNameNode每隔一小時執行一次:3600秒。
[hdfs-default.xml]
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
(2)一分鍾檢查一次操作次數,當操作次數達到1百萬時,SecondaryNameNode執行一次。
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>操作動作次數</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60</value>
<description> 1分鍾檢查一次操作次數</description>
</property>
NameNode故障處理
NameNode故障后,可以采用如下兩種方法恢復數據。
方法一:將SecondaryNameNode中數據拷貝到NameNode存儲數據的目錄;
1)kill -9 namenode進程
2)刪除NameNode存儲的數據(/.../data/tmp/dfs/name)
$ rm -rf /.../data/tmp/dfs/name/*
3)拷貝SecondaryNameNode中數據到原NameNode存儲數據目錄
$ scp -r hdfs@hadoop1:/.../data/tmp/dfs/namesecondary/* ./name/
4)重新啟動namenode
$ sbin/hadoop-daemon.sh start namenode
方法二:使用-importCheckpoint選項啟動NameNode守護進程,從而將SecondaryNameNode中數據拷貝到NameNode目錄中。
1)修改hdfs-site.xml中的
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>120</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/.../data/tmp/dfs/name</value>
</property>
2)kill -9 namenode進程
3)刪除NameNode存儲的數據(/.../data/tmp/dfs/name)
$ rm -rf /.../data/tmp/dfs/name/*
4)如果SecondaryNameNode不和NameNode在一個主機節點上,需要將SecondaryNameNode存儲數據的目錄拷貝到NameNode存儲數據的平級目錄,並刪除in_use.lock文件。
$ scp -r hdfs@hadoop1:/.../data/tmp/dfs/namesecondary ./
$ rm -rf in_use.lock
$ pwd
/.../data/tmp/dfs
$ ls
data name namesecondary
5)導入檢查點數據(等待一會ctrl+c結束掉)
$ bin/hdfs namenode -importCheckpoint
6)啟動namenode
$ sbin/hadoop-daemon.sh start namenode
集群安全模式
1)概述
NameNode啟動時,首先將鏡像文件(fsimage)載入內存,並執行編輯日志(edits)中的各項操作。一旦在內存中成功建立文件系統元數據鏡像,則創建一個新的fsimage文件和一個空的編輯日志。此時,NameNode開始監聽DataNode請求。
但是此刻,NameNode運行在安全模式,即NameNode的文件系統對於客戶端來說是只讀的。系統中的數據塊的位置並不是由NameNode維護的,而是以塊列表的形式存儲在DataNode中。
在系統的正常操作期間,NameNode會在內存中保留所有塊位置的映射信息。
在安全模式下,各個DataNode會向NameNode發送最新的塊列表信息,NameNode了解到足夠多的塊位置信息之后,即可高效運行文件系統。如果滿足“最小副本條件”,NameNode會在30秒鍾之后就退出安全模式。所謂的最小副本條件指的是在整個文件系統中99.9%的塊滿足最小副本級別(默認值:dfs.replication.min=1)。在啟動一個剛剛格式化的HDFS集群時,因為系統中還沒有任何塊,所以NameNode不會進入安全模式。
2)基本語法
集群處於安全模式,不能執行重要操作(寫操作)。集群啟動完成后,自動退出安全模式。
(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式狀態)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:進入安全模式狀態)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:離開安全模式狀態)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式狀態)
3)案例
模擬等待安全模式
(1)先進入安全模式
$ bin/hdfs dfsadmin -safemode enter
(2)執行下面的腳本
編輯一個腳本
#!/bin/bash
bin/hdfs dfsadmin -safemode wait
bin/hdfs dfs -put ~/hello.txt /root/hello.txt
(3)再打開一個窗口,執行
$ bin/hdfs dfsadmin -safemode leave
NameNode多目錄配置
1)NameNode的本地目錄可以配置成多個,且每個目錄存放內容相同,增加了可靠性。
2)具體配置如下:
(1)在hdfs-site.xml文件中增加如下內容
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
</property>
(2)停止集群,刪除data和logs中所有數據。
$ rm -rf data/ logs/
$ rm -rf data/ logs/
$ rm -rf data/ logs/
(3)格式化集群並啟動。
$ bin/hdfs namenode –format
$ sbin/start-dfs.sh
(4)查看結果
$ ll
DataNode
DataNode工作機制
1)一個數據塊在DataNode上以文件形式存儲在磁盤上,包括兩個文件,一個是數據本身,一個是元數據包括數據塊的長度,塊數據的校驗和,以及時間戳。
2)DataNode啟動后,向NameNode注冊,通過后,周期性(1小時)的向NameNode上報所有的塊信息。
3)心跳是每3秒一次,心跳返回結果帶有NameNode給該DataNode的命令如復制塊數據到另一台機器,或刪除某個數據塊。如果超過10分鍾沒有收到某個DataNode的心跳,則認為該節點不可用。
4)集群運行中可以安全加入和退出一些機器。
數據完整性
1)當DataNode讀取block的時候,它會計算checksum。
2)如果計算后的checksum,與block創建時值不一樣,說明block已經損壞。
3)Client讀取其他DataNode上的block。
4)datanode在其文件創建后周期驗證checksum。
掉線時限參數設置
DataNode進程死亡或者網絡故障造成DataNode無法與NameNode通信,NameNode不會立即把該節點判定為死亡,要經過一段時間,這段時間暫稱作超時時長。HDFS默認的超時時長為10分鍾+30秒。
如果定義超時時間為timeout,則超時時長的計算公式為:
timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。
而默認的dfs.namenode.heartbeat.recheck-interval 大小為5分鍾,dfs.heartbeat.interval默認為3秒。
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的單位為毫秒,dfs.heartbeat.interval的單位為秒。
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
<property>
<name> dfs.heartbeat.interval </name>
<value>3</value>
</property>
其他、快照管理
快照相當於對目錄做一個備份。
並不會立即復制所有文件,而是指向同一個文件。
當寫入發生時,才會產生新文件。
基本語法
(1)hdfs dfsadmin -allowSnapshot 路徑 (功能描述:開啟指定目錄的快照功能)
(2)hdfs dfsadmin -disallowSnapshot 路徑 (功能描述:禁用指定目錄的快照功能,默認是禁用)
(3)hdfs dfs -createSnapshot 路徑 (功能描述:對目錄創建快照)
(4)hdfs dfs -createSnapshot 路徑 名稱 (功能描述:指定名稱創建快照)
(5)hdfs dfs -renameSnapshot 路徑 舊名稱 新名稱 (功能描述:重命名快照)
(6)hdfs lsSnapshottableDir (功能描述:列出當前用戶所有可快照目錄)
(7)hdfs snapshotDiff 路徑1 路徑2 (功能描述:比較兩個快照目錄的不同之處)
(8)hdfs dfs -deleteSnapshot (功能描述:刪除快照)
其他、回收站
1)默認回收站
默認值fs.trash.interval=0,0表示禁用回收站,可以設置刪除文件的存活時間。
默認值fs.trash.checkpoint.interval=0,檢查回收站的間隔時間。如果該值為0,則該值設置和fs.trash.interval的參數值相等。
要求fs.trash.checkpoint.interval<=fs.trash.interval。
2)啟用回收站
修改core-site.xml,配置垃圾回收時間為1分鍾。
<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
3)查看回收站
回收站在集群中的;路徑:/user/hdfs/.Trash/….
4)修改訪問垃圾回收站用戶名稱
進入垃圾回收站用戶名稱,默認是dr.who,修改為hdfs用戶
[core-site.xml]
<property>
<name>hadoop.http.staticuser.user</name>
<value>hdfs</value>
</property>
5)通過程序刪除的文件不會經過回收站,需要調用moveToTrash()才進入回收站
Trash trash = New Trash(conf);
trash.moveToTrash(path);
6)恢復回收站數據
$ hadoop fs -mv /user/hdfs/.Trash/Current/user/hdfs/input /user/hdfs/input
7)清空回收站
$ hadoop fs -expunge
HDFS HA高可用
HA概述
1)所謂HA(high available),即高可用(7*24小時不中斷服務)。
2)實現高可用最關鍵的策略是消除單點故障。HA嚴格來說應該分成各個組件的HA機制:HDFS的HA和YARN的HA。
3)Hadoop2.0之前,在HDFS集群中NameNode存在單點故障(SPOF)。
4)NameNode主要在以下兩個方面影響HDFS集群
NameNode機器發生意外,如宕機,集群將無法使用,直到管理員重啟。
NameNode機器需要升級,包括軟件、硬件升級,此時集群也將無法使用。
HDFS HA功能通過配置Active/Standby兩個nameNodes實現在集群中對NameNode的熱備來解決上述問題。
如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將NameNode很快的切換到另外一台機器。
HDFS-HA工作機制
通過雙NameNode消除單點故障
HDFS-HA工作要點
1)元數據管理方式需要改變:
內存中各自保存一份元數據;
Edits日志只有Active狀態的NameNode節點可以做寫操作;
兩個NameNode都可以讀取edits;
共享的edits放在一個共享存儲中管理(qjournal和NFS兩個主流實現)。
2)需要一個狀態管理功能模塊
實現了一個zkfailover,常駐在每一個NameNode所在的節點,每一個zkfailover負責監控自己所在NameNode節點,利用zk進行狀態標識,當需要進行狀態切換時,由zkfailover來負責切換,切換時需要防止brain split現象的發生。
3)必須保證兩個NameNode之間能夠ssh無密碼登錄。
4)隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務
HDFS-HA自動故障轉移工作機制
使用命令hdfs haadmin -failover手動進行故障轉移,在該模式下,即使Active狀態的NameNode已經失效,系統也不會自動從Active狀態的NameNode轉移到Standby狀態的NameNode,下面通過配置部署HA自動進行故障轉移。
自動故障轉移為HDFS部署增加了兩個新組件:
ZooKeeper和ZKFailoverController(ZKFC)進程。
ZooKeeper是維護少量協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務。
HA的自動故障轉移依賴於ZooKeeper的以下功能:
1)故障檢測:
集群中的每個NameNode在ZooKeeper中維護了一個持久會話,如果機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另一個NameNode需要觸發故障轉移。
2)Active NameNode選擇:
ZooKeeper提供了一個簡單的機制用於唯一的選擇一個節點為Active狀態。如果目前Active的NameNode崩潰,另一個節點可能從ZooKeeper獲得特殊的排它鎖以表明它應該成為Active的NameNode。
ZKFC是自動故障轉移中的另一個新組件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。
每個運行NameNode的主機也運行了一個ZKFC進程,ZKFC負責:
1)健康監測:
ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時地回復健康狀態,ZKFC認為該節點是健康的。ZKFC相當於NameNode的監視器。
如果該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點為非健康的。
2)ZooKeeper會話管理:
當本地NameNode是健康的,ZKFC保持一個在ZooKeeper中打開的會話。
如果本地NameNode處於Active狀態,ZKFC也保持一個特殊的znode鎖,該鎖使用了ZooKeeper對臨時節點的支持,如果會話終止,鎖節點將自動刪除。
3)Active 選舉:
如果本地NameNode是健康的,且ZKFC發現沒有其它的節點當前持有znode鎖,它將為自己獲取該鎖。如果成功,則它已經贏得了選擇,並負責運行故障轉移進程以使它的本地NameNode為Active。
1. 一台NameNode假死了
2. 假死NameNode所在機器的zkfc檢測到假死
3. 通知另外一台NameNode的zkfc
4. 另外一台zkfc就會強行ssh kill -9殺死假死的NameNode
5. 如果ssh失敗則調用用戶自定義腳本程序,比如poweroff直接關機或者重啟服務器
6. 正常NameNode的zkfc獲取命令運行結果
7. 激活本台NameNode 切換為Active
HDFS 聯邦架構設計
1)NameNode架構的局限性
(1)Namespace(命名空間)的限制
由於NameNode在內存中存儲所有的元數據(metadata),因此單個NameNode所能存儲的對象(文件+塊)數目受到NameNode所在JVM的heap size的限制。
50G的heap能夠存儲20億(200million)個對象,這20億個對象支持4000個datanode,12PB的存儲(假設文件平均大小為40MB)。隨着數據的飛速增長,存儲的需求也隨之增長。
單個datanode從4T增長到36T,集群的尺寸增長到8000個datanode。
存儲的需求從12PB增長到大於100PB。
(2)隔離問題
由於HDFS僅有一個NameNode,無法隔離各個程序,因此HDFS上的一個實驗程序就很有可能影響整個HDFS上運行的程序。
(3)性能的瓶頸
由於是單個NameNode的HDFS架構,因此整個HDFS文件系統的吞吐量受限於單個NameNode的吞吐量。
2)HDFS Federation架構設計
能不能有多個NameNode,分別負責不同的業務數據?
3)HDFS 聯邦應用思考
不同應用可以使用不同NameNode進行數據管理;
圖片業務、爬蟲業務、日志審計業務;
Hadoop生態系統中,不同的框架使用不同的NameNode進行管理NameSpace。