您的位置:首页 > 运维架构

关于hadoop的HA集群配置和搭建

2015-11-25 16:06 351 查看
  因为公司需要,弄了几天,搭起来,完成一些基本的业务。

注:以下配置描述的是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配置!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: