查看当前机架感知的参数
hdfs dfsadmin -printTopology
显示内容大致如下:
Rack: /default-rack
192.168.1.221:9866 (hadoop221)
192.168.1.222:9866 (hadoop222)
192.168.1.223:9866 (hadoop223)
192.168.1.224:9866 (hadoop224)
192.168.1.225:9866 (hadoop225)
192.168.1.226:9866 (hadoop226)
192.168.1.227:9866 (hadoop227)
192.168.1.228:9866 (hadoop228)
192.168.1.229:9866 (hadoop229)
修改配置文件core-site.xml
添加“core-site.xml”配置文件中的“topology.script.file.name”参数
vi core-site.xml
在与之间添加如下内容
<property>
<name>topology.script.file.name</name>
<value>/home/hadoop/hadoop/etc/hadoop/rackaware/topology.sh</value>
<description>处理机架感知参数的Shell</description>
</property>
编辑机架感知shell
极佳感知的原理是:客户提出需求->NameNode问topology.sh->topology.sh给出结果
mkdir -p /home/hadoop/hadoop/etc/hadoop/rackaware
vi /home/hadoop/hadoop/etc/hadoop/rackaware/topology.sh
内容如下:
#!/bin/bash
HADOOP_CONF=/home/hadoop/hadoop/etc/hadoop/rackaware
while [ $# -gt 0 ] ; do #//$#代表执行命令时输入的参数个数
nodeArg=$1
exec<${HADOOP_CONF}/topology.data #//读入文件
result=""
while read line ; do #//循环遍历文件内容
ar=( $line )
if [ "${ar[0]}" = "$nodeArg" ]||[ "${ar[1]}" = "$nodeArg" ]; then
result="${ar[2]}"
fi
done
shift
if [ -z "$result" ] ; then
echo -n "/default-rack"
else
echo -n "$result"
fi
done
机架感知数据提供
chmod 755 topology.sh
vi topology.data
内容如下:
192.168.1.223 hadoop223 /D1/R1
192.168.1.224 hadoop224 /D1/R1
192.168.1.225 hadoop225 /D1/R2
192.168.1.226 hadoop226 /D1/R2
192.168.1.227 hadoop227 /D2/R1
192.168.1.228 hadoop228 /D2/R1
/D1/R1的意思是:D1区域,R1机架
在主节点重启NameNode,NameNode会读取相关的数据。
hdfs --daemon stop namenode
hdfs --daemon start namenode
番外
如何在集群中不重启namenode来动态的添加一个DataNode节点?
在启用了机架感知的集群中可以这样操作:
现在想增加一个物理位置在R2的数据节点192.168.1.229到集群中,不重启NameNode。
首先,修改所有节点(包括hadoop229)的topology.data的配置,加入:
192.168.1.229 hadoop229 /D1/R2
保存。然后在hadoop229上操作,
hdfs --daemons start datanode
启动数据节点hadoop229,
任意节点执行
hdfs dfsadmin -printTopology
看到的结果:
Rack: /D1/R1
192.168.1.223:9866 (hadoop223)
192.168.1.224:9866 (hadoop224)
Rack: /D1/R2
192.168.1.225:9866 (hadoop225)
192.168.1.226:9866 (hadoop226)
192.168.1.229:9866 (hadoop229)
Rack: /D2/R1
192.168.1.227:9866 (hadoop227)
192.168.1.228:9866 (hadoop228)