hadoop学习笔记-HA的配置

来源:互联网 发布:氮泵 副作用 知乎 编辑:程序博客网 时间:2024/06/11 06:32

这里我们的系统环境不变,还是使用单节点的系统环境


这个是HA架构原理



这里我们增加到三台服务器,分别为:

yangyi 192.168.6.101wanger 192.168.6.102zhagnsan 192.168.6.103


我的集群规划如下:

yangyi : NameNode  ZKFC DataNode JournalNode NodeManager Zookeeperwanger:  NameNode  ZKFC DataNode JournalNode NodeManager Zookeeper ResourceManagerzhangsan: ResourceManager DataNode JournalNode Zookeeper NodeManager

准备工作:

首先是 hostname配置,hosts配置,这里就不示例了

然后是 server iptables stop(关闭防火墙)chkconfig iptables off(开机不自启动)

最后是 设置免密钥登陆 

1.在三台机器上生成密钥(ssh-keygen - t rsa)

2.分别在每台机器上将密钥发送给集群中的机器,包括自己(ssh-copy-id [hostname] )

1.安装zookeeper

首先我们要将zookeeper上传到第一台机器并解压到/opt/modules/目录下

这里我们需要进行zookeeper集群配置

复制 zookeeper 安装目录下 conf目录下的 zoo_sample.cfg 为 zoo.cfg

编辑 zoo.cfg

修改 datadir属性为 zookeeper安装目录下的data目录,并配置集群
# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial # synchronization phase can takeinitLimit=10# The number of ticks that can pass between # sending a request and getting an acknowledgementsyncLimit=5# the directory where the snapshot is stored.# do not use /tmp for storage, /tmp here is just # example sakes.dataDir=/opt/modules/zookeeper-3.4.5/data# the port at which the clients will connectclientPort=2181## Be sure to read the maintenance section of the # administrator guide before turning on autopurge.## http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance## The number of snapshots to retain in dataDir#autopurge.snapRetainCount=3# Purge task interval in hours# Set to "0" to disable auto purge feature#autopurge.purgeInterval=1server.1=yangyi:2888:3888server.2=wanger:2888:3888server.3=zhangsan:2888:3888

这里可以看到,我配置的三个节点,分别为yangyi,wanger,zhangsan

这是我们还需要在 datadir目录下新建一个 myid文件,并在文件中写入集群对应的编号

yangyi就是1 ,wanger就是2,zhangsan就是3

