最近处理的数据越来越复杂,互联网上很火的Hadoop久闻盛名,想去学习一下。按照网上的例子配置了一番,老是出错误。但是正因为这个错误,才引发出对Hadoop集群管理的话题。
先说一下我的实验环境。我准备了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集群中的机器名不仅不能包含下划线,点也不可以。(关于这个问题,我看到了一篇文章:,文中提到:“虽然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
既然减号,可以使用,在大规模集群中我们可以这样划分:
集群:针对不同的任务,我们可以使用不同的集群,后期还可以根据复杂度对该集群进行伸缩控制。简称c,cluster
机架:在机房中,服务器都会放到机架当中,像一个大衣柜一样,一层一层堆叠着符合工业标准尺寸的服务器。简称r,rack
筐位:这个主要是针对刀片式服务器,在同一个机架中我们放置若干个刀片筐,用来承载刀片服务器。简称f,frame
槽位:这个也是针对刀片式服务器,在同一个刀片筐中可以放置若干个刀片服务器,每一个放置的位置称之为槽位。简称s,slot
在Hadoop集群优化中我们知道,从配置中体现网络拓扑结构,可以让集群自动优先选择同一机架中的机器协同工作,这样减少不同机架间的网络IO,提高效率。而网络规划中必不可少的就是对机器命名的管理。我们要从机器名中就能判断出它所在的位置。无论是性能优化的角度,还是从硬件维护的角度来说都是有益的。
因此我们不妨对Hadoop集群中的机器进行如下命名:
hadoop-c-[集群编号]-r-[机架编号]-f-[筐位编号]-s-[槽位编号]
例如:
hadoop-c-0-r-0-f-0-s-0
这就表示这台机器属于0号集群,在0号机架上0号筐位的0槽位上。是不是很容易定位?
在实验环境中,我们使用“修改/etc/hosts文件”的方式来手工绑定机器名和ip地址。这样做的缺点是一旦一台机器做出改动之后,要对群集中所有机器的hosts文件进行同步更新。这对于大型集群来说简直是一场噩梦。我们可以使用专门的DNS服务器来管理这些机器。只要所有的节点使用相同的DNS服务器,在主机更改时只需要修改DNS服务器即可。
写在最后:
其实个人觉得只要能让A主机找到B主机即可。我们往往将hosts文件中,IP对应的主机名称和/etc/sysconfig/network的HOSTNAME属性设置成一致的,这是一种习惯。然而实际上我们完全可以设置成不一样的。拿我们刚才实验环境中的例子。在/etc/sysconfig/network中设置的HOSTNAME属性为hadoop_1(这里面有下划线),我们完全可以在hosts文件中就指明192.168.1.101指向的机器是hadoop-1(注意,这里用的是减号),在我们配置Hadoop的时候,一律使用hadoop-1这样的名称即可。
相关阅读:
Ubuntu 13.04上搭建Hadoop环境