【hadoop】10.HDFS-機架感知

簡介

經過本教程您能夠學習到:html

  1. 網絡拓撲的概念
  2. 節點距離的計算
  3. 機架感知
  4. 如何修改默認的機架設置策略
  5. 驗證機架感知

一、網絡相關知識

1.一、網絡拓撲

爲了接下來對一些內部機制有所瞭解,咱們先來了解一下網絡拓撲的概念。java

在本地網絡中,兩個節點被稱爲「彼此近鄰」是什麼意思?node

在海量數據處理中,主要限制因素是節點之間數據的傳輸速率——帶寬很稀缺。這裏的想法是將兩個節點間的帶寬做爲距離的衡量標準。web

咱們來了解一個概念:節點距離——兩個節點到達最近的共同祖先的距離總和。這個概念,是否也能夠理解爲拓撲網絡中兩個節點的最短路徑呢(只不過每條邊的邊長都爲1)?(想起了大學時OJ題目中各類最短路徑的算法題。)算法

例如,假設有數據中心d1機架r1中的節點n1。該節點能夠表示爲/d1/r1/n1。利用這種標記,這裏給出四種距離描述。 Distance(/d1/r1/n1, /d1/r1/n1)=0(同一節點上的進程) Distance(/d1/r1/n1, /d1/r1/n2)=2(同一機架上的不一樣節點) Distance(/d1/r1/n1, /d1/r3/n2)=4(同一數據中心不一樣機架上的節點) Distance(/d1/r1/n1, /d2/r4/n2)=6(不一樣數據中心的節點)shell

1.二、機架感知(副本節點選擇)

當咱們節點的數目比較多,而副本數比較少的狀況下。例如多個DN,3個relication。集羣對於選擇節點存儲的策略是什麼樣的呢?apache

一、參考文檔數組

二、低版本Hadoop副本節點選擇網絡

  • 第一個副本在client所處的節點上。若是客戶端在集羣外,隨機選一個。
  • 第二個副本和第一個副本位於不相同機架的隨機節點上。
  • 第三個副本和第二個副本位於相同機架,節點隨機。

咱們能夠看到,這樣作的目的就是爲了使各個副本之間的節點距離儘量的短。app

三、Hadoop2.7.2副本節點選擇

  • 第一個副本在client所處的節點上。若是客戶端在集羣外,隨機選一個。
  • 第二個副本和第一個副本位於相同機架,隨機節點。
  • 第三個副本位於不一樣機架,隨機節點。

咱們能夠看到,2.7版本在舊版本的基礎上,再一次縮短了第一個副本和第二個副本節點之間的距離。而第三個副本存儲在其餘的機架上則是爲了保證高可用,避免同個機架壞了致使文件不可用(否則都往一個機架裏面存儲)。

2. 集羣調整

爲了接下來讀機架感知策略進行驗證,咱們須要在原來3臺機器的基礎上,添加新的節點,也就是4個節點的集羣。

192.168.102.132 h132
192.168.102.133 h133
192.168.102.134 h134
192.168.102.135 h135

在原來的基礎上添加一臺h132節點便可。

一、關閉全部服務

[root@h133 ~]# stop-dfs.sh 

[root@h134 ~]# stop-yarn.sh 

[root@h133 ~]# xcall $JAVA_HOME/bin/jps
-------------localhost----------
----------h133---------
6253 Jps
----------h134---------
4233 Jps
----------h135---------
5140 Jps

h134執行stop-yarn.sh,h133上執行stop-dfs.sh.

二、修改主機名、主機名文件、h133和h134到h132的ssh無密碼登陸。

[root@h132 ~]# hostname h132

[root@h133 ~]# ssh-copy-id h132

[root@h134 ~]# ssh-copy-id h132

三、將h13三、h134以及h135的以前的集羣信息所有刪除。

xcall rm -rf /opt/module/hadoop-2.7.2/data /opt/module/hadoop-2.7.2/logs/

這是很暴力的作法,之後咱們會講到如何增長服役節點,那種纔是最合理的增長集羣節點的方式——暴力方式只推薦測試使用。

四、將xcall以及xsync腳本複製到h132,使用xshell同步編輯全部機器,一次性編輯全部文檔,使其兼容h132主機的存在。(修改循環的下限而已)

