一直都说Hadoop的HDFS默认会把所有文件复制三份:
- 第一份随机选一个datanode
- 第二份在另一个机架(rack)上随机选一个datanode
- 第三份在第二份的机架上再选一个datanode
但是如果不特别配置的话,hadoop是不知道机架信息的,会默认所有的datanode都在同一个机架上。
如何让Hadoop知道机架信息呢?
就需要靠自己配置啦~~~
Hadoop说明
Hadoop的安装细节请参考另一篇博客:https://blog.csdn.net/lucylove3943/article/details/80589422
我这里用的例子是4台机子搭的Hadoop cluster。
master node: falcon-1
slave node: falcon-2 (10.102.2.33), falcon-3 (10.102.2.41), falcon-4 (10.102.2.49)
说明一下:falcon-2是节点的host name,后面跟的数字10.102.2.33是它的private ip。
Hadoop rack-awareneess configuration
首先进入Hadoop的configuration目录:
cd ~/hadoop-2.9.2/etc/hadoop
然后新建文档rack_topology.data:
vim rack_topology.data
在里面添加如下内容:
10.102.2.33 /rack01
10.102.2.41 /rack01
10.102.2.49 /rack02
注意这里每一行代表一个datanode的机架信息,前面是private ip地址,后面是机架的名字。
这里千万不能写host name,不能写falcon-2,falcon-3,falcon-4,必须要写它对应的ip地址!
如果不配置的话,默认为/default_rack
然后新建文档rack_topology.sh:
vim rack_topology.sh
然后添加如下内容:
#!/bin/bash
HADOOP_CONF=/home/qianwen/hadoop-2.9.2/etc/hadoop
#while [ $# -gt 0 ] ; do
nodeArg=$1
exec<${HADOOP_CONF}/rack_topology.data
result=""
while read line ; do
ar=( $line )
if [ "${ar[0]}" = "$nodeArg" ]; then
result="${ar[1]}"
fi
done
shift
if [ -z "$result" ] ; then
echo -n "/default-rack"
else
echo -n "$result"
fi
# done
注意里面的HADOOP_CONF要改成自己的绝对地址。
如果上面新建的文档不叫rack_topology.data的话,也要相应的修改"exec...."这一行的内容
修改该文件的mode,使其可执行,我这里给的权限比较夸张:
chmod 777 rack_topology.sh
接着修改core-site.xml,添加如下内容:
<property>
<name>topology.script.file.name</name>
<value>/home/qianwen/hadoop-2.9.2/etc/hadoop/rack_topology.sh</value>
</property>
注意value里面的路径改成你电脑相应的配置路径。
看修改结果
启动hdfs:
vim ~/hadoop-2.9.2
sbin/start-dfs.sh
然后通过如下命令查看机架信息:
bin/hdfs dfsadmin -printTopology
结果如下:
参考文献
http://fibrevillage.com/storage/638-hadoop-rack-awareness-what-s-it-and-how-to-config