0. 说明

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


1. HDFS 的副本存放策略

  HDFS 的副本存放策略是将一个副本存放在本地机架节点上,另外两个副本放在不同机架的不同节点上。

  这样集群可在完全失去某一机架的情况下还能存活。同时,这种策略减少了机架间的数据传输,提高了写操作的效率,因为数据块只存放在两个不同的机架上,减少了读取数据时需要的网络传输总带宽。这样在一定程度上兼顾了数据安全和网络传输的开销。

  [HDFS_add_3] HDFS 机架感知-LMLPHP


2. 配置机架感知

racknodenum
1s101 | s102 | s1031
2s104 | s1052

  验证副本放置策略: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) { }
}

05-02 13:40