[HDFS_add_3] HDFS 機架感知
阿新 • • 發佈:2018-11-04
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) { } }