博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hadoop HDFS机架感知
阅读量:2428 次
发布时间:2019-05-10

本文共 3020 字,大约阅读时间需要 10 分钟。

实验环境

hadoop版本: 2.6.5master: 192.168.1.160slave1: 192.168.1.161

机架感知

一个hadoop分布式集群会有很多的服务器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,机架内的服务器之间的网络速度通常都会高于跨机架服务器之间的网络速度,并且机架之间服务器的网络通信通常受到上层交换机间网络带宽的限制。

HDFS对数据文件是分block存储,每个block默认有3个副本(也可以配置大于3),HDFS对副本的存放策略如下:

  1. 第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的)。
  2. 第二个副本放置在与第一个节点不同的机架中的node中(随机选择)。
  3. 第三个副本放置在与第一个副本所在节点同一机架的另一个节点上。
  4. 如果还有更多的副本则随机放在集群的node里。

这样的策略主要是为了数据的可靠性和数据访问的性能考虑。

  • 数据分布于不同的机架上,就算整个机架挂掉后,其他机架上还有冗余备份,整个集群依然能对外服务。
  • 数据分布于不同的机架上,运行mapreduce任务时可以就近获取所需的数据。

hadoop对机架的感知并非是自适应的,而是需要使用者告诉hadoop机器(ip)与机架的对应关系。

实现

hadoop机架感知可以有两种方式实现,编写机架感知程序和脚本方式。

机架感知程序

  1. 实现接口DNSToSwitchMapping

    import org.apache.hadoop.net.DNSToSwitchMapping;import java.util.ArrayList;import java.util.List;public class MyDNSToSwitchMapping implements DNSToSwitchMapping {    @Override    public List
    resolve(List
    list) { List
    paths = new ArrayList
    (); if (list != null && !list.isEmpty()) { for (String hostname : list) { String rackPath = ""; if ("master".equals(hostname)) { //以主机名来判断,实验环境中只有master和slave1。 rackPath = "/rack1"; } else { rackPath = "/rack2"; } paths.add(rackPath); } } return paths; } @Override public void reloadCachedMappings() { } @Override public void reloadCachedMappings(List
    list) { }}

pom.xml

```
org.apache.hadoop
hadoop-client
2.6.5
```
  1. 将上述代码打包,上传到master节点hadoop根目录share/hadoop/common/lib下。

    mvn package -Dmaven.test.skip=true
  2. 修改core-site.xml配置。

    net.topology.node.switch.mapping.impl
    com.tongfang.learn.MyDNSToSwitchMapping
  3. 将jar包和修改的配置分发到slave1节点上,重新启动节点

    ./sbin/start-dfs.sh
  4. 查看集群机器分布情况

    [hadoop@master hadoop-2.6.5]$ ./bin/hdfs  dfsadmin -printTopologyRack: /rack1   192.168.1.160:50010 (master)Rack: /rack2   192.168.1.161:50010 (slave1)

    可以看出机器分布于rack1和rack2两个机架。

脚本

hadoop也提供了脚本的方式来配置机架感知方式,常见的实现方式有shell脚本和python脚本两种方式,这里以python脚本为例。

  1. 编写感知脚本,并授予执行权限。

    #!/usr/bin/python#coding=utf-8import sysrack={          "192.168.1.160":"/dc1/rack1",          "192.168.1.161":"/dc1/rack2",          "master":"/dc1/rack1",          "slave1":"/dc1/rack2",        }        if __name__=="__main__":	print rack.get(sys.argv[1], "default-rack") #主机名或ip不存在,则使用默认机架default-rack

由于没有找到确切的文档说明 到底是主机名还是ip地址会被传入到脚本,所以在脚本中最好兼容主机名和ip地址。

添加执行权限:	chmod +x test.py
  1. 在master上修改core-site.xml配置。

    net.topology.script.file.name
    /home/hadoop/test.py
  2. 将脚本和修改的配置分发到slave1上,并重启集群

    ./sbin/start-dfs.sh
  3. 查看集群机器分布情况。

    [hadoop@master hadoop-2.6.5]$ ./bin/hdfs  dfsadmin -printTopologyRack: /dc1/rack1   192.168.1.160:50010 (master)Rack: /dc1/rack2   192.168.1.161:50010 (slave1)

可以看出机器分布于 /dc1/rack1和/dc1/rack2两个机架。

转载地址:http://xwjmb.baihongyu.com/

你可能感兴趣的文章
方刚先生谈《胜于言传——网站内容制胜宝典》
查看>>
php以图搜图
查看>>
php怎么实现根据图片搜索图片功能
查看>>
三种保证URL地址可信的加密方式
查看>>
memcached 并发原语CAS与GETS操作
查看>>
memcached(六)调优经验
查看>>
赶集mysql军规
查看>>
mysql使用索引优化order排序
查看>>
mysql复合索引、普通索引总结
查看>>
mysql explain中的using filesort
查看>>
MYSQL explain详解
查看>>
MySQL查询优化-explain
查看>>
Java 反射和动态代理真的没那么高深,一起来看看就知道了
查看>>
Lucky
查看>>
ERP100 論壇,ORACLE ERP
查看>>
ORA-600
查看>>
不止 5G 和鸿蒙,华为最新大招,扔出 AI 计算核弹
查看>>
【早报】做Java半年,挣的不如AI 1个月?第二句泪目..
查看>>
反转!2019程序员吸金榜来了,AI程序员刷爆了..
查看>>
学Python后到底能干什么?网友:我太难了
查看>>