Hadoop基础-网络拓扑机架感知及其实现

摘要:
否则,将追究法律责任。I网络拓扑在本地网络中,两个节点被称为“邻居”意味着什么?在海量数据处理中,主要的限制因素是节点之间的数据传输速率,即带宽稀缺。事实上,不测量节点之间的带宽是很难实现的。Hadoop为此采用了一种简单的方法:将网络视为一棵树,两个节点之间的距离是它们到最近的共同祖先的距离之和。树中的层次结构不是预先设置的,但可以相对于数据中心、机架和运行节点进行设置。

                      Hadoop基础-网络拓扑机架感知及其实现

                                          作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.网络拓扑结构

   在本地网络中,两个节点被称为“彼此近邻”是什么意思?在海量数据处理中,其主要限制因素是节点之间数据的传输速率,即带宽稀缺。这里的想法是将两个节点之间的带宽作为距离的衡量标准。不用衡量节点之间的带宽,实际上很难实现(它需要一个稳定的集群,并且在集群中两两节点对数量是节点数量的平方),hadoop为此采用了一个简单的方法:把网络看作一棵树,两个节点之间的距离是他们到最近共同祖先的距离总和。该树中的层次是没有预先设定的, 但是相对与数据中心,机架和正在运行的节点,通常可以设定等级。具体想法是针对以下每个常见,可用带宽依次递减:

    1>.同一节点上的进程;

    2>.同一机架上的不同节点;

    3>.同一数据中心中不同机架上的节点;

    4>.不同数据中心的节点‘

  举个例子,假设有数据中心d1,机架r1中的节点n1。该节点可以表示为“/d1/r1/n1”。利用这种标记,这里给出四种距离描述:

    1>.distance(/d1/r1/n1,/d1/r1/n1)=0(同一节点上的进程);

    2>.distance(/d1/r1/n1,/d1/r1/n2)=2(同一机架上的不同节点);

    3>.distance(/d1/r1/n1,/d1/r2/n3)=4(同一数据中心中不同机架上的节点);

    4>.distance(/d1/r1/n1,/d2/r3/n4)=6(不同数据中心中的节点);

 Hadoop基础-网络拓扑机架感知及其实现第1张

   上图摘自《Hadoop权威指南第四版》。我们必须要意识到Hadoop无法自动发现你的网络拓扑结构。它需要一些帮助,不过在默认情况下,假设网络是扁平化的只有一层,换句话说,所有节点在同一数据中心的同一机架上。规模小的集群可能如此,不需要进一步配置。

二.机架感知

   机架感知可以通过python和shell实现,详情请参考官方文档的案例:http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/RackAwareness.html。由于Hadoop是Java语言写的,因此本篇博客主要使用Java代码实现机架感知。在机架感知中,接受的数据(参数)是一个包含所有节点的ip或主机名的List,返回的数据也是一个List,是拓扑距离的list。

1>.编写机架感知自定义逻辑代码

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.hdfs;
 7 
 8 import org.apache.hadoop.net.DNSToSwitchMapping;
 9 import java.util.ArrayList;
10 import java.util.List;
11 /**
12  *hadoop副本放置策略:(3副本情况)
13  *      1、在本地机架的一个节点放置一个副本    s101-s103    rack1
14  *      2、在其他机架的两个结点放置两个副本    s104-s105    rack2
15  */
16 public class RackAware implements DNSToSwitchMapping {
17     public List<String> resolve(List<String> names) {
18         List<String> list = new ArrayList<String>();
19         for(String name : names){
20             Integer suffix = 0;
21             /**
22              * 第一种情况: names是主机名
23              */
24             if(name.startsWith("s")){
25                 //将s101变为101
26                 suffix = Integer.parseInt(name.substring(1));
27             }
28             /**
29              * 第二种情况:names是ip
30              */
31             else {
32                 suffix = Integer.parseInt(name.substring(name.lastIndexOf(".") + 1));
33             }
34             /**
35              *  我们的策略是主机位大于103的就放在第一个机会上,即"/rack1",否则就放在第二个机柜上上,即"/rack2"
36              */
37             if(suffix <= 103){
38                 // /rack1/s102
39                 list.add("/rack1");
40             }
41             else {
42                 // /rack2/s105
43                 list.add("/rack2");
44             }
45         }
46         return list;
47     }
48     /**
49      * 下面的两个方法空实现即可。不用搭理它们,咱们这里用不到他们两个方法
50      */
51     public void reloadCachedMappings() {}
52     public void reloadCachedMappings(List<String> names) {}
53 }

