构建高可靠hadoop集群之2-机栈
本文主要参考 http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/RackAwareness.html
hadoop组件是机栈敏感(译注rack,机栈,可以简单理解为节点的摆放)。
例如,HDFS块的分布会利用机栈敏感来做容错,方式是把复制放在不同的机栈。这样即便网络切换导致故障或者其它断开导致的故障,也会有一些数据是可用的。
译注:在重要的系统中,还有完全有必要考虑这个的,网络设备也会出现故障,毕竟这些网路设备的负载也很繁重的。
haoop主守护程序可以获得集群从属节点(数据节点)的机栈id,方式是激活一个完毕脚本或者是配置文件制定的java类。无论使用哪种方式,它们的输出都必须符合java的org.apache.hadoop.net.DNSToSwitchMapping接口。
这个接口要求一一对应,拓扑信息(机器摆放信息)必须形如'/myrack/myhost',其中‘/'是拓扑分隔符,’myrack'是rack的识别符,'myhost'是主机名称。假定一个rack有24个子网,那么其中一个就可以使用'/192.168.100.0/192.168.100.5'.
如果要使用java类做拓扑映射,那么类的名称必须是通过配置文件的net.topology.node.switch.mapping.impl来设定。例如,networkTopology.java,已经包含在hadoop发布程序中,管理员可以配置。
使用java类的好处是,当一个新的数据节点加入的时候,hadoop不需要调用外部进程(这样可以更高效一些)。
如果使用外部脚本,那么必须使用参数net.topology.script.file.name来配置。不同于java类,完毕拓扑脚本并没有包含在hadoop发布程序中,必须由管理员提供。当hadoop调用这些脚本的时候,会发送多个ip地址给ARGV.需要发送给脚本的ip地址个数,是
由net.topology.script.number.args控制的,默认值是100.如果net.topology.script.number.args设置为1,那么数据节点或者几点管理器每提交一个ip地址,脚本就要被调用一次。
如果net.topology.script.file.name 或者 net.topology.node.switch.mapping.impl的值没有设置,那么rack id '/default-rack'就任意ip的返回值。然而,这样的结果看起来一点也不理想,它可能会导致块同步问题(译注:大家一个rack,写入那里无所谓,所以可能性能和容错都会存在一些问题)。
译注:以上几个参数都是在core-site.xml中配置的
原文,给出了两个例子,一个是python,一个是bash
------------------------
-- python
------------------------
#!/usr/bin/python
# this script makes assumptions about the physical environment.
# 1) each rack is its own layer 3 network with a /24 subnet, which
# could be typical where each rack has its own
# switch with uplinks to a central core router.
#
# +-----------+
# |core router|
# +-----------+
# / \
# +-----------+ +-----------+
# |rack switch| |rack switch|
# +-----------+ +-----------+
# | data node | | data node |
# +-----------+ +-----------+
# | data node | | data node |
# +-----------+ +-----------+
#
# 2) topology script gets list of IP's as input, calculates network address, and prints '/network_address/ip'.
import netaddr
import sys
sys.argv.pop(0) # discard name of topology script from argv list as we just want IP addresses
netmask = '255.255.255.0' # set netmask to what's being used in your environment. The example uses a /24
for ip in sys.argv: # loop over list of datanode IP's
address = '{0}/{1}'.format(ip, netmask) # format address string so it looks like 'ip/netmask' to make netaddr work
try:
network_address = netaddr.IPNetwork(address).network # calculate and print network address
print "/{0}".format(network_address)
except:
print "/rack-unknown" # print catch-all value if unable to calculate network address
------------------------
-- bash
------------------------
#!/bin/bash
# Here's a bash example to show just how simple these scripts can be
# Assuming we have flat network with everything on a single switch, we can fake a rack topology.
# This could occur in a lab environment where we have limited nodes,like 2-8 physical machines on a unmanaged switch.
# This may also apply to multiple virtual machines running on the same physical hardware.
# The number of machines isn't important, but that we are trying to fake a network topology when there isn't one.
#
# +----------+ +--------+
# |jobtracker| |datanode|
# +----------+ +--------+
# \ /
# +--------+ +--------+ +--------+
# |datanode|--| switch |--|datanode|
# +--------+ +--------+ +--------+
# / \
# +--------+ +--------+
# |datanode| |namenode|
# +--------+ +--------+
#
# With this network topology, we are treating each host as a rack. This is being done by taking the last octet
# in the datanode's IP and prepending it with the word '/rack-'. The advantage for doing this is so HDFS
# can create its 'off-rack' block copy.
# 1) 'echo $@' will echo all ARGV values to xargs.
# 2) 'xargs' will enforce that we print a single argv value per line
# 3) 'awk' will split fields on dots and append the last field to the string '/rack-'. If awk
# fails to split on four dots, it will still print '/rack-' last field value
echo $@ | xargs -n 1 | awk -F '.' '{print "/rack-"$NF}'
总结:
网络拓扑如何设计,无论在哪个集群中,都是需要密切关注的
构建高可靠hadoop集群之2-机栈的更多相关文章
- 构建高可靠hadoop集群之3- Quorum Journal Manager
在正式环境中,搭建高可靠(ha)的系统是必须的. 例如oralce的rac,apache集群,windows服务器集群 本文不再赘言ha的重要性. 本文主要是对 http://hadoop.apach ...
- 构建高可靠hadoop集群之0-hadoop用户向导
本文翻译自:http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html 基于2.8. ...
- 构建高可靠hadoop集群之4-保全模式
本文主要翻译自http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/SecureMode.html 译注:之所以 ...
- 构建高可靠hadoop集群之1-理解hdfs架构
本文主要参考 http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html 主要内容是对该文 ...
- 构建高可靠hadoop集群之5-服务级别授权
本人翻译自: http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/ServiceLevelAuth.html ...
- 构建高可靠hadoop集群之4-权限指引
此文翻译自http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html ...
- Dubbo+zookeeper构建高可用分布式集群(二)-集群部署
在Dubbo+zookeeper构建高可用分布式集群(一)-单机部署中我们讲了如何单机部署.但没有将如何配置微服务.下面分别介绍单机与集群微服务如何配置注册中心. Zookeeper单机配置:方式一. ...
- .net core下简单构建高可用服务集群
一说到集群服务相信对普通开发者来说肯定想到很复杂的事情,如zeekeeper ,反向代理服务网关等一系列的搭建和配置等等:总得来说需要有一定经验和规划的团队才能应用起来.在这文章里你能看到在.net ...
- 构建高可用ZooKeeper集群
ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分布式基础服务.由于 Zo ...
随机推荐
- Spring课程 Spring入门篇 4-5 Spring bean装配之基于java的容器注解说明--@Bean
1 解析 2.1 @bean注解定义 2.2 @bean注解的使用 2 代码演练 2.1 @bean的应用不带name 2.2 @bean的应用带name 2.3 @bean注解调用initMet ...
- 前端如何使用proxyTable和nginx解决跨域问题
最近经常遇到跨域的问题,有时候问题虽然解决了,但是还是会有些模棱两可概念不清,于是在网上看了一些教程结合实际使用,做个笔记. 1.跨域原因 浏览器的限制 跨域(协议/域名/端口的不同) XMLHttp ...
- caffe-windows之彩色图像分类例程cifar10
一.caffe-windows之彩色图像分类例程cifar10 训练测试网络模型[参考1][参考2] 1. 准备数据 下载二进制数据集数据集,下载链接为http://www.cs.toronto.ed ...
- <form> 标签的 enctype 属性
值 描述 application/x-www-form-urlencoded 在发送前编码所有字符(默认) multipart/form-data 不对字符编码.在使用包含文件上传控件的表单时,必须使 ...
- JSP初学者5
JSP中include指令和include动作的区别 include指令是编译阶段的指令,即include所包含的文件的内容是编译的时候插入到JSP文件中, JSP引擎在判断JSP页面未被修改,否则 ...
- matlab练习程序(Arnold图像置乱)
自从上次写了Hilbert图像置乱之后,就对图像置乱研究了一下,发现这里面也是有很多置乱算法的. Arnold也算一种比较主要的置乱算法,算法由以下变换公式产生: 这里a和b是参数,n是迭代次数,N是 ...
- AMOLED原理介紹
1. OLED发光原理 OLED(Organic Light Emitting Display,有机发光显示器)是指有机半导体材料在电场驱动下,通过载流子注入和复合导致发光的现象.其基本原理是用ITO ...
- jQuery Event.stopImmediatePropagation() 函数详解
stopImmediatePropagation()函数用于阻止剩余的事件处理函数的执行,并防止当前事件在DOM树上冒泡. 根据DOM事件流机制,在元素上触发的大多数事件都会冒泡传递到该元素的所有祖辈 ...
- IE浏览器下 Vue2.x 和 Angular 应用无法打开
报错信息:SCRIPT5022: 引发了异常但未捕获 polyfills.bundle.js (861,36) 原因是es6报错,需要引用 polyfill. Vue项目中,$ npm install ...
- February 25 2017 Week 8 Saturday
Energy and persistence can conquer all things. 能量和毅力可以征服一切. I have the persistence, but it seems I a ...