### 自定义机架感知
0. 数据节点的量
```
[rack1]
s100
s101
s102
[rack2]
s103
s104
s105
s106
```
1. 创建类实现DNSToSwitchMapping接口
2. 配置文件core-site.xml
```
<!-- Topology Configuration -->
<property>
<name>net.topology.node.switch.mapping.impl</name>
<value>com.lampnick.rackware.MyDNSToSwichMapping</value>
</property>
```
3. 分发core-site.xml
4. 编译程序,打成jar,分发到所有节点的hadoop的classpath下
/soft/hadoop/shared/common/lib
5. 分发jar
增加一个数据节点
1. 克隆一个节点
2. 启动新节点
3. 修改新克隆的主机的IP和主机名
[/etc/hostname]=s105
[/etc/sysconfig/network-scripts/ifcfg-eno16777736]
4. 修改s100的hosts文件/etc/hosts文件,然后分发(先修改/soft/hadoop/etc/hadoop/slaves_for_loop加105)
增加192.168.88.105
5. 在s100上ssh到新节点
首次需要输入yes
6. 修改s100的slaves文件,再分发
7. 修改hdfs-site.xml的2ndNN为105
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>s105:50090</value>
</property>
</configuration>
8. 关闭stop-dfs.sh
9. 开启start-dfs.sh
实现类如下
package com.lampnick.rackware;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.net.DNSToSwitchMapping;
public class MyDNSToSwichMapping implements DNSToSwitchMapping {
/**
* 传递的是客户端的IP列表,返回机架感知的路径列表
*/
@Override
public List<String> resolve(List<String> names) {
List<String> list = new ArrayList<String>();
if (names != null && names.size() > 0) {
for (String name : names) {
// 主机名s101
int ip = 0;
if (name.startsWith("s")) {
String no = name.substring(1);
ip = Integer.parseInt(no);
} else if (name.startsWith("192")) {
// 192.168.88.111
ip = Integer.parseInt(name.substring(name.lastIndexOf(".") + 1));
}
if (ip < 103) {
list.add("/rack1/" + ip);
} else {
list.add("/rack2/" + ip);
}
}
}
//写入文件中
try {
FileOutputStream fos = new FileOutputStream("/home/hadoop/dns.txt");
for (String name : list) {
fos.write((name + "\r\n").getBytes());
}
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
@Override
public void reloadCachedMappings() {
// TODO Auto-generated method stub
}
@Override
public void reloadCachedMappings(List<String> arg0) {
// TODO Auto-generated method stub
}
}
转载请注明:MitNick » 自定义机架感知