实现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
- 实现hadoop中的机架感知(Rack aware)
- 实现hadoop中的机架感知(Rack aware)
- hadoop中的机架感知(Rack aware)
- Hadoop Rack Aware 机架感知
- Hadoop Rack Aware 机架感知
- 实现hadoop中的机架感知
- hadoop 配置 机架感知 rack awareness
- hdfs rack机架感知配置
- hdfs rack机架感知配置
- 研磨Hadoop源码(四)Hadoop Rack Awareness(机架感知)
- 研磨Hadoop源码(四)Hadoop Rack Awareness(机架感知)
- Hadoop机架感知的实现及配置
- [hadoop]hadoop机架感知
- Hadoop机架感知
- hadoop机架感知
- hadoop机架感知
- hadoop机架感知
- hadoop 机架感知技术
- mini2440 LED 跑马灯实验
- SICP Exercise 3.29
- eclipse下配置svn
- 随滚动条移动的层
- word文档自动生成目录
- 实现hadoop中的机架感知(Rack aware)
- C++ 局部类和嵌套类
- [转载]oracle中的sql%found sql%notfound和sql%rowcount
- 全部博文集锦第三期CHM文件,及十三个经典算法研究PDF文档
- 如何使用和制作 Python 安装模块(setup.py)
- 查找的3种算法
- kermit的安装、配置、使用
- Android开发中使用SQLite 数据库
- [一分钟学会系列之一] 一分钟学会C++调用WebService