Hadoop 作為大數據的主要支撐技術之一,被廣泛使用。那何為hadoop了?
節選維基上的解釋如下(其基本和官方定義差不多),
Apache Hadoop是一款支持數據密集型
分布式應用程序並以Apache 2.0許可協議發布的
開源
軟件框架。它支持在商品硬件構建的大型集群上運行的應用程序。Hadoop是根據
谷歌公司發表的
MapReduce和
Google文件系統的論文自行實現而成。所有的Hadoop模塊都有一個基本假設,即硬件故障是常見情況,應該由框架自動處理。
上文提及Hadoop主要是兩個部分:MapReduce和Google文件系統,這里暫時不提MapReduce,重點談文件系統,Hadoop有一個抽象的文件系統概念,使用最多的是HDFS,其他文件系統如Local、ftp、swift等均支持。所有支持的文件系統均在org.apache.hadoop.fs.FileSystem。普通的介紹Hadoop安裝中,定義fs.defaultFS時,設置:hdfs://localhost 這里的hfds 就是表明使用的就是HDFS文件系統。具體內容可以參見:權威指南3.4 節。由於實際中,使用HDFS的最多,所以后續我們重點討論的均為HDFS.
HDFS文件系統特點(舊的文檔中也稱之為DFS)
HDFS以流式數據訪問模式來存儲超大文件、運行於商用硬件集群上。
- 超大文件:指具有幾百MB、幾百GB大小的文件。
- 流式數據訪問:一次寫入、多次讀取的模式。
- 商用硬件:HDFS認為銀獎是不可靠的。
- 低時間延遲的數據訪問:HDFS 是為高數據吞吐量應用優化,因此實時低延遲不適用於HDFS
- 大量的小文件:其可以存儲大量的小文件(上百萬,數十億還是不行的)。
- 多用戶寫入、任意修改文件
HDFS 常規概念
【數據塊】
HDFS使用塊的概念來作為獨立的存儲單元,其默認大小為128MB(Hadoop 2.x以后),HDFS上的文件也被划分為塊大小的多個分塊,但與磁盤的塊不同的是,如果HDFS中小於一個塊大小的文件不會占據整個塊的空間,而只占據實際的磁盤空間。
% hdfs fsck / -files -blocks 查看文件系統塊的信息
【namenode 和datanode】
Hdfs集群主要分為2類節點,一類是namenode節點,一類是datanode節點。
NameNode 管理文件系統的命名空間,它維護着文件系統樹及整顆樹內所有的文件和目錄。這些信息以兩個文件形式永久保存在本地磁盤上:命名空間鏡像文件和編輯日志文件。
Namenode記錄了每個文件中各個塊所在的數據節點信息,但它並不保存塊的位置信息,因為這些信息會在系統啟動時根據數據節點信息重建。(注意:保存的只有數據節點信息,主要是指持久化保存,不保存具體塊的信息,只是說沒有持久化保存而已,並不是不保存)。
DataNode:存儲並檢索數據塊,並定期向namenode發送他們所存儲的塊的列表。
【Secondary NameNode節點】
從上面的Namenode和datanode節點的關系,可以很容易地發現namenode節點存在單點故障的問題。Secondary namenode節點的作用是定期將namespace鏡像與操作日志文件合並,以防止操作日志文件變得過大。(注意:Secondary Namenode節點不是NameNode節點的備份節點,其主要的功能是確保數據不丟失,而不是HA,在基礎知識二中將詳細描述2者的區別)
Secondary NameNode不同於NameNode,它不接受或者記錄任何實時的數據變化,但是,它會與NameNode進行通信,以便定期地保存HDFS元數據的 快照。由於NameNode是單點的,通過Secondary NameNode的快照功能,可以將NameNode的宕機時間和數據損失降低到最小。同時,如果NameNode發生問題,Secondary NameNode可以及時地作為備用NameNode使用。
【塊緩存】
通常datanode 從磁盤中讀取塊,但對於訪問頻繁的文件,其對應的塊可能被顯示的緩存在datanode的內存中。
【HDFS的高可用】
關於HDFS的高可用,本質很復雜。這里只是簡單介紹一下。首先,在hadoop2中,配置了一對活動-備用的namenode。當活動NameNode失效,備用NameNode就會接管它的任務,並開始服務於來自客戶端的請求,不會有明顯的中斷。但要滿足這個架構,根據權威指南描述要滿足以下幾點:
- namenode節點間通過NFS或者QJM實現共享存儲
- datanode向2個namenode節點發送數據塊報告
- 輔助namenode的角色被備用namenode所包含。
【故障切換與規避】
HDFS目前使用zookeeper來確保僅有一個活動namenode
HDFS 接口
- Java 接口: Hadoop接口是用java 寫的,通過java api可以調用大部分hadoop文件系統的交互操作。
- Http: 有WebHDFS協議提供的HTTP REST API 提供給了其他語言的方式與HDFS進行交互
采用這種方式又有兩種模式,一種是直接訪問,一種是通過代理訪問。
直接訪問模式,主要是訪問namenode和datanode內嵌的web服務器作為WebHDFS的端節點運行(由於dfs.webhdfs.enabled被設置為true,WebHDFS默認是啟用狀態)。
代理模式訪問,代理模式主要是依靠一個或者多個獨立代理服務器通過HTTP訪問HDFS,由於代理服務是無狀態的,因此可以運行在負載均衡服務器之后,也可以使用更嚴格的防火牆策略和帶寬策略,更方便不同數據中心hadoop集群。其中HttpFS代理提供和WebHDFS相同的HTTP接口,使用httpfs.sh腳本,默認在端口14000端口啟動代理。
