因为公司需要,弄了几天,搭起来,完成一些基本的业务。
注:以下配置描述的是HDFS的QJM方式的HA配置。
前期准备:
利用实验室Dell主机,在oracle VM上构建了三个 linux系统虚拟机,并搭建了三个hadoop的集群环境,并设置了三个系统间的ssh免密码登录。另外,一定要关闭三个系统的防火墙!相关软件及环境配置如下:
Linux系统:CentOS 6.5 64位(内存:512M)
Java: jdk7.0.45 for linux 64位
Hadoop: hadoop2.4.0
Zookeeper: zookeeper3.4.6
1.1 zookeeper集群配置
首先介绍即将部署的zookeeper集群机器IP设置:
l 10.1.1.11(hostname:slave-1) namenode datanode
l 10.1.1.12(hostname:slave-2) standbyNamenode datanode
l 10.1.1.13(hostname:slave-3) datanode
首先建立zookeeper的数据目录,比如:
mkdir -p /opt/hadoop/data/zookeeper
同时建立日志存放目录:
mkdir –p /opt/hadoop/logs/zookeeper
然后修改环境变量(比如修改/etc/profile),增加如下变量:
export ZOO_HOME=/usr/hadoop2.4.0/zookeeper-3.4.5
export ZOO_LOG_DIR=/opt/hadoop/logs/zookeeper
在$ZOO_HOME/conf下,将zoo_sample.cfg复制一份,并重新命名为zoo.cfg。
在zoo.cfg文件是加入以下配置:
tickTime=2000
dataDir=/opt/hadoop/data/zookeeper
clientPort=31315
initLimit=5
syncLimit=2
server.1=10.1.1.11:31316:31317
server.2=10.1.1.12:31316:31317
server.3=10.1.1.13:31316:31317
在三台服务器的目录/opt/hadoop/data/zookeeper下分别创建一个叫myid的文件,内容分别是1,2,3
最后就是分别启动zookeeper服务了:
cd $ZOO_HOME
./bin/zkServer.sh start
通过jps命令可以检查是否启动成功,如下图所示:
看到QuorumPeerMain进程就表示zookeeper启动成功了。
测试zookeeper集群是否建立成功,在$ZOO_HOME目录下执行以下命令即可,如无报错表示集群创建成功:./bin/zkCli.sh -server <serverIp>:31315,如下图所示:
1.2 HDFS2.2.0HA配置
1.2.1 core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ha4craig</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop-2.4.0/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>10.1.1.11:31315,10.1.1.12:31315,10.1.1.13:31315</value>
</property>
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>1000</value>
</property>
</configuration>
1.2.2 hdfs-site.xml
<?xml version="1.0"encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/hadoop-2.4.0/data</value>
<final>true</final>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/hadoop-2.4.0/hdfs/name</value>
<final>true</final>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>ha4craig</value>
<description>Logical name for this new nameservice</description>
</property>
<property>
<name>dfs.ha.namenodes.ha4craig</name>
<value>nn1,nn2</value>
<description>Unique identifiers for each NameNode in thenameservice</description>
</property>
<property>
<name>dfs.namenode.rpc-address.ha4craig.nn1</name>
<value>10.1.1.11:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ha4craig.nn2</name>
<value>10.1.1.12:8020</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address.ha4craig.nn1</name>
<value>10.1.1.11:53310</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address.ha4craig.nn2</name>
<value>10.1.1.12:53310</value>
</property>
<property>
<name>dfs.namenode.http-address.ha4craig.nn1</name>
<value>10.1.1.11:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.ha4craig.nn2</name>
<value>10.1.1.12:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://10.1.1.11:8485;10.1.1.13:8485;10.1.1.12:8485/ha4craig</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ha4craig</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/usr/hadoop-2.4.0/.ssh/id_dsa_nn1</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/data/journaldata</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
<value>60000</value>
</property>
<property>
<name>ipc.client.connect.timeout</name>
<value>60000</value>
</property>
<property>
<name>dfs.image.transfer.bandwidthPerSec</name>
<value>4194304</value>
</property>
</configuration>
在上面的配置中有一个地方要特别说明一下,dfs.ha.fencing.methods表示要使用的登录方式,这里使用ssh。dfs.ha.fencing.ssh.private-key-files需要存放一个ssh对应的密钥,不管是id_dsa,还是id_rssa,这里需要给出该文件的物理路径。 上面我们是配置了两个namenode来实现HDFS的HA的,分别是nn1和nn2,在nn2的usr/hadoop2.4.0/.ssh/目录下需要将nn1的~/.ssh/目录 下的id_dsa文件copy过来,并且应该重命名成如id_dsa_nn1这样的文件名,以免覆盖了本地的文件。
Yarn-site.xml
<configuration>
<property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>slave-1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>slave-1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>slave-1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>slave-1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>slave-1:8088</value>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>slave-1:8888</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
1.3 安装HA集群
10.1.1.11,主namenode ,datanode,zookeeper,journalnode,zkfc
10.1.1.13,datanode,zookeeper,journalnode
10.1.1.12,备namenode,datanode , zookeeper,journalnode,zkfc
再次提示,关闭防火墙,不然下面的操作会出现问题。
0、首先把各个zookeeper起来,如果zookeeper集群还没有启动的话。
./bin/zkServer.sh start
1、然后在某一个namenode节点执行如下命令,创建命名空间
./bin/hdfs zkfc -formatZK
2、在各个节点用如下命令启日志程序
./sbin/hadoop-daemon.sh start journalnode
3、在主namenode节点用格式化namenode和journalnode目录
./bin/hadoop namenode -format
./bin/hadoop namenode -format ha4craig
4、在主namenode节点启动namenode的daemon进程
./sbin/hadoop-daemon.sh start namenode
5、在备节点执行第一行命令,这个是把备namenode节点的目录格式化并把元数据从主namenode节点copy过来,并且这个命令不会把journalnode目录再格式化了!然后用第二个命令启动备namenode进程!
./bin/hdfs namenode –bootstrapStandby
./sbin/hadoop-daemon.sh start namenode
6、在两个namenode节点都执行以下命令
./sbin/hadoop-daemon.sh start zkfc
7、在所有datanode节点都执行以下命令启动datanode
./sbin/hadoop-daemon.sh start datanode
8、关闭和重启
在三台机器上执行:./sbin/stop-dfs.sh和./zookeeper3.4.6/bin/zkServer.sh top,关闭所有服务,然后重启。
1.4 启动HA
下次启动的时候,只需要在三台机器上执行如下命令即可启动所有服务和进程:
./zookeeper3.4.6/bin/zkServer.sh start
./sbin/start-dfs.sh
效果如下:
Slave-1:
Slave-2:
Slave-3:
然后访问以下两个地址查看启动的两个namenode的状态:
http://10.1.1.11:50070/dfshealth.jsp
http://10.1.1.12:50070/dfshealth.jsp
通过简单命令和代码测试hadoop是否正常启动,如图:
1.5 停止服务
停止所有HDFS相关的进程服务,执行以下命令:
./sbin/stop-dfs.sh
./zookeeper3.4.6/zkServer.sh stop
1.6 测试HDFS的HA功能
在任意一台namenode机器上通过jps命令查找到namenode的进程号,然后通过kill -9的方式杀掉进程,观察另一个namenode节点是否会从状态standby变成active状态。
jps
1686 JournalNode
1239 QuorumPeerMain
1380 NameNode
2365 Jps
1863 DFSZKFailoverController
kill -9 1380
然后观察原来是standby状态的namenode机器的zkfc日志,若最后一行出现如下日志,则表示切换成功.
INFOorg.apache.hadoop.ha.ZKFailoverController: Successfully transitioned NameNodeat salve-2/10.1.1.12:53310 to active state
这时再通过命令启动被kill掉的namenode进程
./sbin/hadoop-daemon.sh start namenode
对应进程的zkfc最后一行日志如下:
INFOorg.apache.hadoop.ha.ZKFailoverController: Successfully transitioned NameNodeat slave-2/10.1.1.12:53310 to standby state
可以在两台namenode机器之间来回kill掉namenode进程以检查HDFS的HA配置!