最近研究了下公司的hadoop集群并模仿搭建了一个在本地测试使用的hadoop集群。本文介绍下详细的搭建过程以及各种常见问题的处理解决。
1 , 前期准备
1.1 , 准备Linux环境,配置虚拟机网络环境,修改虚拟机IP地址(最好使用第一种配置,简单且不容易出错)
注意,修改之前建议使用 root 管理员权限登陆,这样会避免特别多问题,等集群搭建好之后在用普通用户登陆。
7 台虚拟机ip地址最好整个连号,比如我本地是 192.168.2.201 到 192.168.2.207
1.2 修改主机名和ip的映射关系
vi /etc/hosts
关闭防火墙 service iptables stop
关闭开机自启 chkconfig iptables off
重启虚拟机 reboot
参考
2 , 集群规划
主机名 IP 安装的软件 运行的进程
weekend01 192.168.2.201 jdk hadoop NameNode、DFSZKFailoverController(zkfc)
weekend02 192.168.2.202 jdk hadoop NameNode、DFSZKFailoverController(zkfc)
weekend03 192.168.2.203 jdk hadoop ResourceManager
weekend04 192.168.2.204 jdk hadoop ResourceManager
weekend05 192.168.2.205 jdk hadoop zookeeperDataNode、NodeManager、JournalNode、QuorumPeerMain
weekend06 192.168.2.206 jdk hadoop zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
weekend07 192.168.2.207 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
3 , 安装集群所需要的各个软件
3.1 安装JDK (在第weekend01上安装)
上传jdk压缩包,我用的是jdk7 ,
创建文件夹 mkdir /usr/app
解压 tar -zxvf jdk-7u55-linux-i586.tar.gz -C /usr/app
添加环境变量 vi /etc/profile
在文件最后添加
export JAVA_HOME=/usr/app/jdk-7u_65-i585
export PATH=$PATH:$JAVA_HOME/bin
刷新配置 source /etc/profile
3.2 安装配置 zookeeper (在第weekend05上安装)
上传zookeeper压缩包并解压到 /usr/app文件夹下
修改配置
cd /usr/app/zookeeper-3.4.5/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改:dataDir=/usr/app/zookeeper-3.4.5/tmp
在最后添加:
server.1=weekend05:2888:3888
server.2=weekend06:2888:3888
server.3=weekend07:2888:3888
保存退出
创建一个tmp文件夹
mkdir /usr/app/zookeeper-3.4.5/tmp
再创建一个空文件
touch /usr/app/zookeeper-3.4.5/tmp/myid
最后向该文件写入ID
echo 1 > /usr/app/zookeeper-3.4.5/tmp/myid
配置好的zookeeper拷贝到其他节点(首先分别在weekend06、weekend07根目录下创建一个目录:mkdir /usr/app)
scp -r /usr/app/zookeeper-3.4.5/ weekend06:/usr/app/
scp -r /usr/app/zookeeper-3.4.5/ weekend07:/usr/app/
注意:修改weekend06、weekend07对应/usr/app/zookeeper-3.4.5/tmp/myid内容
weekend06:
echo 2 > /usr/app/zookeeper-3.4.5/tmp/myid
weekend07:
echo 3 > /usr/app/zookeeper-3.4.5/tmp/myid
3.3 安装hadoop (在第weekend01上安装)
上传hadoop压缩包,我用的是2.4版本
同样解压到 /usr/app文件夹下面 将hadoop添加到环境变量中
vi /etc/profile
export JAVA_HOME=/usr/app/jdk-7u_65-i585
export HADOOP_HOME=/usr/app/hadoop-2.4.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
配置修改 /usr/app/hadoop-2.4.1/etc/hadoop 路径下如下5个文件
hadoo-env.sh ,core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml
点击此处跳转至详细配置文档
注意:core-site中指定hdfs的nameservice名称(fs.defaultFS)可以随意命名,但是必须与hdfs-site中的(dfs.nameservices)保持一致
3.4 修改slaves
(slaves是指定子节点的位置,因为要在weekend01上启动HDFS、在weekend03启动yarn,所以weekend01上的slaves文件指定的是datanode的位置,weekend03上的slaves文件指定的是nodemanager的位置)
分别修改 weekend01 和 weekend03上的配置文件
vi /usr/app/hadoop-2.4.1/etc/hadoop
将slavles中信息改为如下所示
[root@weekend01 hadoop]#cat slaves
weekend05
weekend06
weekend07
3.5 配置免密码登陆
(点击此处跳转详细配置方法文档)
配置weekend01到weekend02、weekend03、weekend04、weekend05、weekend06、weekend07的免密码登陆
配置weekend03到weekend04、weekend05、weekend06、weekend07的免密码登陆
两个namenode之间要配置ssh免密码登陆,别忘了配置weekend02到weekend01的免登陆
3.6 将配置好的hadoop及zookeeper拷贝到其他节点
在weekend01上执行 如下 :
scp -r /usr/app/hadoop-2.4.1/ weekend01:/usr/app
scp -r /usr/app/hadoop-2.4.1/ weekend02:/usr/app
........
scp -r /usr/app/hadoop-2.4.1/ weekend07:/usr/app
在weekend05上执行如下 :
scp -r /usr/app/zookeeper-3.4.5/ weekend06:/usr/app
scp -r /usr/app/zookeeper-3.4.5/ weekend07:/usr/app
按照下面的步骤启动集群
3.7 启动zookeeper集群
(分别在weekend05、weekend06、weekend07上启动zk)
cd /usr/app/zookeeper-3.4.5/bin/
./zkServer.sh start
#查看状态:一个leader,两个follower
./zkServer.sh status
3.8启动journalnode
(分别在在weekend05、weekend06、weekend07上执行)最下方有关系图解
注: journalnode为qjournal分布式应用(可用来管理)的管理edit.log文件,依赖于zk管理,所以将三个node节点放到zk上启动。hadoop1.x中还是用secondynode管理edit.log文件,而hadoop2.x使用qjournal管理edit.log文件。
cd /usr/app/hadoop-2.4.1
sbin/hadoop-daemon.sh start journalnode
#运行jps命令检验,weekend05、weekend06、weekend07上多了JournalNode进程
3.9格式化HDFS(仅第一次启动执行)
#在weekend01上执行命令:
hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/weekend/hadoop-2.4.1/tmp,然后将/usr/app/hadoop-2.4.1/tmp拷贝到weekend02的/usr/app/hadoop-2.4.1/下。
scp -r tmp/ weekend02:/usr/app/hadoop-2.4.1/
##也可以这样,建议hdfs namenode -bootstrapStandby
3.10格式化ZKFC(在weekend01上执行即可)(仅第一次启动执行)
注:zkfc是用来管理两台namenode切换状态的进程。同样是依赖zk实现。当active namenode状态不正常了,该namenode上的zkfc会制一个状态发动到 zk上,standby namenode上的zkfc会查看到该不正常状态,并向active namenode通过ssh发送一条指令,kill -9 进程号,杀死该进程,并将自己重置成active,放置active假死发生脑裂事件,万一ssh发送失败,也可以启动自定义的.sh脚本文件,强制杀死active namenode进程。
在hadoop2.x中将这也的一对namenode管理关系叫做 federation(联邦)最下方有图解。
并且支持多个federation, 比如配置文件中起名为ns1, 则该ns1中包括 (active namenode)nn1, (standby namenode)nn2 。
hdfs zkfc -formatZK
3.12启动HDFS(在weekend01上执行)
sbin/start-dfs.sh
3.13 启动YARN
(在weekend03上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)
sbin/start-yarn.sh
weekend04上面的resourcemanager 需要自己手动去启动下,
yarn-daemon.sh start resourcemanager
到这里hadoop HA集群配置完毕,查看各个集群节点上的进程验证是否成功启动
搭建成功情况下 weekend01 , weekend02 含有的进程:NameNode,DFSZKFailoverController
weekend03 , weekend04 含有的进程:ResourceManager
weekend05 , weekend06,weekend07 含有的进程:NodeManager,DataNode,JournalNode,QuorumPeerMain
可以在网页查看各个服务运行状态 :
HDFS : http://weekend01:50070
ResourceManager : http://weekend03:8088
下图为常见默认端口号:
附 : 配置虚拟机网络环境配置分析
首先vmware 会产生一个虚拟网关,同时vmware 上面的虚拟机上面也有网关。
而我们的实际windows上有一块实际的网关,同事vmware 也会给我们windows生成一个虚拟网卡,快捷键 win + R 可以看到该网卡,名字叫做 VMware NetWork Adapter VMnet8 ,这个网卡当然就会与vmware 进行连接。 这样的话通过 vmware软件,就把你的centos虚拟机和本地windows主机组成一个虚拟的网络。
这样 vmware虚拟网关为 192.168.2.1 的话,那么centos虚拟机网关为192.168.2.1,网卡ip可以配置为 192.168.2.100(1-->255),而本地vmnet8 虚拟机网关同样为192.168.2.1,网卡ip可以配置为 192.168.2.101(1--255),保证两个网卡不冲突并且在同一个网段即可。