天天看点

Hadoop的机架配置rack-awareness

一直都说Hadoop的HDFS默认会把所有文件复制三份:

  1. 第一份随机选一个datanode
  2. 第二份在另一个机架(rack)上随机选一个datanode
  3. 第三份在第二份的机架上再选一个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...."这一行的内容

Hadoop的机架配置rack-awareness

修改该文件的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
           

结果如下:

Hadoop的机架配置rack-awareness

参考文献

http://fibrevillage.com/storage/638-hadoop-rack-awareness-what-s-it-and-how-to-config

继续阅读