五、將h133的/opt/module/hadoop-2.7.3.tar.gz複製到h132節點的相同位置,這樣全部的配置文件就保持一致了。

 

五、xshell所有會話工具設置服役節點配置文件{hadoop_home}/etc/hadoop/slaves,增長h132。

h132
h133
h134
h135

這樣,全部的準備工做就完成了。

六、在namenode所在節點h133上格式化namenode:

[root@h133 hadoop]# hdfs namenode -format
19/01/03 15:00:18 INFO namenode.NameNode: STARTUP_MSG: 
...

hadoop namenode -format已經被標註爲要過期了。

七、在namenode所在節點h133上啓動dfs相關守護進程

[root@h133 hadoop]# start-dfs.sh 
Starting namenodes on [h133]
h133: starting namenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-namenode-h133.out
h134: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h134.out
h132: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h132.out
h135: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h135.out
h133: starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-datanode-h133.out
Starting secondary namenodes [h135]
h135: starting secondarynamenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-root-secondarynamenode-h135.out

[root@h133 hadoop]# xcall $JAVA_HOME/bin/jps
-------------localhost----------
----------h132---------
14979 Jps
14905 DataNode
----------h133---------
8130 NameNode
8457 Jps
8252 DataNode
----------h134---------
4786 Jps
4712 DataNode
----------h135---------
5730 DataNode
5864 Jps
5820 SecondaryNameNode

能夠看到,咱們已經擁有4個數據節點了。

八、在resourceManager所在節點h134上啓動yarn相關守護進程

root@h134 hadoop]# start-yarn.sh 
starting yarn daemons
starting resourcemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-resourcemanager-h134.out
h132: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h132.out
h133: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h133.out
h135: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h135.out
h134: starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-root-nodemanager-h134.out

[root@h134 hadoop]# xcall $JAVA_HOME/bin/jps
-------------localhost----------
----------h132---------
14905 DataNode
15017 NodeManager
15116 Jps
----------h133---------
8496 NodeManager
8130 NameNode
8597 Jps
8252 DataNode
----------h134---------
4835 ResourceManager
4934 NodeManager
4712 DataNode
5215 Jps
----------h135---------
5730 DataNode
6007 Jps
5820 SecondaryNameNode
5903 NodeManager

九、測試一下集羣是否穩定。

[root@h133 hadoop]# hadoop fs -mkdir -p /user/zhaoyi/input
[root@h133 hadoop]# hadoop fs -ls -R /user
drwxr-xr-x   - root supergroup          0 2019-01-03 15:14 /user/zhaoyi
drwxr-xr-x   - root supergroup          0 2019-01-03 15:14 /user/zhaoyi/input

OK,咱們開始測試。

三、自定義機架感知jar包

3.一、編寫jar包

在以前的項目下,建立以下的類,實現接口DNSToSwitchMapping:

package com.zhaoyi;

import org.apache.hadoop.net.DNSToSwitchMapping;

import java.util.ArrayList;
import java.util.List;

public class MyRockMapping implements DNSToSwitchMapping {

    public List<String> resolve(List<String> names) {
        // rack list
        List<String> racks = new ArrayList<String>();
        int ipNum = 0;// will be 132,133,134,135
        // 獲取機架IP
        if(names != null && names.size() > 0){

            for (String name: names) {
                if(name.startsWith("h")){//host name
                    ipNum = Integer.parseInt(name.substring(1));
                }else{// ipv4
                    ipNum = Integer.parseInt(name.substring(1 + name.lastIndexOf(".")));
                }
            }

            if(ipNum <= 133){//132,133
                racks.add("/dd/rack1" );
            }else{//134,135
                racks.add("/dd/rack2");
            }

        }
        return racks;
    }

    public void reloadCachedMappings() {

    }

    public void reloadCachedMappings(List<String> names) {

    }
}

咱們實現resolve方法,該方法的輸入參數爲集羣中各臺主機名(或者IP,咱們要作兼容),輸出則爲咱們自定義的機架名稱數組,以此來覆蓋Hadoop集羣默認org.apache.hadoop.net.ScriptBasedMapping進行機架設置行爲。能夠看到,咱們將132和133歸爲rack1,134和135歸爲rack2。

使用maven打包:

mvn package

