前提:已安装好centos6.5操作系统
Hadoop HA(QJM)集群配置规划
IP |
Hostname |
备注 |
192.168.100.101 |
h1m1 |
NN(active)、RM、ZKFC |
192.168.100.102 |
h1m2 |
NN(standby)、RM、ZKFC |
192.168.100.103 |
h1s1 |
DN、NM、JN、QPM |
192.168.100.104 |
h1s2 |
DN、NM、JN、QPM |
192.168.100.105 |
h1s3 |
DN、NM、JN、QPM |
192.168.100.106 |
h1s4 |
DN、NM、JN、QPM |
192.168.100.107 |
h1s5 |
DN、NM、JN、QPM |
说明:
NN: NameNode
RM: ResourceManager
ZKFC: DFSZKFailoverController
DN: DataNode
NM: NodeManager
JN: JournalNode
QPM: QuorumPeerMain
1. 系统环境设置(先配置master节点h1m1)
1.1修改主机名
# vim /etc/sysconfig/network
1 NETWORKING=yes
2 HOSTNAME=h1m1
3 NTPSERVERARGS=iburst
1.2 修改IP地址
进入Linux图形界面 -> 右键点击右上方的网络连接->点击“编辑连接…” ->添加一个新网络“主机连接” ->选择IPv4 ->方法选择为手动 ->点击添加按钮 ->添加IP:192.168.100.101子网掩码:255.255.255.0网关:192.168.100.254 ->应用
1.3修改主机名和IP的映射关系(hosts)
# vim/etc/hosts
添加:192.168.100.100 h1m1~192.168.100.107 h1s5
1.4关闭防火墙
# service iptables status //查看防火墙状态
# service iptables stop //关闭防火墙
# chkconfig iptables --list //查看防火墙开机启动状态
# chkconfig iptables off //关闭防火墙开机启动
1.5重启系统
# reboot
2.安装jdk
下载地址:http://pan.baidu.com/s/1i34B3JB
2.1上传
2.2解压jdk
# mkdir /usr/lib/jdk //创建目录
# tar -zxvf jdk-8u40-linux-x64.tar.gz //解压
# mv jdk1.8.0_40 /usr/lib/jdk
2.3将Java添加到环境变量中
# vim /etc/profile
//在文件最后添加
export JAVA_HOME=/usr/java/jdk1.8.0_40
export PATH=.:$JAVA_HOME/bin:$PATH
# source /etc/profile //刷新配置
# java -version
3. 配置ssh免登陆
# cd ~ //进入到我的home目录
# ssh-keygen -t rsa -P ''(四个回车)
执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
将公钥拷贝到要免登陆的机器上
# ssh-copy-id h1m1 (或# cat ~/.ssh/id_rsa.pub>> ~/.ssh/ authorized_keys)
# cat ~/.ssh/authorized_keys //查看rsa
注:为方便在集群中针对多节点执行命令,在此提供一个简单脚本供大家使用:
- #!/usr/bin/env bash
- doCommand() {
- hosts=`sed -n '/^[^#]/p' hostlist`
- for host in $hosts
- do
- echo ""
- echo HOST $host
- ssh $host "$@"
- done
- return 0
- }
- if [ $# -lt 1 ]; then
- echo "$0 cmd"
- exit
- fi
- doCommand "$@"
- echo "return from doCommand"
用法:将本脚本保存并修改权限(chmod 775 doCommand.sh). 在脚本目录下创建一个hostlist文件,其中保存要执行命令的host主机列表.
使用命令:./doCommand.sh “
e.g. ./doCommand.sh “ls”
4.在h1m1上安装hadoop2.6.0(注:为方便操作,使用xshell远程登录到linux)
按安装java方式把hadoop解压到/usr/lib/hadoop
4.1配置hadoop
将hadoop添加到环境变量中
# vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_40
export HADOOP_HOME=/usr/lib/hadoop
export PATH=.:$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
4.1.1 配置hadoop-env.sh
# cd /usr/lib/hadoop
# vim etc/hadoop/hadoop-env.sh(注意,此处不是系统的etc目录)
将JAVA_HOME修改为刚才配置的位置
4.1.2配置core-site.xml
# vim etc/hadoop/core-site.xml
添加以下内容:
-
-
fs.defaultFS -
hdfs://mycluster -
-
hadoop.tmp.dir -
/usr/lib/hadoop/tmp -
-
ha.zookeeper.quorum -
h1s1:2181,h1s2:2181,h1s3:2181,h1s4:2181,h1s5:2181
4.1.3 配置hdfs-site.xml
HA主要配置是在本文件中,参考官网:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
# vim etc/hadoop/hdfs-site.xml
添加以下内容:
-
-
dfs.nameservices -
mycluster -
-
dfs.ha.namenodes.mycluster -
nn1,nn2 -
-
dfs.namenode.rpc-address.mycluster.nn1 -
h1m1:9000 -
-
dfs.namenode.http-address.mycluster.nn1 -
h1m1:50070 -
-
dfs.namenode.rpc-address.mycluster.nn2 -
h1m2:9000 -
-
dfs.namenode.http-address.mycluster.nn2 -
h1m2:50070 -
-
dfs.namenode.shared.edits.dir -
qjournal://h1s1:8485;h1s2:8485;h1s3:8485;h1s4:8485;h1s5:8485/mycluster -
-
dfs.journalnode.edits.dir -
/usr/lib/hadoop/journal -
-
dfs.ha.automatic-failover.enabled -
true -
-
dfs.client.failover.proxy.provider.mycluster -
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider -
-
dfs.ha.fencing.methods -
- sshfence
- shell(/bin/true)
-
-
dfs.ha.fencing.ssh.private-key-files -
/home/hadoop/.ssh/id_rsa -
-
dfs.ha.fencing.ssh.connect-timeout -
30000
4.1.4配置mapred-site.xml
# cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
# vim etc/hadoop/mapred-site.xml
添加以下内容:
-
-
mapreduce.framework.name -
yarn -
true
4.1.5配置yarn-site.xml
# vim etc/hadoop/yarn-site.xml
添加以下内容:
-
-
yarn.resourcemanager.ha.enabled -
true -
-
yarn.resourcemanager.cluster-id -
yrc -
-
yarn.resourcemanager.ha.rm-ids -
rm1,rm2 -
-
yarn.resourcemanager.hostname.rm1 -
h1m1 -
-
yarn.resourcemanager.hostname.rm2 -
h1m2 -
-
yarn.resourcemanager.zk-address -
h1s1:2181,h1s2:2181,h1s3:2181,h1s4:2181,h1s5:2181 -
-
yarn.nodemanager.aux-services -
mapreduce_shuffle
4.2 修改slaves
slaves是指定子节点的位置,因为要在h1m1上启动HDFS、yarn,所以h1m1上的slaves文件指定的是datanode的位置和nodemanager的位置
# vim /usr/lib/hadoop/etc/hadoop/slaves
h1s1
h1s2
h1s3
h1s4
h1s5
4.3 配置免密码登陆
#配置h1m1到h1m2、h1s1、h1s2、h1s3、h1s4、h1s5的免密码登陆
#在h1m1上生产一对钥匙
ssh-keygen -t rsa -P ''
#将公钥拷贝到其他节点,包括自己
ssh-coyp-id h1m1
ssh-coyp-id h1m2
ssh-coyp-id h1s1
ssh-coyp-id h1s2
ssh-coyp-id h1s3
ssh-coyp-id h1s4
ssh-coyp-id h1s5
5. 安装zookeeper
5.1 下载安装zookeeper
下载地址:http://pan.baidu.com/s/1hq2BEBi
安装过程参考hadoop
5.2 配置zookeeper
添加一个zoo.cfg配置文件
# cd /usr/lib/zookeeper/conf
# mv zoo_sample.cfg zoo.cfg
修改配置文件(zoo.cfg)
dataDir=/usr/lib/zookeeper/data
server.3=h1s1:2888:3888
server.4=h1s2:2888:3888
server.5=h1s3:2888:3888
server.6=h1s4:2888:3888
server.7=h1s5:2888:3888
在(/usr/lib/zookeeper/data)创建一个myid文件,里面内容是server.N中的N(server.3里面内容为3)
# echo "3" > myid
将配置好的zk拷贝到其他节点
# scp -r /usr/lib/zookeeper/ h1s2:/usr/lib/
# scp -r /usr/lib/zookeeper/ h1s3:/usr/lib/
# scp -r /usr/lib/zookeeper/ h1s4:/usr/lib/
# scp -r /usr/lib/zookeeper/ h1s5:/usr/lib/
注意:在其他节点上一定要修改myid的内容
在h1s2应该讲myid的内容改为4 (# echo "4" > myid)
在h1s3应该讲myid的内容改为5 (# echo "5" > myid)
在h1s4应该讲myid的内容改为6 (# echo "6" > myid)
在h1s5应该讲myid的内容改为7 (# echo "7" > myid)
6. 启动集群
6.1 启动zookeeper集群(分别在h1s1、h1s2、h1s3、h1s4、h1s5上启动zk)
# cd /usr/lib/zookeeper/bin/
# ./zkServer.sh start
# ./zkServer.sh status #查看状态:一个leader,四个follower
6.2 启动journalnode(分别在h1s1、h1s2、h1s3、h1s4、h1s5上执行)
# cd /usr/lib/hadoop
# sbin/hadoop-daemon.sh start journalnode #运行jps命令检验,h1s1、h1s2、h1s3、h1s4、h1s5上多了JournalNode进程
6.3 格式化HDFS
# hdfs namenode -format #在h1m1上执行命令:
# scp -r tmp/ h1m2:/usr/lib/hadoop/ #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/lib/hadoop/tmp,然后将/usr/lib/hadoop/tmp拷贝到h1m2的/usr/lib/hadoop/下。
6.4 格式化ZK(在h1m1上执行即可)
# hdfs zkfc -formatZK
6.5 启动HDFS(在h1m1上执行)
# sbin/start-dfs.sh
6.6 启动YARN
在此我们是在h1m1上配置RM,所以在h1m1执行
# sbin/start-yarn.sh
到此,hadoop-2.6.0配置完毕,可以统计浏览器访问:
http://h1m1:50070
NameNode 'h1m1:9000' (active)
http://h1m2:50070
NameNode 'h1m2:9000' (standby)
验证HDFS HA
首先向hdfs上传一个文件
hadoop fs -put /etc/profile /profile
hadoop fs -ls /
然后再kill掉active的NameNode
kill -9
通过浏览器访问:http://h1m2:50070
NameNode 'h1m2:9000' (active)
这个时候h1m2上的NameNode变成了active
在执行命令:
hadoop fs -ls /
-rw-r--r-- 3 root supergroup 1926 2015-05-14 15:36 /profile
刚才上传的文件依然存在!!!
手动启动那个挂掉的NameNode
sbin/hadoop-daemon.sh start namenode
通过浏览器访问:http://h1m1:50070
NameNode 'h1m1:9000' (standby)
验证YARN:
运行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount /profile /out
OK,大功告成!!!