edhat 5.4部署完全分布多节点Hadoop集群

多节点集群Hadoop平台的搭建部署是建立在前面所说的单节点Hadoop的基础上的,其搭建操作主要集中在master主机上,slave主机中只做很少的修改就好了。
一、 单节点的搭建
参照前面的文档在主机上首先实现单节点的搭建。并将单节点的虚拟机文件拷贝到每个要做节点的主机相应的目录上。这主要是保证每个节点的配置完全相同。
二、 有关网络的一些配置
在搭建过程中,首先联网一定要保证主机ip是固定的,无所谓使用的是无线网络还是有线网络。对于无线网络,可以使用手动指定ip的方式保证ip的固定。虚拟机与物理主机的联网采用桥接方式。我们实验过程中master主机和slave1主机采用有线连接,slave2采用无线连接。
1. 更改主机名
集群中相互通信的主机的名称不能一样,即使他们的ip不一样,也会引起不必要的麻烦。举例这里有三台主机,一台做master和slave,另外两台分别做slave1和slave2,那我们就可以将他们的主机名分别设置为master、slave1和slave2。不过在这次试验中master主机还同时是slave。如果有更多的slave,则可以为他们取更多的名称,但最好做到有联系也有区别。
修改主机名的方法可以用hostname <newname>命令来完成。如
在master主机上:
[hadoop@localhost ~]$ hostname
localhost.localdomain
[hadoop@localhost ~]$ su
口令:
[root@localhost ~]$ hostname master
[root@localhost ~]$ hostname
Master
在slave1主机上:
[hadoop@localhost ~]$ su
口令:
[root@localhost ~]$ hostname slave1
[root@localhost ~]$ hostname
slave1
在slave2主机上:
[hadoop@localhost ~]$ su
口令:
[root@localhost ~]$ hostname slave2
[root@localhost ~]$ hostname
Slave2
但这样的修改时临时的,在下次启动时就会恢复原来的主机名。
要想永久的修改主机名,需要修改相关的配置文件。
man hostname里有这么一句话,"The host name is usually set once at system startup in /etc/rc.d/rc.inet1 or /etc/init.d/boot (normally by reading the contents of a file which contains the host name, e.g. /etc/hostname)." RedHat里没有这个文件,而是由/etc/rc.d/rc.sysinit这个脚本负责设置系统的hostname,它读取/etc /sysconfig/network这个文本文件,RedHat的hostname就是在这个文件里设置。
所以,如果要永久修改RedHat的hostname,就修改/etc/sysconfig/network文件,将里面的HOSTNAME这一行修改成HOSTNAME=NEWNAME,其中NEWNAME就是你要设置的hostname。