然后我们将zookeeper目录发送到其他两个节点,不要忘记修改myid文件的编号(scp /opt/modules/zookeeper-3.4.5 [hostname]:/opt/modules/

此时 zookeeper集群就配置成功了,我们分别在启动三个zookeeper,(/opt/modules/zookeeper-3.4.5/bin/zkServer.sh start)
然后查看 是否启动成功 (/opt/modules/zookeeper-3.4.5/bin/zkServer.sh status)
如果是一个leader两个follower就代表zookeeper集群配置成功

2.配置Hadoop集群

首先我们需要 修改三个env配置文件,写入JAVA_HOME变量,这里就不演示了

然后我们修改 slaves文件加入datanode的列表

yangyiwangerzhangsan


hdfs-site.xml

<configuration>  <!-- 关闭安全检查--><property>  <name>dfs.permissions.enabled</name>  <value>false</value>  </property>  <!-- 设置namenode集群名称 --><property>  <name>dfs.nameservices</name>  <value>mycluster</value>  </property>  <property>  <name>dfs.ha.namenodes.mycluster</name>  <value>nn1,nn2</value>  </property>  <!-- nn1的RPC通信地址,nn1所在地址  -->  <property>  <name>dfs.namenode.rpc-address.mycluster.nn1</name>  <value>yangyi:8020</value>  </property>  <!-- nn1的http通信地址,外部访问地址 -->  <property>  <name>dfs.namenode.http-address.mycluster.nn1</name>  <value>yangyi:50070</value>  </property>  <!-- nn2的RPC通信地址,nn2所在地址 -->  <property>  <name>dfs.namenode.rpc-address.mycluster.nn2</name>  <value>wanger:8020</value>  </property>  <!-- nn2的http通信地址,外部访问地址 -->  <property>  <name>dfs.namenode.http-address.mycluster.nn2</name>  <value>wanger:50070</value>  </property> <!-- 指定NameNode的元数据在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->  <property>  <name>dfs.namenode.shared.edits.dir</name>  <value>qjournal://yangyi:8485;wanger:8485;zhangsan/mycluster</value>  </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 -->  <property>  <name>dfs.journalnode.edits.dir</name>  <value>/opt/modules/hadoop-2.5.0/data/journal</value>  </property>  <!--客户端通过代理访问namenode,访问文件系统,HDFS 客户端与Active 节点通信的Java 类,使用其确定Active 节点是否活跃  -->  <property>  <name>dfs.client.failover.proxy.provider.mycluster</name>  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  </property>  <!--这是配置自动切换的方法,有多种使用方法,具体可以看官网,在文末会给地址,这里是远程登录杀死的方法  -->  <property>  <name>dfs.ha.fencing.methods</name>  <value>sshfence</value>----这个参数的值可以有多种,你也可以换成shell(/bin/true)试试,也是可以的,这个脚本do nothing 返回0       </property>  <!-- 这个是使用sshfence隔离机制时才需要配置ssh免登陆 -->  <property>  <name>dfs.ha.fencing.ssh.private-key-files</name>  <value>/home/yang/.ssh/id_rsa</value>  </property>  <!-- 配置sshfence隔离机制超时时间,这个属性同上,如果你是用脚本的方法切换,这个应该是可以不配置的 -->  <property>  <name>dfs.ha.fencing.ssh.connect-timeout</name>  <value>30000</value>  </property>  <!-- 这个是开启自动故障转移,如果你没有自动故障转移,这个可以先不配 -->  <property>  <name>dfs.ha.automatic-failover.enabled</name>  <value>true</value>  </property>  </configuration>  


然后core-site.xml

<configuration><property>  <name>fs.defaultFS</name>  <value>hdfs://mycluster</value>  </property>  <property>  <name>hadoop.tmp.dir</name>  <value>/opt/modules/hadoop-2.5.0/data</value>  </property>  <property>  <name>hadoop.http.staticuser.user</name>  <value>yang</value>  </property>  <property>  <name>ha.zookeeper.quorum</name>  <value>yangyi:2181,wanger:2181,zhangsan:2181</value>  </property>  </configuration>  


然后yarn-site.xml

<configuration>      <property>          <name>yarn.nodemanager.aux-services</name>          <value>mapreduce_shuffle</value>      </property>      <property>          <name>yarn.resourcemanager.hostname</name>          <value>zhangsan</value>      </property>      <property>          <name>yarn.log-aggregation-enable</name>          <value>true</value>      </property>      <property>          <name>yarn.log-aggregation.retain-seconds</name>          <value>106800</value>      </property>  <!--启用resourcemanager ha-->  <!--是否开启RM ha,默认是开启的-->  <property>     <name>yarn.resourcemanager.ha.enabled</name>     <value>true</value>  </property>  <!--声明两台resourcemanager的地址-->  <property>     <name>yarn.resourcemanager.cluster-id</name>     <value>rmcluster</value>  </property>  <property>     <name>yarn.resourcemanager.ha.rm-ids</name>     <value>rm1,rm2</value>  </property>  <property>     <name>yarn.resourcemanager.hostname.rm1</name>     <value>wanger</value>  </property>  <property>     <name>yarn.resourcemanager.hostname.rm2</name>     <value>zhangsan</value>  </property>     <!--指定zookeeper集群的地址-->   <property>     <name>yarn.resourcemanager.zk-address</name>  <value>yangyi:2181,wanger:2181,zhangsan:2181</value>  </property>  <!--启用自动恢复,当任务进行一半,rm坏掉,就要启动自动恢复,默认是false-->   <property>     <name>yarn.resourcemanager.recovery.enabled</name>     <value>true</value>  </property>     <!--指定resourcemanager的状态信息存储在zookeeper集群,默认是存放在FileSystem里面。-->   <property>     <name>yarn.resourcemanager.store.class</name>     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>  </property>  </configuration>  


然后是mapred-site.xml

<configuration><property>  <name>mapreduce.framework.name</name>  <value>yarn</value>  </property>  <property>  <name>mapreduce.jobhistory.address</name>  <value>yangyi:10020</value>  </property>  <property>  <name>mapreduce.jobhistory.webapp.address</name>  <value>yangyi:19888</value>  </property></configuration>

3.运行hadoop-HA



1.将hadoop发送到其他两个节点中(scp -r /opt/modules/hadoop-2.5.0/ [hostname]:/opt/modules/ )

2.分别在三个节点启动JournalNode(/opt/modules/hadoop-2.5.0/sbin/hadoop-daemon.sh start journalnode)

3.格式化yangyi节点 下的namenode(/opt/modules/hadoop-2.5.0/bin/hdfs namenode -format)

4.再yangyi节点下开启namenode(/opt/modules/hadoop-2.5.0/sbin/hadoop-daemon.sh start namenode)

5.去wanger节点下同步namenode的数据(/opt/modules/hadoop-2.5.0/bin/hdfs namenode -bootstrapStandby

6.自动故障转移的配置其实要在zookeeper上生成一个节点 hadoop-ha,这个是自动生成的(/opt/modules/hadoop-2.5.0/bin/hdfs zkfc -formatZK)

7.去第一个节点执行/opt/modules/hadoop-2.5.0/sbin/start-dfs.sh ,

8.去第二个节点执行/opt/modules/hadoop-2.5.0/sbin/start-yarn.sh,

9.去第三个节点执行/opt/modules/hadoop-2.5.0/sbin/yarn-daemon.sh start resourcemanager

此时我们再去每个节点输入jps查看进程

第一个节点yangyi:
[yang@yangyi hadoop-2.5.0]$ jps3776 DFSZKFailoverController3217 JournalNode3472 DataNode4023 NodeManager3133 QuorumPeerMain4111 Jps3875 NameNode



第二个节点yangyi:

[yang@wanger hadoop-2.5.0]$ jps3973 Jps3589 ResourceManager3210 DataNode3471 NameNode3060 JournalNode3687 NodeManager3366 DFSZKFailoverController2978 QuorumPeerMain

第三个节点yangyi:

[yang@zhangsan hadoop-2.5.0]$ jps2869 QuorumPeerMain2957 JournalNode3280 ResourceManager3039 DataNode3177 NodeManager3327 Jps


查看两个namenode的状态



我们发现yangyi节点的namenode的状态是active,wanger节点的状态是standby,

我们kill掉yangyi节点的namenode,wanger节点的namenode是否会自动切换为

active状态