从主机名谈真实Hadoop集群与虚拟机集群管理

版权声明:本文为博主原创文章,更多博文请访问:http://blog.csdn.net/chaijunkun,未经博主允许不得转载。 https://blog.csdn.net/chaijunkun/article/details/23283431

本文出处:http://blog.csdn.net/chaijunkun/article/details/23283431,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。


随着大数据的普及,Hadoop应用也越来越广泛,然而不断扩展的节点数量对运维管理也提出了更高要求。本文围绕对主机名的配置这一主题来探讨集群的管理,旨在探讨一种可行的Hadoop集群管理方法。


1.主机命名,有可为有可不为


为什么要在开篇说这个呢?这来源于做实验时遇到的第一个问题,为了避免有人走同样的弯路,先写下来。我的实验环境准备了4台虚拟机:

IP地址 机器名(hostname) 作用
192.168.1.101 hadoop_1 NameNode
192.168.1.102 hadoop_2 SecondaryNameNode
192.168.1.103 hadoop_3 DataNode-1
192.168.1.104 hadoop_4 DataNode-2

当我对NameNode进行格式化后,执行start-all,发现java进程没有启动成功(jps发现无任何进程),于是去查看日志,得到了下面的异常信息:

ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: java.lang.IllegalArgumentException: Does not contain a valid host:port authority: hdfs://hadoop_1:9000

后来搜索这个问题,原来不止我一个人遇到,就是因为主机名中不能含有下划线“_”,后来我尝试了将hostname中的下划线改成点“.”,发现问题依旧。也就是说, Hadoop集群中的机器名不仅不能包含下划线,点也不可以。(关于这个问题,我看到了一篇文章: http://blog.iamzsx.me/show.html?id=54001,文中提到:“ 虽然linux支持一些特殊字符,但java里面并不支持”,至于他后面说的“点”可以,我这边实验的是不可以的)

常用的分隔符都不行,我们如何管理这些机器呢?要知道,这只是一个实验环境。到了真正的生产环境,也许你将会面对几十上百,甚至上千节点。后来没办法,尝试使用“减号”来分隔,将所有的机器名都换成如下形式:

IP地址 机器名(hostname)
192.168.1.101 hadoop-1
192.168.1.102 hadoop-2
192.168.1.103 hadoop-3
192.168.1.104 hadoop-4

此时运行start-all.sh后终于正常了:

[hduser@hadoop-1 bin]$ jps
1292 NameNode
1498 JobTracker
1438 SecondaryNameNode
1587 Jps

2.茫茫机海,我有GPS


你曾亲自参观过机房吗?有没有被一排排一层层的机器所震撼?让我们先脑补一下机房的样子,然后对应下面的概念:

集群:针对不同的任务、不同的机房区域,我们可以把所属于同一类的一大组机器作为集群,他们之间是要相互紧密协作的,因此我们把这些机器编组。简称g,group

机柜/机架:在机房中,我们能直接看到的一个个像大衣柜一样的东西就是机柜了,简称:c或r,cabinet / rack

机器位/筐位:机柜的尺寸都符合一定的工业标准,像楼层划分那样,由下至上堆叠楼层位置。至于框位这个称呼是针对刀片服务器来说的,一个刀片框中可以容纳多台刀片服务器,在密集计算中应用比较多。简称:f,floor / frame

槽位:这个也是针对刀片式服务器,在同一个刀片筐中可以放置若干个刀片服务器,每一个放置的位置称之为槽位。简称s,slot

根据上述概念的组合,我们就可以在一个较大规模的集群中很方便地找到一台机器的位置了。Hadoop集群也是从算法上保证了优先选择同一机架中的机器协同工作,这样减少不同机架间的网络IO,提高效率。而网络规划中必不可少的就是对机器命名的管理。我们要从机器名中就能判断出它所在的位置。无论是性能优化的角度,还是从硬件维护的角度来说都是有益的。

因此我们不妨对Hadoop集群中的机器进行如下命名:

hadoop-g-[集群编号]-r-[机架编号]-f-[筐位编号]-s-[槽位编号]

例如:

hadoop-g-0-r-0-f-0-s-0

这就表示这台机器属于0号集群,在0号机架上0号筐位的0槽位上。是不是很容易定位?


3.Hadoop集群中真的要去改hosts吗?


在实验环境中,我们使用“修改/etc/hosts文件”的方式来手工绑定机器名和ip地址。这样做的缺点是一旦一台机器做出改动之后,要对群集中所有机器的hosts文件进行同步更新。这对于大型集群来说简直是一场噩梦。我们可以使用专门的DNS服务器来管理这些机器。只要所有的节点使用相同的DNS服务器,在主机更改时只需要修改DNS服务器即可,而且DNS也可以实现高可用。

在实体机上通过开启多个虚拟机来搭建真实的Hadoop集群是非常节省成本的学习方法。然而无论是网上的资料还是培训老师那里,关于IP地址与主机名映射的解决办法都是逐一修改hosts文件。有没有好办法呢?其实,只要修改实体机的hosts文件即可。

以vmware workstation为例,详细步骤如下(注意红框部分):

首先进入虚拟网络适配器:


把虚拟机使用的网卡调整成如下配置,其实Host-Only应该也可以,只是为了方便虚拟机上网,才做成的NAT:


这里把子网配置成192.168.1.0/24(192.168.1.XXX网段,掩码255.255.255.0),然后点右边中间的“NAT设置”


得知内网的网关地址是192.168.1.2。接下来就逐一配置虚拟机IP地址

虚拟机的网络适配器选择为:


再以CentOS 6为例看下网络适配器设置:

DEVICE=eth0
HWADDR=00:0c:29:40:13:75
TYPE=Ethernet
UUID=43370169-e5ef-483d-b24e-4be77ef1cffea
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.1.11
GATEWAY=192.168.1.2
NETMASK=255.255.255.0
DNS设置:

search localdomain
nameserver 192.168.1.2
把所有机器的IP配置好后我们进行规划和命名。最后只改动宿主机的hosts文件:

192.168.1.11    zookeeper1
192.168.1.12    zookeeper2
192.168.1.13    zookeeper3

192.168.1.21    namenode1
192.168.1.22    namenode2

192.168.1.31    datanode1
192.168.1.32    datanode2
192.168.1.33    datanode3
随便找台机器互ping:

[root@datanode3 ~]# ping zookeeper1
PING zookeeper1.localdomain (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=3.17 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.264 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=64 time=0.237 ms

都是通的。至此,配置完毕。


4写在最后:


我们往往将hosts文件中,IP对应的主机名称和/etc/sysconfig/network的HOSTNAME属性设置成一致的,虽然理论上可以写成不一样的,但是在某些时候配置成不一样的会带来额外的麻烦。感兴趣的朋友可以参阅这篇文章,带你看一个因为配置得不一样而引发的麻烦: http://blog.csdn.net/chaijunkun/article/details/44238163

猜你喜欢

转载自blog.csdn.net/chaijunkun/article/details/23283431
今日推荐