Ubuntu上使用Hadoop 2.x 九 HDFS cluster拓扑管理


什么是Rack Awareness?

考虑大型的hadoop集群,为了保证datanode的冗余备份的可靠性,多个datanode应该放在在不同的机架,但是放在不同的机架上,也就意味着网络传输要穿过路由器,速度肯定没有一个机架中的datanode server之间传递来的快,因此性能有所影响。比较推荐的做法(之前在MongoDB相关文档中也看到)是,将两个datanode servers放在同一个机架,第三个datanode server放置在另一个机架上,如果有多个数据中心,这第三个要放在另一个数据中心。

hadoop应该通过配置信息清楚的知道datanode servers的拓扑结构,然后聪明的做到兼顾性能和可靠性。在读取的时候,尽量在同一个数据中心的同一个机架内读取,而写入时要尽可能的将一份数据的三份拷贝做如下安排,两份写入同一个数据中心同一机架的datanode servers中,第三份写入另一个数据中心的某机架的datanode server中。

如何设置拓扑信息?

根据IP地址解析出拓扑结构的脚本文件

因此hadoop需要知道datanode的拓扑结构,即每台datanode server所在的data center和rack id.

首先准备一个脚本文件,可以接受输入的IP地址,然后用.分割,将第二和第三段取出,第二段作为data center的id,第三段作为rack id。

#!/bin/bash
# Set rack id based on IP address.
# Assumes network administrator has complete control
# over IP addresses assigned to nodes and they are
# in the 10.x.y.z address space. Assumes that
# IP addresses are distributed hierarchically. e.g.,
# 10.1.y.z is one data center segment and 10.2.y.z is another;
# 10.1.1.z is one rack, 10.1.2.z is another rack in
# the same segment, etc.)
#
# This is invoked with an IP address as its only argument

# get IP address from the input
ipaddr=$1

# select “x.y” and convert it to “x/y”
segments=`echo $ipaddr | cut -f 2,3 -d '.' --output-delimiter=/`
echo /${segments}

运行结果如下:

dean@dean-ubuntu:~$ ./rack-awareness.sh 192.168.1.10
/168/1
dean@dean-ubuntu:~$ ./rack-awareness.sh 192.167.1.10
/167/1

该脚本来自下面的第一篇参考文章,有点bug,我将$0改为了$1即可。该脚本会被hadoop调用,接受IP地址作为参数,最后返回datacenter id和rack id组成的拓扑路径,就是类似"/167/1"的字符串。主要理解了cut命令后就很简单了。

这里我自己用newlisp实现了同样功能的脚本:

#!/usr/bin/newlisp

(set 'ip (main-args 2))
(set 'ip-list (parse ip "."))
(set 'r (format "/%s/%s" (ip-list 1) (ip-list 2)))
(println r)
(exit)
这个脚本文件是需要设置给hadoop调用的,

需要设置core-site.xml文件,官方手册:http://hadoop.apache.org/docs/r2.3.0/hadoop-project-dist/hadoop-common/core-default.xml
注意,如果data center的IP地址不是按照如上规则,则该脚本是需要修改的。因此不能用于所有情况。


部署脚本到namenode server上

这个脚本文件只需要部署到namenode server上,配置到config.xml文件中即可,注意,下面三个配置都需要:

  <property>
    <name>net.topology.node.switch.mapping.impl</name>
    <value>org.apache.hadoop.net.ScriptBasedMapping</value>
    <description> The default implementation of the DNSToSwitchMapping. It                                                                        
    invokes a script specified in net.topology.script.file.name to resolve                                                                        
    node names. If the value for net.topology.script.file.name is not set, the                                                                    
    default value of DEFAULT_RACK is returned for all node names.                                                                                 
    </description>
  </property>
  <property>
    <name>net.topology.script.file.name</name>
    <value>/opt/rack.lsp</value>
  </property>
  <property>
    <name>net.topology.script.number.args</name>
    <value>100</value>
    <description> The max number of args that the script configured with                                                                          
    net.topology.script.file.name should be run with. Each arg is an                                                                              
    IP address.                                                                                                                                   
    </description>
  </property>

其中/opt/rack.lsp脚本就是我之前的newlisp脚本。

现在关闭然后再次启动namenode后,运行下面的命令看一下:

hduser@namenode:/usr/local/hadoop/etc/hadoop$ hdfs dfsadmin -printTopology 
Rack: /168/1
   192.168.1.73:50010 (datanode1)

目前只启动了一个datanode1,根据IP地址,解析的拓扑结构是/168/1.

当其他两个datanode都启动后,再看:

hduser@namenode:/usr/local/hadoop/etc/hadoop$ hdfs dfsadmin -printTopology 
Rack: /168/1
   192.168.1.73:50010 (datanode1)
   192.168.1.74:50010 (datanode2)
   192.168.1.75:50010 (datanode3)

当然脚本是可以变得,newlisp脚本可以变成用IP地址调用一个web server,获得对应的data center 和 rack id,然后组成拓扑路径。而管理员可以通过网站手动维护IP地址对应的data center和rack的信息。

这个应该是在产品系统中更为有用,在本文中之讨论简单的示范例子。


查看文件的rack信息

据说下面的命令有用,不过我还没有亲自试过,先记在这里:

hdfs fsck /user/filename -files  -blocks -locations -racks 查看文件block在哪几个rack上



参考文章:

http://bigdataprocessing.wordpress.com/2013/07/30/hadoop-rack-awareness-and-configuration/

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html#Rack_Awareness

https://issues.apache.org/jira/secure/attachment/12345251/Rack_aware_HDFS_proposal.pdf

相关内容

    暂无相关文章