1. 程式人生 > >[HDFS_add_3] HDFS 機架感知

[HDFS_add_3] HDFS 機架感知


0. 說明

   HDFS 副本存放策略 && 配置機架感知

 


 1. HDFS 的副本存放策略

  HDFS 的副本存放策略是將一個副本存放在本地機架節點上,另外兩個副本放在不同機架的不同節點上。

  這樣叢集可在完全失去某一機架的情況下還能存活。同時,這種策略減少了機架間的資料傳輸,提高了寫操作的效率,因為資料塊只存放在兩個不同的機架上,減少了讀取資料時需要的網路傳輸總頻寬。這樣在一定程度上兼顧了資料安全和網路傳輸的開銷。

 

 

  

 

 


2. 配置機架感知

 

rack node num
1 s101 | s102 | s103 1
2 s104 | s105 2

 

 

 



  驗證副本放置策略:3副本

  本地機架放一個 s102 | s103

  離架放兩個 s104 & s105

 

  0. 將 s105 配置為 DataNode

# 修改 slaves
vi slaves

# 新增 s105
s105

 

  1. 打包原始碼,將 jar 包傳送到 /soft/hadoop/share/hadoop/common/lib 下,並同步

xsync.sh /soft/hadoop/share/hadoop/common/lib/myhadoop-1.0-SNAPSHOT.jar

 

  2. 設定配置檔案 core-site.xml ,新增

<property>
  <name>net.topology.node.switch.mapping.impl</name>
  <value>hadoop.hdfs.TestRack</value>
</property>

 

  3. 同步配置檔案

xsync.sh core-site.xml

 

  4. 啟動並檢視 DataNode 啟動日誌

start-dfs.sh

 

  5. 測試方法,檢視 s101 的 DataNode 啟動日誌,檢視 rack1 和 rack2 分配情況

cat /soft/hadoop/logs/hadoop-centos-namenode-s101.log

 

 


 3. 程式碼編寫

 

package hadoop.hdfs;

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

public class TestRack implements org.apache.hadoop.net.DNSToSwitchMapping {

    /**
     * @param names 傳入一個主機名或 ip 地址的列表
     * @return 返回網路拓撲路徑 /rack1/192.168.23.102
     */
    public List<String> resolve(List<String> names) {

        List<String> list = new ArrayList<String>();

        for (String name : names) {
            // 如果引數是主機名
            if (name.startsWith("s")) {
                // 獲取字尾
                int suffix = Integer.parseInt(name.substring(1));

                // 如果字尾是 101-103,則在 rack1 中
                if (suffix < 104) {
                    String path = "/rack1/";
                    list.add(path);
                } else {
                    String path = "/rack2/";
                    list.add(path);
                }

            }
            // 引數是 ip地址 192.168.23.101
            else {
                //獲取字尾
                int suffix = Integer.parseInt(name.split("\\.")[3]);

                // 如果字尾是 101-103,則在 rack1中
                if (suffix < 104) {
                    String path = "/rack1/";
                    list.add(path);
                } else {
                    String path = "/rack2/";
                    list.add(path);
                }
            }
        }
        return list;

    }

    public void reloadCachedMappings() {

    }

    public void reloadCachedMappings(List<String> names) {

    }
}