hadoop2.2.0、zookeeper3.4.5、hbase0.96.2基于QJM方式HA的分布式集群搭建
hadoop2.2.0、zookeeper3.4.5、hbase0.96.2基于QJM方式HA的分布式集群搭建
QJM方式的高可用简介
在hadoop2.0中通常由一个命名空间对应两个NameNode组成,一个处于active状态,另一个处于standby状态。
Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便
能够在它失败时快速进行切换。
hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM(Quorum Journal Manager)。这里
我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功
写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode。
这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode宕
机后会自动切换Standby NameNode为standby状态。
用到的软件
jdk-6u45-linux-x64.bin
hadoop-2.2.0.x86_64.tar.gz
zookeeper-3.4.5.tar.gz
hbase-0.96.2-hadoop2-bin.tar.gz
-apache-hive-0.13.0-bin.tar.gz
-apache-flume-1.5.0-bin.tar.gz
-sqoop-1.99.4-bin-hadoop200.tar.gz
-apache-storm-0.9.3.tar.gz
集群规划
主机 IP 软件 进程
pc1 192.168.1.101 jdk、hadoop、hbase DFSZKFailoverController、HMaster、NameNode
pc2 192.168.1.102 Jdk、hadoop、hbase DFSZKFailoverController、HMaster、NameNode
pc3 192.168.1.103 jdk、hadoop、hbase ResourceManager、HRegionServer
pc4 192.168.1.104 jdk、hadoop、zookeeper、hbase QuorumPeerMain、JournalNode、DataNode、NodeManager、HRegionServer
pc5 192.168.1.105 jdk、hadoop、zookeeper、hbase QuorumPeerMain、JournalNode、DataNode、NodeManager、HRegionServer
pc6 192.168.1.106 jdk、hadoop、zookeeper、hbase QuorumPeerMain、JournalNode、DataNode、NodeManager、HRegionServer
集群启动后的进程为如下
pc1
2814 DFSZKFailoverController
28463 Main
28924 Jps
28329 HMaster
2551 NameNode
pc2
2287 NameNode
27612 HMaster
2376 DFSZKFailoverController
28072 Jps
pc3
26946 Jps
2271 ResourceManager
26637 HRegionServer
pc4
26831 HRegionServer
2191 QuorumPeerMain
26046 DataNode
27193 Jps
26180 NodeManager
12572 JournalNode
pc5
27206 Jps
2325 JournalNode
2435 DataNode
2196 QuorumPeerMain
26823 HRegionServer
2569 NodeManager
pc6
27205 Jps
26170 NodeManager
26035 DataNode
26835 HRegionServer
2195 QuorumPeerMain
2319 JournalNode
准备六台机器(不再描述修改主机名、修改主机和IP映射的hosts、关闭防火墙)
配置ssh免密码登录
在pc1、pc2、pc3、pc4、pc5和pc6机器上生成ssh密钥(采用rsa非对称加密方式)
进入/root/.ssh/下执行ssh-keygen –t rsa 三次回车生成公钥和私钥文件
在pc1上执行ssh-copy-id root@pc1
在pc2上执行ssh-copy-id root@pc1
在pc3上执行ssh-copy-id root@pc1
在pc4上执行ssh-copy-id root@pc1
在pc5上执行ssh-copy-id root@pc1
在pc6上执行ssh-copy-id root@pc1
将pc1的authorized_keys复制到pc2、pc3、pc4、pc5和pc6上,如下
scp /root/.ssh/authorized_keys root@pc2:/root/.ssh/
scp /root/.ssh/authorized_keys root@pc3:/root/.ssh/
scp /root/.ssh/authorized_keys root@pc4:/root/.ssh/
scp /root/.ssh/authorized_keys root@pc5:/root/.ssh/
scp /root/.ssh/authorized_keys root@pc6:/root/.ssh/
通过各个节点相互登录完成验证ssh免密码登录(包括免密码登录自己),如下:
ssh pc1
ssh pc2
ssh pc3
ssh pc4
ssh pc5
ssh pc6
所有的软件均安装到/usr/local/下
安装jdk(在pc1上安装,安装成功后将pc1的jdk和环境变量复制到其他节点上)
授予jdk的可执行权限,如下:
chmod u+x jdk-6u45-linux-x64.bin
解压jdk到当前目录(/usr/local/):
./jdk-6u45-linux-x64.bin
重命名解压出来的jdk1.6.0_45文件夹:
mv jdk1.6.0_45 jdk
配置jdk的JAVA_HOME到环境变量(/etc/profile),如下:
vim /etc/profile
添加如下两行:
export JAVA_HOME=/usr/local/jdk
export PATH=.:$JAVA_HOME/bin:$PATH
使环境变量立即生效,如下:
source /etc/profile
验证jdk是否安装成功,如下:
java –version
将配置好的jdk和环境变量复制到pc2、pc3、pc4、pc5和pc6上,如下:
从pc1上复制jdk到pc2、pc3、pc4、pc5和pc6上,如下:
scp –r jdk root@pc2:/usr/local/
scp –r jdk root@pc3:/usr/local/
scp –r jdk root@pc4:/usr/local/
scp –r jdk root@pc5:/usr/local/
scp –r jdk root@pc6:/usr/local/
从pc1上复制/etc/profile到pc2、pc3、pc4、pc5和pc6上,如下:
scp /etc/profile root@pc2:/etc/
scp /etc/profile root@pc3:/etc/
scp /etc/profile root@pc4:/etc/
scp /etc/profile root@pc5:/etc/
scp /etc/profile root@pc6:/etc/
需要在pc2、pc3、pc4、pc5和pc6上执行source /etc/profile命令立即生效
安装zookeeper(在pc4上安装,安装成功后将pc4的zookeeper和环境变量复制到其他节点上。pc4为QuorumPeerMain角色为Follower。pc5为QuorumPeerMain角色为Leader。pc6为QuorumPeerMain角色为Follower。)
解压zookeeper-3.4.5.tar.gz到当前目录(/usr/local),如下:
tar –zxvf zookeeper-3.4.5.tar.gz
重命名解压出来的zookeeper,如下:
mv zookeeper-3.4.5 zk
修改zk的配置文件(zoo_sample.cfg),如下:
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
添加如下内容:
dataDir=/usr/local/zk/data
server.1=pc4:2888:3888
server.2=pc5:2888:3888
server.3=pc6:2888:3888
注意:在zk的根目录下创建data文件夹,该文件夹中包含一个myid文件,值为1
配置zookeeper的ZOOKEEPER_HOME到环境变量(/etc/profile),如下:
Vim /etc/profile
添加如下内容:
export ZOOKEEPER_HOME=/usr/local/zk
export PATH=.:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
将pc4的zk和环境变量(/etc/profile)分别复制到pc5和pc6节点上,如下:
scp –r root@pc5:/usr/local/ 注意:pc5的myid文件值为2
scp –r root@pc6:/usr/local/ 注意:pc6的myid文件值为3
将pc4的环境变量(/etc/profile)复制到pc5和pc6节点上,如下:
scp /etc/profile root@pc5:/etc/
scp /etc/profile root@pc6:/etc/
使环境变量立即生效,如下:
source /etc/profile
安装hadoop(在pc1上安装,安装成功后将pc1的hadoop和环境变量复制到其他节点上。pc1为Active的NameNode。pc2为Standby的NameNode。pc3为ResourceManager。pc4、pc5和pc6为DataNode。)
解压hadoop-2.2.0.x86_64.tar.gz文件到当前目录(/usr/local),如下:
tar –zxvf hadoop-2.2.0.x86_64.tar.gz
重命名解压出来的hadoop,如下:
mv hadoop2.2.0 hadoop
修改hadoop配置文件(hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml和slaves),如下:
一、hadoop-env.sh
export JAVA_HOME=/usr/local/jdk
二、core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>pc4:2181,pc5:2181,pc6:2181</value>
</property>
</configuration>
三、hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>pc1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>pc1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>pc2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>pc2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://pc4:8485;pc5:8485;pc6:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/journal</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
四、mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
五、yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>pc3</value>
</property>
<!-- 指定nodemanager启动时加载server的方式为shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
六、slaves
pc4
pc5
pc6
将配置好的hadoop复制到pc2、pc3、pc4、pc5和pc6上,如下:
spc -r /usr/local/hadoop root@pc2:/usr/local/
spc -r /usr/local/hadoop root@pc3:/usr/local/
spc -r /usr/local/hadoop root@pc4:/usr/local/
spc -r /usr/local/hadoop root@pc5:/usr/local/
spc -r /usr/local/hadoop root@pc6:/usr/local/
以上步骤完成后,hadoop就算配置完成了。
启动hadoop前需要格式化hdfs和zkfc,请严格按照如下步骤执行:
一、启动pc4、pc5、pc6上的zookeeper集群,如下:
注意:高可用的集群依赖zookeeper进行故障转移,所以必须先启动zookeeper集群。
在pc4上启动zookeeper(启动后验证zookeeper节点状态和角色),如下:
zkServer.sh start --启动zookeeper进程
zkServer.sh status --follower或leader
jps -- QuorumPeerMain
在pc5上启动zookeeper(启动后验证zookeeper节点状态和角色),如下:
zkServer.sh start --启动zookeeper进程
zkServer.sh status --follower或leader
jps -- QuorumPeerMain
在pc6上启动zookeeper(启动后验证zookeeper节点状态和角色),如下:
zkServer.sh start --启动zookeeper进程
zkServer.sh status --follower或leader
jps -- QuorumPeerMain
二、在pc1上启动JournalNode(该进程位于pc4、pc5和pc6节点),如下:
cd /usr/local/hadoop/sbin
hadoop-daemons.sh start journalnode
三、格式化HDFS(首次使用时需要格式化),如下:
cd /usr/local/hadoop/bin
hdfs namenode –format
四、格式化zk,如下:
cd /usr/local/hadoop/bin
hdfs zkfc –formatZK
五、在pc1上启动HDFS(pc1为Active状态的NameNode,pc2为Standby状态的NameNode),如下:
cd /usr/local/hadoop/sbin
start-dfs.sh
六、在pc3上启动YARN(避免NameNode和ResourceManager抢占资源,所以将ResourceManager单独放在pc3上),如下:
cd /usr/local/hadoop/sbin
start-yarn.sh
上述步骤无报错的情况下则为正常启动集群,通过如下方式验证集群是否搭建成功:
Jps方式:
pc1
23295 Jps
2000 NameNode
2259 DFSZKFailoverController
pc2
23000 Jps
2024 DFSZKFailoverController
1944 NameNode
pc3
22544 Jps
1993 ResourceManager
pc4
22668 Jps
1985 DataNode
1918 QuorumPeerMain
2042 JournalNode
2199 NodeManager
pc5
2081 JournalNode
22714 Jps
2236 NodeManager
2023 DataNode
1954 QuorumPeerMain
pc6
1987 DataNode
2202 NodeManager
22671 Jps
1924 QuorumPeerMain
2047 JournalNode
浏览器方式验证:
验证HDFS:
pc1:50070 Active状态的NameNode,Live Nodes(DataNode节点)数量为3,分别是pc4、pc5和pc6,JournalManager(JournalNode节点)是pc4、pc5和pc6。
pc2:50070 Standby状态的NameNode,Live Nodes(DataNode节点)数量为3,分别是pc4、pc5和pc6。
验证YARN:
pc3:8088 ResourceManager,Active Nodes(NodeManager节点)分别是pc4、pc5和pc6。
验证NameNode的高可用:
在pc1上杀死NameNode进程(kill -9 NameNode进程号),通过浏览器查看时,pc1的NameNode页面无法打开,pc2的NameNode页面的状态变成了Active状态。
与上述验证匹配表示hadoop集群启动成功了。
安装Hbase()

浙公网安备 33010602011771号