將生成的jar包(我這裏名爲firsthadoop-1.0-SNAPSHOT.jar(和項目名一致),沒多大影響)拷貝到集羣全部機器的/opt/module/hadoop-2.7.2/share/hadoop/common/lib下。

3.二、配置並重啓集羣

一、修改配置文件core-site.xml(/opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml),使HDFS使用咱們的Mapping。

<!-- Topology Configuration -->
<property>
  <name>net.topology.node.switch.mapping.impl</name>
  <value>com.zhaoyi.MyRockMapping</value>
</property>

com.zhaoyi.MyRockMappin是咱們實現類的namespace+classname,請注意和你的保持一致

net.topology.node.switch.mapping.impl的默認值爲org.apache.hadoop.net.ScriptBasedMapping.

二、重啓集羣

#### 中止集羣
[root@h134 hadoop]# stop-yarn.sh

[root@h133 lib]# stop-dfs.sh 

[root@h133 hadoop]# xcall $JAVA_HOME/bin/jps
-------------localhost----------
----------h132---------
15652 Jps
----------h133---------
10277 Jps
----------h134---------
6283 Jps
----------h135---------
6807 Jps

#### 啓動集羣
[root@h133 lib]# start-dfs.sh

[root@h134 hadoop]# start-yarn.sh

[root@h133 lib]# xcall $JAVA_HOME/bin/jps
-------------localhost----------
----------h132---------
15794 NodeManager
15690 DataNode
15917 Jps
----------h133---------
10392 NameNode
10520 DataNode
10684 NodeManager
10878 Jps
----------h134---------
6322 DataNode
6437 ResourceManager
6854 Jps
6542 NodeManager
----------h135---------
7010 NodeManager
7139 Jps
6845 DataNode
6943 SecondaryNameNode

注意中止、啓動順序,以及在不一樣的機器上運行命令(注意個人copy代碼前面對應的主機名)

三、查看機架信息

[root@h133 lib]# hdfs dfsadmin -printTopology
Rack: /dd/rack1
   192.168.102.132:50010 (h132)
   192.168.102.133:50010 (h133)

Rack: /dd/rack2
   192.168.102.134:50010 (h134)
   192.168.102.135:50010 (h135)

很明顯,咱們的機架已經將分組成功的劃分了。接下來,咱們開始測試上傳文件。

3.三、驗證理論

目前,咱們將132和133歸爲rack1,134和135歸爲rack2。

根據咱們前面的分析,根據上傳節點的不一樣:

  • 若咱們從h133上上傳,則因爲h132和h133位於同一機架。所以文件有兩份副本確定分別存儲在h132和133上,剩下的一份隨即在h134和135上;

  • 若是咱們在h134上上傳文件,則其中2份在h134和h135上,剩下的一份隨機存在h132或者h133上。

經過web界面點擊上傳的文件能夠了解到上傳文件副本所在的節點信息,你也能夠經過查看namenode的日誌查詢文件上傳過程當中的相關信息。

[root@h13xxxx ~]hadoop fs -put h13xxx.txt /user

一、在h132上傳文件h132.txt,從web查看h132.txt文件的分組信息

二、在h133上傳文件h133.txt,從web查看h133.txt文件的分組信息

三、在h134上傳文件h134.txt,從web查看h134.txt文件的分組信息

四、在h135上傳文件h135.txt,從web查看h135.txt文件的分組信息

低版本hadoop節點選擇示意圖

徹底相反的結論,也就是說,2.7.2表現的結果是咱們以上的理論中,低版本的表現形式。

總結下來,咱們2.7.2目前的表現形式爲:

  • 第一個副本在client所處的節點上。若是客戶端在集羣外,隨機選一個。
  • 第二個副本和第一個副本位於不相同機架的隨機節點上。
  • 第三個副本和第二個副本位於相同機架,節點隨機。

低版本hadoop節點選擇示意圖

這個問題,之後咱們回頭再看看看是那裏有問題。至少目前咱們懂得了一些頗有意思的東西,好比說機架、好比說HDFS文件處理的部分原理。

參考

  1. 官方網站:http://hadoop.apache.org/
  2. 官方文檔:https://archive.apache.org/dist/hadoop/common/hadoop-2.7.2/
  3. 官方文檔:http://hadoop.apache.org/docs/r2.7.2/
  4. 書籍《hadoop權威指南 第四版》
相關文章
相關標籤/搜索