注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mmicky 的博客

追逐刹那的惊艳

 
 
 

日志

 
 

HDFS实验之一:机架感知  

2014-03-24 16:15:17|  分类: hadoop2 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
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写数据。

  评论这张
 
阅读(373)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017