Hadoop入門知識
Hadoop構成
Hadoop由4個主要構成部分:
1) 基礎核心:提供基礎的通用的功能
2) HDFS:分佈式存儲
3) MapReduce:分佈式計算
4) YARN:資源分配(多個任務是排隊執行還是同時執行)
HDFS構成
HDFS由3種主要的節點構成:
1) NameNode 用來存儲數據的存放位置等元數據(不存放數據)
2) DataNode 只用來存儲數據
3) SecondaryNameNode
輔助NameNode運行,將NameNode產生的元數據持久化到磁盤上
注意:生產環境中一臺計算機通常只擔任一種角色。測試環境中一臺計算機可以擔任多種角色;如僞分佈模式中擔任全部角色,測試集羣中也常見NameNode和Secondary NameNode在同一臺計算機上。
NameNode
進程
對應於NameNode進程(通過jps命令可以查看java進程)。
功能
1) 存儲數據的分佈位置、數據的各種描述信息(如文件名、文件大小、文件所在目錄、所有者名稱、讀寫執行權限等)
2) 讀數據時,要先從NameNode獲取文件的分佈位置(在哪些DataNode上),然後再從DataNode上讀數據(當然,這個過程已經由HDFS的Shell或API實現了)
3) 寫數據時,先向NameNode提交要寫的文件的信息,NameNode檢查自己的記錄表,以找到合適的DataNode(需要找多個,因爲每個文件還要創建副本)來存儲這些數據,然後指揮這些DataNode串成一串接收數據。如果某個DataNode在接收數據時罷工,則忽略掉它(忽略之後造成的副本數少於指定數量會在後期補加副本);如果所有選出的DataNode全掛掉(機率很低),則寫入失敗。
4) 需要時,可以調用NameNode列出HDFS中的文件夾及文件(如執行 hdfs dfs -ls / 命令時)。
元數據存儲位置
具體存儲位置由配置文件指定,即hdfs-site.xml中的 dfs.namenode.name.dir 指定
這個位置可以用,列表指定多個位置進行擴容
dfs.namenode.name.dir的默認值是file://${hadoop.tmp.dir}/dfs/name
${hadoop.tmp.dir}的默認值是 /tmp/hadoop-${user.name}
${user.name}是安裝Hadoop的用戶名
這些默認值在Hadoop官方網站的文檔中有詳細說明
配置時,爲了簡單,通常會在core-site.xml中修改 ${hadoop.tmp.dir},因爲這個值在各個具體配置文件中被多次引用!
通過Hadoop的瀏覽站點也能找到NameNode元數據的存儲位置,在Overview頁上
持久化的元數據
進入NameNode存放元數據的目錄,可以看到如下文件:
NameNode的元數據運行時是加載在內存中的(因爲這些數據需要快速查詢),當NameNode關閉時,內存中的元數據又會持久化到硬盤上(上圖中的fsimage文件)。在不考慮HDFS的寫操作時,元數據只在內存和硬盤之間交換。
內存元數據 《——》 fsimage
但HDFS集羣是要寫數據的,這時就會導致內存中的元數據和硬盤上的fsimage文件不同。內存是易失的,如意外斷電或死機都會導致內存中的數據丟失,爲了保證所有的數據變化都能記錄下來,HDFS會將所有的操作都記錄到edits文件中。這樣在寫數據時就會形成以下關係:
內存元數據 == fsimage + edits
SecondaryNameNode
進程
對應於SecondaryNameNode進程
功能
生產環境中NameNode會長時間運行,幾乎不關閉。而內存中的元數據是在NameNode關閉時進行持久化的。這樣生產環境中內存元數據與持久化元數據差異就會越來越大,會導致生成大量的edits文件,NameNode重啓速度變慢。爲了解決這些問題就產生了Secondary NameNode。
SecondaryNameNode會將NameNode中產生的fsimage和edits下載過來,執行合併生成新的fsimage,然後把新的fsimage再重新發回NameNode,這樣NameNode中的持久化元數據就能與內存中的元數據一致或非常接近了,edits文件的數量大大減少。