HDFS实验之一:机架感知

1:背景
      缺省情况下,hadoop的replication为3,3个副本的存放策略为:
  • 第一个block副本放在和client所在的datanode里(如果client不在集群范围内,则这第一个node是随机选取的)。
  • 第二个副本放置在与第一个节点不同的机架中的datanode中(随机选择)。 
  • 第三个副本放置在与第二个副本所在节点同一机架的另一个节点上。
  • 如果还有更多的副本就随机放在集群的datanode里。
  • 存放策略示意图
HDFS实验之一:机架感知 - mmicky - mmicky 的博客
 
      这样的策略可以保证对该block所属文件的访问能够优先在本rack下找到,如果整个rack发生了异常,也可以在另外的rack上找到该block的副本。这样足够的高效,并且同时做到了数据的容错。
      但是,hadoop对机架的感知并非是真正智能感知的,而是需要人为的告知hadoop哪台机器属于哪个rack,这样在hadoop的namenode启动初始化时,会将这些机器与rack的对应信息保存在内存中,作为写块操作时分配datanode列表时选择datanode的依据。

2:实验环境
HDFS实验之一:机架感知 - mmicky - mmicky 的博客
   
3:配置
要启用机架感知,首先要配置core-site.xml

    
<property>
  <name>topology.script.file.name</name>
  <value>/app/hadoop/hadoop220/etc/hadoop/RackAware.py</value>
</property>
然后编写/app/hadoop/hadoop220/etc/hadoop/RackAware.py

#!/usr/bin/python
#-*-coding:UTF-8 -*-
import sys

rack = {"product201":"rack1",
"product202":"rack1",
"product203":"rack1",
"product204":"rack2",
"product211":"rack2",
"product212":"rack2",
"product213":"rack3",
"product214":"rack3",
"192.168.100.201":"rack1",
"192.168.100.202":"rack1",
"192.168.100.203":"rack1",
"192.168.100.204":"rack2",
"192.168.100.211":"rack2",
"192.168.100.212":"rack2",
"192.168.100.213":"rack3",
"192.168.100.214":"rack3",
}

if __name__=="__main__":
print "/" + rack.get(sys.argv[1],"rack0")

注意,由于hadoop有的地方是使用IP,有的地方使用hostname来表示datanode,为了确保能正确解析rack信息,最好将IP和主机的rack对应关系都在脚本数组上写上。笔者刚开始只写主机名和rack的对应关系,结果数次启动都解析成rack0,最后将IP和rack的对应关系也添加上去后,启动的时候就能正常解析了。
另外,还需要通过 chmod +x RackAware.py 赋予/app/hadoop/hadoop220/etc/hadoop/RackAware.py运行权限。
启动后,可以查看namenode的日志文件,应该有类似如下的日志:

2014-03-24 21:20:54,454 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack1/192.168.100.202:50010

...

2014-03-24 21:20:53,899 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack2/192.168.100.211:50010



4:实验一
集群中客户端上传文件,如在product201上传文件 /app/ jdk-7u21-linux-x64.rpm,然后检查block的分布。
[hadoop@product201 hadoop220]$ bin/hdfs dfs -mkdir /test
[hadoop@product201 hadoop220]$ bin/hdfs dfs -put /app/jdk-7u21-linux-x64.rpm /test/
[hadoop@product201 hadoop220]$ bin/hdfs fsck /test/jdk-7u21-linux-x64.rpm -files -blocks -locations -racks
返回结果:
14/03/24 21:50:52 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Connecting to namenode via http://product201:50070
FSCK started by hadoop (auth:SIMPLE) from /192.168.100.201 for path /test/jdk-7u21-linux-x64.rpm at Mon Mar 24 21:50:53 CST 2014
/test/jdk-7u21-linux-x64.rpm 85388149 bytes, 1 block(s):  OK
0. BP-1378383016-192.168.100.201-1395667074626:blk_1073741825_1001 len=85388149 repl=3 [/rack1/192.168.100.201:50010, /rack3/192.168.100.213:50010, /rack3/192.168.100.214:50010]

Status: HEALTHY
 Total size: 85388149 B
 Total dirs: 0
 Total files: 1
 Total symlinks: 0
 Total blocks (validated): 1 (avg. block size 85388149 B)
 Minimally replicated blocks: 1 (100.0 %)
 Over-replicated blocks: 0 (0.0 %)
 Under-replicated blocks: 0 (0.0 %)
 Mis-replicated blocks: 0 (0.0 %)
 Default replication factor: 3
 Average block replication: 3.0
 Corrupt blocks: 0
 Missing replicas: 0 (0.0 %)
 Number of data-nodes: 8
 Number of racks: 3
FSCK ended at Mon Mar 24 21:50:53 CST 2014 in 4 milliseconds

可以看出:
  • 第一个block副本放在和client所在的datanode里。
  • 第二个副本放置在与第一个节点不同的机架中的datanode中(随机选择)。 
  • 第三个副本放置在与第二个副本所在节点同一机架的另一个节点上。

5:实验二
集群外客户端上传文件,如在集群外客户端wyy上传文件 /app/hadoop2lib/hadoop-hdfs-2.2.0.jar ,然后检查block的分布。
hadoop @wyy :/app/hadoop/hadoop220$ bin/hdfs dfs -put /app/hadoop2lib/hadoop-hdfs-2.2.0.jar /test
hadoop @wyy :/app/hadoop/hadoop220$ bin/hdfs fsck /test/hadoop-hdfs-2.2.0.jar -files -blocks -locations -racks
返回结果:
Connecting to namenode via http://product201:50070
FSCK started by hadoop (auth:SIMPLE) from /192.168.100.111 for path /test/hadoop-hdfs-2.2.0.jar at Mon Mar 24 22:08:15 CST 2014
/test/hadoop-hdfs-2.2.0.jar 5242291 bytes, 1 block(s):  OK
0. BP-1378383016-192.168.100.201-1395667074626:blk_1073741826_1002 len=5242291 repl=3 [/rack2/192.168.100.212:50010, /rack1/192.168.100.203:50010, /rack1/192.168.100.201:50010]

Status: HEALTHY
 Total size: 5242291 B
 Total dirs: 0
 Total files: 1
 Total symlinks: 0
 Total blocks (validated): 1 (avg. block size 5242291 B)
 Minimally replicated blocks: 1 (100.0 %)
 Over-replicated blocks: 0 (0.0 %)
 Under-replicated blocks: 0 (0.0 %)
 Mis-replicated blocks: 0 (0.0 %)
 Default replication factor: 3
 Average block replication: 3.0
 Corrupt blocks: 0
 Missing replicas: 0 (0.0 %)
 Number of data-nodes: 8
 Number of racks: 3
FSCK ended at Mon Mar 24 22:08:15 CST 2014 in 4 milliseconds

可以看出:
  • 第一个block副本放在随机的一个datanode里。
  • 第二个副本放置在与第一个节点不同的机架中的datanode中(随机选择)。 
  • 第三个副本放置在与第二个副本所在节点同一机架的另一个节点上。
当然,这个随机也不是真的随机,而是考虑了负载均衡的随机。多实验几次后,可以发现还是优先考虑负载较少的datanode写数据。

转载于:https://my.oschina.net/victorlovecode/blog/344237

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值