2>.打包并上传至服务器端的/soft/hadoop/share/hadoop/common/lib目录下

 Hadoop基础-网络拓扑机架感知及其实现第2张

3>.修改配置文件

Hadoop基础-网络拓扑机架感知及其实现第3张

4>.分发配置文件

[yinzhengjie@s101 ~]$ more `which xrsync.sh`
#!/bin/bash
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie
#EMAIL:y1053419035@qq.com

#判断用户是否传参
if [ $# -lt 1 ];then
    echo "请输入参数";
    exit
fi


#获取文件路径
file=$@

#获取子路径
filename=`basename $file`

#获取父路径
dirpath=`dirname $file`

#获取完整路径
cd $dirpath
fullpath=`pwd -P`

#同步文件到DataNode
for (( i=102;i<=105;i++ ))
do
    #使终端变绿色 
    tput setaf 2
    echo =========== s$i %file ===========
    #使终端变回原来的颜色,即白灰色
    tput setaf 7
    #远程执行命令
    rsync -lr $filename `whoami`@s$i:$fullpath
    #判断命令是否执行成功
    if [ $? == 0 ];then
        echo "命令执行成功"
    fi
done
[yinzhengjie@s101 ~]$ 
[yinzhengjie@s101 ~]$ xrsync.sh /soft/hadoop/etc/hadoop/core-site.xml 
=========== s102 %file ===========
命令执行成功
=========== s103 %file ===========
命令执行成功
=========== s104 %file ===========
命令执行成功
=========== s105 %file ===========
命令执行成功
[yinzhengjie@s101 ~]$ xrsync.sh /soft/hadoop/etc/hadoop/slaves 
=========== s102 %file ===========
命令执行成功
=========== s103 %file ===========
命令执行成功
=========== s104 %file ===========
命令执行成功
=========== s105 %file ===========
命令执行成功
[yinzhengjie@s101 ~]$
[yinzhengjie@s101 ~]$ xrsync.sh /soft/hadoop/share/hadoop/common/lib/MyHbase-1.0-SNAPSHOT.jar 
=========== s102 %file ===========
命令执行成功
=========== s103 %file ===========
命令执行成功
=========== s104 %file ===========
命令执行成功
=========== s105 %file ===========
命令执行成功
[yinzhengjie@s101 ~]$ 

5>.启动HDFS并查看NameNode日志

Hadoop基础-网络拓扑机架感知及其实现第4张

免责声明:文章转载自《Hadoop基础-网络拓扑机架感知及其实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇时钟代码ubuntu下制作桌面启动图标(windows下的快捷方式)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

go 二进制数据处理

以下是利用标准库binary来进行编解码 编码 ①使用bytes.Buffer来存储编码生成的串②使用binary.Write来编码存储在①的buf中 package main import ( "bytes" "encoding/binary" "fmt" ) func main() { var pi float64...

python数据处理的常用操作

python数据处理 1.生成数据2.数据表检查3.数据表清洗4.数据预处理5.数据提取6.数据筛选7.数据汇总8.数据统计9.数据输出 1.生成数据 1.导入数据表 df=pd.read_excel('C:/Users/Admin/Desktop/types/output.xlsx')df1=pd.read_csv('C:/Users/Admin/...

spark程序设计

Spark程序设计—创建RDD:从Scala集合构造成RDD parallelize(a, 3) makeRDD(a, 3) 他俩使用方式一样,只不过名字不一样 Spark程序设计—创建RDD:本地文件/HDFS textFile(path, 100) sequenceFile wholeTextFiles 举例: 1. 文本文件(TextInputFor...

Hadoop中JournalNode的作用

NameNode之间共享数据(NFS 、Quorum Journal Node(用得多)) 两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,...

Hadoop Sentry 学习

什么是Sentry?          Sentry 是Cloudera 公司发布的一个Hadoop开源组件,它提供细粒度基于角色的安全控制 Sentry下的数据访问和授权         通过引进Sentry,Hadoop目前可在以下方面满足企业和政府用户的RBAC(role-based acess control)需求: 安全授权:Sentry可以控制...

hadoop2升级的那点事情(详解)

前言 前阵子,公司的hadoop从hadoop1.02升级到hadoop2.4.1,记录下升级的步骤和遇到的问题,和大家分享,希望别人可以少走一些弯路 技术选型 当前使用版本:apache hadoop 1.0.2hive 0.10升级目标版本Apache hadoop 2.4.1Hive 0.13 升级风险点 Hdfs的升级Hadoop升级最主要是hdf...