为什么使用Hadoop Ha 集群:
hadoop集群分为namenode、resourcemanager和datenode,namenode为主节点,datenode为数据节点,namenode、resourcemanager一般是单点,如果namenode、resourcemanager出现故障则hadoop集群不能正常使用,只能等namenode、resourcemanager修复后才能正常工作。本章搭建namenode、resourcemanager的高可用。
简单介绍工作原理:
hadoop2.0的HA 机制有两个namenode,一个是active namenode,状态是active;另外一个是standby namenode,状态是standby。两者的状态是可以切换的,但不能同时两个都是active状态,最多只有1个是active状态。只有active namenode提供对外的服务,standby namenode是不对外服务的。active namenode和standby namenode之间通过NFS或者JN(journalnode,QJM方式)来同步数据。
active namenode会把最近的操作记录写到本地的一个edits文件中(edits file),并传输到NFS或者JN中。standby namenode定期的检查,从NFS或者JN把最近的edit文件读过来,然后把edits文件和fsimage文件合并成一个新的fsimage,合并完成之后会通知active namenode获取这个新fsimage。active namenode获得这个新的fsimage文件之后,替换原来旧的fsimage文件。
这样,保持了active namenode和standby namenode的数据的实时同步,standby namenode可以随时切换成active namenode(譬如active namenode挂了)。而且还有一个原来hadoop1.0的secondarynamenode,checkpointnode,buckcupnode的功能:合并edits文件和fsimage文件,使fsimage文件一直保持更新。所以启动了hadoop2.0的HA机制之后,secondarynamenode,checkpointnode,buckcupnode这些都不需要了。
详细介绍参考:http://blog.51cto.com/sstudent/1381607
话不多说,开始环境介绍:
系统版本:CentOS Linux release 7.3.1611 (Core)
内核版本:Linux master 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
cpu:4核
内存8g
jdk:
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
zookeepeer版本:zookeeper-3.4.9
ip | node | 组件 |
---|---|---|
172.16.100.93 master | DFSZKFailoverController、NameNode、 ResourceManager | jdk |
172.16.100.94 node1 | DataNode、JournalNode、NodeManager | jdk、zookeeper |
172.16.100.95 node2 | DataNode、JournalNode、NodeManager | jdk、zookeeper |
172.16.101.50 node3 | DFSZKFailoverController、JournalNode、NameNode | jdk、zookeeper |
将以下放到各个机器的/etc/hosts文件中
172.16.100.93 master
172.16.100.94 node1
172.16.100.95 node2
172.16.101.50 node3
node1、node2、node3 操作
本次是将zookeeper安装在root用户,做上免密登录
zookeeper 安装:
#cd /usr/local/src
#wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
#tar zxvf zookeeper-3.4.9.tar.gz
#mv zookeeper-3.4.9 ../zookeeper
#cd ../zookeeper/conf
#cp zoo_sample.cfg zoo.cfg
#vim zoo.cfg (添加以下配置文件)
dataDir=/usr/local/zookeeper/data/
clientPort=2181
server.1=172.16.100.94:2888:3888
server.2=172.16.100.95:2888:3888
server.3=172.16.101.50:2888:3888
#cd /usr/local/zookeeper/data
#echo "1" > myid (第一台为1、第二台为2、第三台为3)
配置完后启动zookeeper(三台都启动)
#cd //usr/local/zookeeper/bin
#./zkServer.sh start
#./zkServer.sh status (若一个为leader,两个follower为正常)
hadoop安装
创建hadoop 用户,使用hadoop用户创建master到node节点登录免密,node3到各个节点免密
#useradd -d /usr/hadoop hadoop
#passwd hadoop
配置免秘钥登录:
#su hadoop
$ssh-keygen -t rsa (一直回车)
$cd /usr/hadoop/.ssh/
$vim authorized_keys
$chmod 600 authorized_keys (将其他机器该路径的id_rsa.pub 文件复制到该文件即可,测试)
安装hadoop,可以先在一台上安装然后同步到另外三台机器上面,也可以都先把包下载到各个主机上面解压到相同目录然后在第一台上面修改需要修改的文件,然后将文件同步到其他的机器上面,本次使用的第二个,四台做以下操作
$cd /usr/local/src
$wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-3.0.3/hadoop-3.0.3.tar.gz
$tar zxvf hadoop-3.0.3.tar.gz
$mv hadoop-3.0.3/ /usr/hadoop/
在master上操作:
第一步在hadoop-env.sh和mapred-env.sh还有yarn-env.sh中写上你的jdk路径,然后将这三个文件同步到其他主机上面去
修改hadoop的环境变量
$vim ~/.bashrc (将以下添加到该文件,每台都需要设置)
export HADOOP_HOME=/usr/hadoop
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
修改配置文件:
$cd /usr/hadoop/etc/hadoop
$vim 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/hadoop/namenode</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
</configuration>
修改hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/hadoop/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/hadoop/datanode</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址,nn1所在地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>master:8020</value>
</property>
<!-- nn1的http通信地址,外部访问地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>master:50070</value>
</property>
<!-- nn2的RPC通信地址,nn2所在地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>node3:8020</value>
</property>
<!-- nn2的http通信地址,外部访问地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>node3:50070</value>
</property>
<!--namenode1 RPC端口 -->
<!-- 指定NameNode的元数据在JournalNode日志上的存放位置(一般和zookeeper部署在一起) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/hadoop/journal</value>
</property>
<!--客户端通过代理访问namenode,访问文件系统,HDFS 客户端与Active 节点通信的Java 类,使用其确定Active 节点是否活跃 -->
<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</value>
</property>
<!-- 这个是使用sshfence隔离机制时才需要配置ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/usr/hadoop/.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>
修改mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
然后在该路径创建workers文件,信息如下:
node1
node2
node3
配置文件修改完毕,将以上做的修改同步到其他3台主机上面
启动过程:
1、启动zookeeper集群
在node1,node2, node3节点执行如下命令:
./bin/zkServer.sh start
2、格式化zk集群
master上执行:
/bin/hdfs zkfc -formatZK
3、启动journalnode集群
node1, node2, node2上执行:
./sbin/hadoop-daemon.sh start journalnode
4、格式化namenode
master上执行:
./bin/hdfs namenode -format
5、启动datanode
node1, node2, node3上执行:
./sbin/hadoop-daemon.sh start datanode
6、启动namenode
master:
./sbin/hadoop-daemon.sh start namenode
node3(namenode2):
./bin/hdfs namenode -bootstrapStandby
./sbin/hadoop-daemon.sh start namenode
此时namenode1(master)和namenode2(node3)同时处于standby状态。
$hdfs haadmin -getServiceState nn1 (查看master的name状态)
$hdfs haadmin -getServiceState nn2(查看master2(node3)的name状态)
7、启动zkfc服务
在namenode1(master)和namenode2(node2)上同时执行如下命令:
./sbin/hadoop-daemon.sh start zkfc
8、功能验证,完毕
扩展:
也可手动切换状态
$ bin/hdfs haadmin -transitionToActive nn1 ##切换成active
$ bin/hdfs haadmin -transitionToStandby nn1 ##切换成standby
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
以上为nanmenode 节点搭建高可用,下面为ResourceManager,高可用配置
规划:把master上面的ResourceManager做主,node3上面做备份节点
修改配置文件yarn-site.xml :
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node3</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
</configuration>
然后同步各个节点。
$scp yarn-site.xml node1:/usr/hadoop/etc/hadoop/
$scp yarn-site.xml node2:/usr/hadoop/etc/hadoop/
$scp yarn-site.xml node3:/usr/hadoop/etc/hadoop/
启动节点,在master、node3上面启动
$cd /usr/hadoop/sbin
$./yarn-daemon.sh start resourcemanager
查看状态:
$yarn rmadmin -getServiceState rm1 (查看1的yarn的状态)
$yarn rmadmin -getServiceState rm2 (查看2的yarn的状态)
测试: jps 查看master上面resourcemanager的pid,然后杀掉,
查看node3上面的resourcemanager的节点状态