文章目录

  • 1
  • 配置


1

副本的存放策略又是HDFS实现高可靠性和搞性能的关键,优化的副本存放策略也正是HDFS区分于其他大部分分布式文件系统的重要特性。HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。大型HDFS实例一般运行在跨越多个机架的计算机组成的机群上,不同机架上的两台机器之间的通信需要经过交换机,这样会增加数据传输的成本。在大多数情况下,同一机架内的两台机器间的带宽会比不同机架的两台机器间的带宽大。
一方面,通过一个机架感知的过程,NameNode可以确定每个DataNode所属的机架ID。目前HDFS采用的策略就是将副本存放在不同的机架上,这样可以有效防止整个机架失效时数据的丢失,并且允许读数据的时候充分利用多个机架的带宽。这种策略设置可以将副本均匀地分布在集群中,有利于组织失效情况下的负载均衡。但是,因为这种策略的一个写操作需要传输数据块到多个机架,这增加了写操作的成本。
另一方面,在读取数据时,为了减少整体的带宽小号和降低整体的带宽延时,HDFS会尽量读取程序读取距离客户端最近的副本。如果在读取程序的同一个机架上有一个副本,那么就读取该副本;如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读取本地数据中心的副本。
默认情况下,Hadoop的机架感知策略是未开启的,默认都是在同一个机架下面。
默认机架:

Rack: /default-rack
   10.179.100.195:50010 (hadoop-slave2)
   10.179.100.210:50010 (hadoop-slave1)
   10.179.131.21:50010 (hadoop-slave4)
   10.179.131.90:50010 (hadoop-slave3)
   10.179.52.182:50010 (hadoop-slave5)
   10.179.52.55:50010 (hadoop-slave6)

下面叙述下配置步骤。

配置

机架信息可以通过python脚本来写(线上环境机器较多,按网段来分较方便),也可以通过shell脚本来写。

【python】脚本

利用网段掩码来配置,注意申请机器的ip按网段分隔

python脚本的写法,需要使用到netaddr.
root权限安装pip install netaddr,或先下载再pip install xxx.whl

/home/hadoop/hadoop-current/etc/hadoop/RackAware.py
RackAware.py

#!/usr/bin/python

import netaddr
import sys
sys.argv.pop(0)

#the netmask we use is 255.255.255.0
netmask = '255.255.255.0'

for ip in sys.argv:
    address = '{0}/{1}'.format(ip, netmask)
    try:
        network_address = netaddr.IPNetwork(address).network
        print "/{0}".format(network_address)
    except:
        print "/rack-unknown"

配置文件core-site.xml中添加:

<property>
    <name>net.topology.script.file.name</name>
    <value>/home/hadoop/hadoop-current/etc/hadoop/RackAware.py</value>
  </property>

重启hadoop即可看到机架信息已更新:

[hadoop@hadoop-master1 shellUtils]$ hadoop dfsadmin -printTopology
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

19/05/28 20:42:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Rack: /10.179.100.0
   10.179.100.195:50010 (hadoop-slave2)
   10.179.100.210:50010 (hadoop-slave1)

Rack: /10.179.131.0
   10.179.131.21:50010 (hadoop-slave4)
   10.179.131.90:50010 (hadoop-slave3)

Rack: /10.179.52.0
   10.179.52.182:50010 (hadoop-slave5)
   10.179.52.55:50010 (hadoop-slave6)

说明

其他方式,在测试时可以将机架写成固定ip。加载固定文本中的数据。python或shell均可。后续补充。