实现hadoop中的机架感知(Rack aware)

来源:互联网 发布:淘宝神笔找不到宝贝 编辑:程序博客网 时间:2024/06/05 22:52

原理

hadoop中声明是有机架感知的功能,能够提高hadoop的性能。平时我们使用的hadoop集群,实际上是从来没有使用上这个功能的。 hadoop中所说的机架感知的实现实际上这样的:

  • hadoop启动时会检查hadoop-default.xml和hadoop-site.xml中的一个配置选项:topology.script.file.name,如果这个选项不为空,hadoop就会认为这是一个可运行脚本,于是在每检测到一个slave连接上jobtracker时就会把这个slave的IP地址作为参数传给这个脚本,然后期待这个脚本的返回值返回这台slave所述的rack名。而这个脚本内部具体是如何决定slave和rack的映射hadoop是不关心的。所以,哪台机器属于那个rack,其实是由写这个脚本的人决定。
  • 另外,和topology.script.file.name相对应的还有另外一个配置选项:topology.script.number.args,这个选项的设定了以上脚本所能接受的最大参数个数,因为脚本被调用时会接受到不止一个参数,每个参数都是一台机器的IP地址。

实现步骤

  • 1, 在jobtracker的hadoop-site.xml配置文件中加入一下配置选项:
<property>    <name>topology.script.file.name</name>    <value>/path/to/rackmap.sh</value>    <description> The script name that should be invoked to resolve DNS names to    NetworkTopology names. Example: the script would take host.foo.bar as an    argument, and return /rack1 as the output.    </description>  </property>  <property>    <name>topology.script.number.args</name>    <value>1000</value>    <description> The max number of args that the script configured with    topology.script.file.name should be run with. Each arg is an    IP address.    </description>  </property>
  • 编写rackmap.sh脚本,为每一个地址输出其所属的rack
  • 重启jobtracker

 topology.script.file.name

 

 HDFS不能够自动判断集群中各个datanode的网络拓扑情况。这种机架感知需要topology.script.file.name属性定义的可执行文件(或者脚本)来实现,文件提供了IP->rackid的翻译。NameNode通过这个得到集群中各个datanode机器的rackid。如果topology.script.file.name没有设定,则每个IP都会翻译成/default-rack。

 

 下面给出了一个script文件的c语言示例。这个文件需要处理多个输入参数的情况,每个参数是个ip。文件的输出对应就是rackid串。

   int main(int argc , char *argv[])
   {

 


                for(int i=1 ;i< argc; i++)
                {
                        char* ipStr     = argv[i];

                         //  找到ip对应的rack设置,下面的
                        cout<<"/rack1/"<<i<<" ";

                 }
                        cout<< endl;


   }

 

 

 

  网络拓扑

 

 

有了机架感知,NameNode就可以画出上图所示的datanode网络拓扑图。D1,R1都是交换机,最底层是datanode。则H1的rackid=/D1/R1/H1,H1的parent是R1,R1的是D1。这些rackid信息可以通过topology.script.file.name配置。有了这些rackid信息就可以计算出任意两台datanode之间的距离。

 

distance(/D1/R1/H1,/D1/R1/H1)=0  相同的datanode

distance(/D1/R1/H1,/D1/R1/H2)=2  同一rack下的不同datanode

distance(/D1/R1/H1,/D1/R1/H4)=4  同一IDC下的不同datanode

distance(/D1/R1/H1,/D2/R3/H7)=6  不同IDC下的datanode

副本放置策略

 

 

第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的,当然系统会尝试不选择哪些太满或者太忙的node)。

 

第二个副本放置在与第一个节点不同的机架中的node中(随机选择)。 

 

第三个副本和第二个在同一个机架,随机放在不同的node中。

 

如果还有更多的副本就随机放在集群的node里。

 

Hadoop的副本放置策略在可靠性(block在不同的机架)和带宽(一个管道只需要穿越一个网络节点)中做了一个很好的平衡。下图是备份参数是3的情况下一个管道的三个datanode的分布情况。

 

 

 

转:http://blog.csdn.net/HEYUTAO007/article/details/5600530

http://blog.csdn.net/fiberlijun/article/details/4820266


原创粉丝点击