IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]HDFS实验之一:机架感知

    book_mmicky发表于 2014-05-13 15:23:40
    love 0
    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写数据。



沪ICP备19023445号-2号
友情链接