之后重新启动就永久的修改了hostname
Debian发行版的hostname的配置文件是/etc/hostname。
修该配置文件后,重启系统就会读取配置文件设置新的hostname。
hostname与/etc/hosts的关系
很过人一提到更改hostname首先就想到修改/etc/hosts文件,认为hostname的配置文件就是/etc/hosts。其实不是的。
hosts文件的作用相当如DNS,提供IP地址到hostname的对应。早期的互联网计算机少,单机hosts文件里足够存放所有联网计算机。 不过随着互联网的发展,这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。具体可以man hosts。
Linux系统在向DNS服务器发出域名解析请求之前会查询/etc/hosts文件,如果里面有相应的记录,就会使用hosts里面的记录。/etc/hosts文件通常里面包含这一条记录
127.0.0.1 localhost.localdomain localhost
hosts文件格式是一行一条记录,分别是IP地址 hostname aliases,三者用空白字符分隔,aliases可选。
修改hostname后,如果想要在本机上用newhostname来访问,就必须在/etc/hosts文件里添加一条newhostname的记录。比如我的eth0的IP是192.168.1.61,我将hosts文件修改如下:
[hadoop@localhost ~]$ hostname blog.infernor.net
[hadoop@localhost ~]$ cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.1.61 blog.infernor.net blog
这样,就可以通过blog或者blog.infernor.net来访问本机。
从上面这些来看,/etc/hosts于设置hostname是没直接关系的,仅仅当你要在本机上用新的hostname来访问自己的时候才会用到/etc/hosts文件。两者没有必然的联系。
RHEL还有个问题。
开始在测试的时候,只修改/etc/hosts,里面添加 192.168.1.61 blog.infernor.net blog,而/etc/sysconfig/network维持原状,也就是里面的HOSTNAME=localhost.localdomain。重 启系统后居然发现hostname给修改成了blog.infernor.net。这样看的话,倒真觉得/etc/hosts是hostname的配置文 件。后来终于在/etc/rc.d/rc.sysinit这个启动脚本里发现了问题的所在。
rc.sysinit文件里一开始就设置了hostname
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
HOSTNAME=localhost
fi
确实使用了/etc/sysconfig/network里的hostname值。不过后面还有一段关于设置hostname的
ipaddr=
if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]
; then
ipaddr=$(ip addr show to 0/0 scope global | awk '/[[:space:]]inet
/ { print gensub("/.*","","g",$2) }')
if [ -n "$ipaddr" ]; then
eval $(ipcalc -h $ipaddr 2>/dev/null)
hostname ${HOSTNAME}
fi
fi
脚本判断hostname是否为localhost或者localhost.localdomain,如果是的话,将会使用接口IP地址对应的 hostname来重新设置系统的hostname。问题就出在这里,我的/etc/sysconfig/network默认的hostname是 localhost.localdomain,eth0的IP是192.168.1.61,而/etc/hosts里有192.168.1.61的记录。 于是就用192.168.1.61这条记录来替换了hostname。
估计这也是很多人将/etc/hosts误以为是hostname的配置文件的原因。
2.更改网络接口
使用ifconfig命令查看虚拟机ip地址。我们实验的时候三台主机的ip分别是192.168.1.115(slave1),192.168.1.116(slave2),192.168.1.110(master)。
在所有的master、slave1和slave2主机上修改/etc/hosts文件,将master、slave1和slave2及他们的对应ip加进去
127.0.0.1到localhost,很多应用程序会用到这个,比如sendmail,修改之后这些程序可能就无法正常运行。但一般不影响Hadoop使用的服务可以关掉,比如sendmail。将master、slave1和slave2及他们的对应ip加进去
3.防火墙设置
关闭物理机和虚拟机上的所有对网络访问控制服务,主要是防火墙等。否则会影响主机之间的通信。(针对这样的设置引起的安全问题,还有待研究。现在最好测出为两台虚拟主机之间的通信而牺牲的最小主机安全设置)
[root@master ~]# service iptables stop
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
[root@slave1 ~]# service iptables stop
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
[root@slave2 ~]# service iptables stop
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
三、 主机间通过ssh的互信通信设置
[hadoop@master~]$ scp authorized_keys 192.168.1.115:/home/username/.ssh
[hadoop@master~]$cat id_dsa.pub >>authorized_keys
[hadoop@master~]$chmod 644 authorized_keys
[hadoop@slave1~]$chmod 644 authorized_keys
[hadoop@master~]$ scp authorized_keys 192.168.1.116:/home/username/.ssh
[hadoop@master~]$cat id_dsa.pub >>authorized_keys
[hadoop@master~]$chmod 644 authorized_keys
[hadoop@slave2~]$chmod 644 authorized_keys
之后在master端ssh slave1或slave2,一开始可能会因为不识别而发出连接警告,问你是否仍要连接,输入yes后,就会提示将所连接的主机及对应ip等信息记录到/home/hadoop/.ssh/known_hosts文件中,在下次在连接的时候就不会在提示警告了。
如果这样可以在master或slave1或slave2主机上通过ssh <otherhostname or ips>就可以无密码登录到目的主机,就算配置成功了。
配好ssh之后,一定要/sbin/ifconfig确认现在的环境是在本机上,因为不断的ssh后,可能环境已经在其他主机上了
四、 hadoop中相关的配置(所有机器上)
1. conf/master&slaves的设置
更新conf/masters 中的内容为
master
conf/slaves 内容改为
master #这里master 也作slave 用,因为只有两台机器
slave1
slave2
如果有更多的slave机器可以把他们都添加进来
2.conf/core-site.xml的修改
更改fs.default.name变量,它指定了namenode的主机和端口
<property>
<name>fs.default.name</name>
<value>hdfs://master:54310</value>
<description>The name of the default file system. A URI whose
scheme and authority determine the FileSystem implementation. The
uri's scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class. The uri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>
3.conf/hdfs-site.xml的修改
更新dfs.replication 变量,它指定了默认的复制份数,即它确定了一个文件可用之前在机台机器上被复制。如果它的值大于slave机的数量,你会看到许多错误。这里我们改为3
<property>
<name>dfs.replication</name>
<value>3</value>
<description>Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
</description>
</property>
4.conf/mapred-site.xml的修改
更新mapred.job.tracker,该变量指定了JobTracker主机和端口
<property>
<name>mapred.job.tracker</name>
<value>master:54311</value>
<description>The host and port that the MapReduce job tracker runs
at. If "local", then jobs are run in-process as a single map
and reduce task.
</description>
</property>
五、 格式化hdfs和启动集群
[hadoop@master hadoop-0.20.2]$ bin/hadoop namenode -format
10/04/25 00:07:44 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = master/192.168.1.110
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 0.20.2
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20 -r 911707; compiled by 'chrisdo' on Fri Feb 19 08:07:34 UTC 2010
************************************************************/
10/04/25 00:07:44 INFO namenode.FSNamesystem: fsOwner=hadoop,hadoop
10/04/25 00:07:44 INFO namenode.FSNamesystem: supergroup=supergroup
10/04/25 00:07:44 INFO namenode.FSNamesystem: isPermissionEnabled=true
10/04/25 00:07:44 INFO common.Storage: Image file of size 96 saved in 0 seconds.
10/04/25 00:07:44 INFO common.Storage: Storage directory /home/hadoop/name has been successfully formatted.
10/04/25 00:07:44 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/192.168.1.110
************************************************************/
如果现实successfully formatted,就应该没问题了。
[hadoop@master hadoop-0.20.2]$bin/start-all.sh 启动Hadoop集群
starting namenode, logging to /home/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-namenode-master.out
master: starting datanode, logging to /home/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-datanode-master.out
slave2: starting datanode, logging to /home/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-datanode-slave2.out
slave1: starting datanode, logging to /home/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-datanode-slave1.out
master: starting secondarynamenode, logging to /home/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-secondarynamenode-master.out
starting jobtracker, logging to /home/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-jobtracker-master.out
master: starting tasktracker, logging to /home/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-tasktracker-master.out
slave2: starting tasktracker, logging to /home/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-tasktracker-slave2.out
slave1: starting tasktracker, logging to /home/hadoop/hadoop-0.20.2/bin/../logs/hadoop-hadoop-tasktracker-slave1.out
六、 集群测试和实例运行
1. Jps
Master主机上:[hadoop@master hadoop-0.20.2]$ jps
16017 Jps
14799 NameNode
15686 TaskTracker
14880 DataNode
15596 JobTracker
14977 SecondaryNameNode
Slave主机上:[hadoop@slave hadoop-0.20.2]$ jps
15183 DataNode
15897 TaskTracker
16284 Jps
2.-report
[hadoop@master hadoop-0.20.2]$ bin/hadoop dfsadmin -report
Configured Capacity: 129139130368 (120.27 GB)
Present Capacity: 121483997184 (113.14 GB)
DFS Remaining: 121483894784 (113.14 GB)
DFS Used: 102400 (100 KB)
DFS Used%: 0%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Datanodes available: 3 (3 total, 0 dead)
Name: 192.168.1.110:50010
Decommission Status : Normal
Configured Capacity: 14612480000 (13.61 GB)
DFS Used: 53248 (52 KB)
Non DFS Used: 1073176576 (1023.46 MB)
DFS Remaining: 13539250176(12.61 GB)
DFS Used%: 0%
DFS Remaining%: 92.66%
Last contact: Sun Apr 25 00:08:28 PDT 2010
Name: 192.168.1.115:50010
Decommission Status : Normal
Configured Capacity: 57263325184 (53.33 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 3291115520 (3.07 GB)
DFS Remaining: 53972185088(50.27 GB)
DFS Used%: 0%
DFS Remaining%: 94.25%
Last contact: Sun Apr 25 00:08:30 PDT 2010
Name: 192.168.1.116:50010
Decommission Status : Normal
Configured Capacity: 57263325184 (53.33 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 3290841088 (3.06 GB)
DFS Remaining: 53972459520(50.27 GB)
DFS Used%: 0%
DFS Remaining%: 94.25%
Last contact: Sun Apr 25 00:08:30 PDT 2010
3.pi
[hadoop@master hadoop-0.20.2]$ bin/hadoop jar hadoop-0.20.2-examples.jar pi 10 1000
Number of Maps = 10
Samples per Map = 1000
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Wrote input for Map #4
Wrote input for Map #5
Wrote input for Map #6
Wrote input for Map #7
Wrote input for Map #8
Wrote input for Map #9
Starting Job
10/04/25 00:09:30 INFO mapred.FileInputFormat: Total input paths to process : 10
10/04/25 00:09:30 INFO mapred.JobClient: Running job: job_201004242025_0002
10/04/25 00:09:32 INFO mapred.JobClient: map 0% reduce 0%
10/04/25 00:09:50 INFO mapred.JobClient: map 10% reduce 0%
10/04/25 00:09:54 INFO mapred.JobClient: map 30% reduce 0%
10/04/25 00:09:59 INFO mapred.JobClient: map 70% reduce 0%
10/04/25 00:10:05 INFO mapred.JobClient: map 80% reduce 10%
10/04/25 00:10:07 INFO mapred.JobClient: map 100% reduce 10%
10/04/25 00:10:22 INFO mapred.JobClient: map 100% reduce 100%
10/04/25 00:10:25 INFO mapred.JobClient: Job complete: job_201004242025_0002
10/04/25 00:10:25 INFO mapred.JobClient: Counters: 18
10/04/25 00:10:25 INFO mapred.JobClient: Job Counters
10/04/25 00:10:25 INFO mapred.JobClient: Launched reduce tasks=1
10/04/25 00:10:25 INFO mapred.JobClient: Launched map tasks=10
10/04/25 00:10:25 INFO mapred.JobClient: Data-local map tasks=10
10/04/25 00:10:25 INFO mapred.JobClient: FileSystemCounters
10/04/25 00:10:25 INFO mapred.JobClient: FILE_BYTES_READ=226
10/04/25 00:10:25 INFO mapred.JobClient: HDFS_BYTES_READ=1180
10/04/25 00:10:25 INFO mapred.JobClient: FILE_BYTES_WRITTEN=826
10/04/25 00:10:25 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=215
10/04/25 00:10:25 INFO mapred.JobClient: Map-Reduce Framework
10/04/25 00:10:25 INFO mapred.JobClient: Reduce input groups=20
10/04/25 00:10:25 INFO mapred.JobClient: Combine output records=0
10/04/25 00:10:25 INFO mapred.JobClient: Map input records=10
10/04/25 00:10:25 INFO mapred.JobClient: Reduce shuffle bytes=280
10/04/25 00:10:25 INFO mapred.JobClient: Reduce output records=0
10/04/25 00:10:25 INFO mapred.JobClient: Spilled Records=40
10/04/25 00:10:25 INFO mapred.JobClient: Map output bytes=180
10/04/25 00:10:25 INFO mapred.JobClient: Map input bytes=240
10/04/25 00:10:25 INFO mapred.JobClient: Combine input records=0
10/04/25 00:10:25 INFO mapred.JobClient: Map output records=20
10/04/25 00:10:25 INFO mapred.JobClient: Reduce input records=20
Job Finished in 56.086 seconds
Estimated value of Pi is 3.14080000000000000000
七、 关于集群节点扩展
针对多节点集群扩展可以将新加的节点按照上面的配置进行操作,完成后删除各节点主目录下的data、temp、tmp、name等文件,重新格式化即可。
八、配置过程中关键遇到的问题和总结
1.问题
A: 如果看到错误java.io.IOException: Incompatible namespaceIDs in the logs of a datanode (<HADOOP_INSTALL>/logs/hadoop-hadoop-datanode-<HOSTNAME>.log), 很可能是因为你遇到了 HADOOP-1212 这个bug.
... ERROR org.apache.hadoop.dfs.DataNode: java.io.IOException: Incompatible namespaceIDs in /usr/local/hadoop-datastore/hadoop-hadoop/dfs/data: namenode namespaceID = 308967713; datanode namespaceID = 113030094
at org.apache.hadoop.dfs.DataStorage.doTransition(DataStorage.java:281)
at org.apache.hadoop.dfs.DataStorage.recoverTransitionRead(DataStorage.java:121)
at org.apache.hadoop.dfs.DataNode.startDataNode(DataNode.java:230)
at org.apache.hadoop.dfs.DataNode.<init>(DataNode.java:199)
at org.apache.hadoop.dfs.DataNode.makeInstance(DataNode.java:1202)
at org.apache.hadoop.dfs.DataNode.run(DataNode.java:1146)
at org.apache.hadoop.dfs.DataNode.createDataNode(DataNode.java:1167)
at org.apache.hadoop.dfs.DataNode.main(DataNode.java:1326)
解决方案
1. 停止集群
2. 删除conf/hadoop-site.xml中dfs.data.dir指定目录中的data目录,比如/your/path/to/hadoop/tmp/dir/hadoop-hadoop/dfs/data
3. 重新格式化集群文件系统.
B. [hadoop@localhost ~]$ ifconfig
bash: ifconfig: command not found
解决方案:
[hadoop@localhost ~]$ /sbin/ifconfig 这样使用
或修改/etc/profile文件

# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
fi
改为
# Path manipulation
#if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
#fi
然后重启或用source命令使配置修改生效即可。
C.namenode格式化成功后,slave1或slave2主机上运行jps没有datanode或tasktracker进程。
解决方案:查看问题主机上/home/hadoop/hadoop-0.20.2/logs中的hadoop-hadoop-datanode-slave1.log日志,发现有no rout to host异常。
原因是当时我们的master主机虚拟机防火墙没有关闭。关闭后就好了。
D.修改主机后重启虚拟机,在sendmail处卡住或根本无法启动
解决方案:
需要关闭sendmail服务,则:/etc/rc.d/init.d/sendmail stop 停止服务
然后再设置其不在系统启动时启动:chkconfig --levels 12345 sendmail off 关闭其端口
2.总结
这次试验总体成功。但也暴露出一些问题有待解决。
A. 使用了一台性能较高的台机做master,因为从配置到应用,对master的要求很高,而且整个平台的稳定性也在于master,这方面台机较笔记本有更好的优势。
B. 应该针对我们所用的功能对RedHat进行瘦身(主要指关闭一些不必要的服务和开机启动程序等),以减小多资源不必要的浪费,解决启动慢、运行慢等问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值