系列博客目录链接:Hadoop权威指南学习笔记:总章
基础环境搭建:使用3台虚拟机搭建Hadoop HA集群(1)
HA环境搭建:使用3台虚拟机搭建Hadoop HA集群(2)
本部分包含以下基本分内容
鉴于 ZooKeeper 本身的特点,服务器集群的节点数推荐设置为奇数台。按照计划,此处规划三台。
操作节点:cloud2
官方下载链接如下:https://archive.apache.org/dist/zookeeper/ 。 选择合适版本下载。此处使用的是zookeeper 3.4.8版本。
操作节点:cloud2
tar -zxvf zookeeper-3.4.8.tar.gz
mv zookeeper-3.4.8 /home/hadoop/apps
cd /home/hadoop/apps
ln -s zookeeper-3.4.8 zookeeper
此处我将解压后的zookeeper文件夹统一放置于/home/hadoop/apps下,Hadoop同此,下面不再解释。
操作节点:cloud2
hadoop@cloud2:~/apps$ cd zookeeper/conf
hadoop@cloud2:~/apps/zookeeper/conf$ ls
configuration.xsl log4j.properties zoo_sample.cfg
hadoop@cloud2:~/apps/zookeeper/conf$ cp zoo_sample.cfg zoo.cfg
原始配置文件内包含以下四个配置,进行以下简要说明:
我们需要做的包含两项
a. 修改dataDir目录位置,我此处指定为/home/hadoop/data/zookeeper/data
b. 文件末尾追加:
dataLogDir=/home/hadoop/data/zookeeper/log
server.1=a.cloud.ha:2888:3888
server.2=b.cloud.ha:2888:3888
server.3=c.cloud.ha:2888:3888
其中dataLogDir为日志文件位置,后者格式如下:
server.serverid=host:tickpot:electionport
server:固定写法
serverid:每个服务器的指定ID(必须处于1-255之间,必须每一台机器不能重复)
host:主机名
tickpot:心跳通信端口
electionport:选举端口
操作节点:cloud1、cloud2、cloud3
将cloud2配置好的zookeeper文件发送至cloud1和cloud3,然后分别在对应节点创建数据目录及日志目录。步骤不再重复。
分发完文件后,我们需要在数据文件夹下创建一个名为myid的文件,内容为当前节点对应得serverid,如下图:
操作节点 cloud1、cloud2、cloud3
sudo vim /etc/profile
文末添加
export ZOOKEEPER_HOME=/home/hadoop/apps/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
加载环境变量
source /etc/profile
至此,zookeeper集群配置完成
操作节点:cloud1
Hadoop各版本官方下载链接:https://archive.apache.org/dist/hadoop/common/,请选择合适的版本下载。本集群统一采用Hadoop-2.6.5版本。
操作节点:cloud1
将下载后的压缩文件移到/home/hadoop/apps/目录下,执行解压命令:
cd /home/hadoop/apps/
tar -zxvf hadoop-2.6.5.tar.gz
创建连接文件:
ln -s hadoop-2.6.5 hadoop
操作节点:cloud1
hadoop的配置文件默认位于hadoop安装目录的etc/hadoop
目录下,本例为/home/hadoop/apps/hadoop/etc/hadoop
。
a. 修改hadoop-env.sh
hadoop@cloud1:~/apps/hadoop/etc/hadoop$ echo $JAVA_HOME
/usr/java/jdk
hadoop@cloud1:~/apps/hadoop/etc/hadoop$ vim hadoop-env.sh
b. 修改core-site.xml
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://mycloud/value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/home/hadoop/data/hadoop/tmpvalue>
property>
<property>
<name>ha.zookeeper.quorumname>
<value>a.cloud.ha:2181,b.cloud.ha:2181,c.cloud.ha:2181value>
property>
<property>
<name>ha.zookeeper.session-timeout.msname>
<value>1000value>
<description>msdescription>
property>
configuration>
c. 配置hdfs-site.xml。按照计划,namenode配置在域名为a.cloud.ha和b.cloud.ha两台节点上。配置中设计到的相关目录需要自己根据自己情况创建。
<configuration>
<property>
<name>dfs.replicationname>
<value>2value>
property>
<property>
<name>dfs.namenode.name.dirname>
<value>file:///home/hadoop/data/hadoop/hdfs/namevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>file:///home/hadoop/data/hadoop/hdfs/datavalue>
property>
<property>
<name>dfs.webhdfs.enabledname>
<value>truevalue>
property>
<property>
<name>dfs.nameservicesname>
<value>mycloudvalue>
property>
<property>
<name>dfs.ha.namenodes.mycloudname>
<value>nn1,nn2value>
property>
<property>
<name>dfs.namenode.rpc-address.mycloud.nn1name>
<value>a.cloud.ha:9000value>
property>
<property>
<name>dfs.namenode.http-address.mycloud.nn1name>
<value>a.cloud.ha:50070value>
property>
<property>
<name>dfs.namenode.rpc-address.mycloud.nn2name>
<value>b.cloud.ha:9000value>
property>
<property>
<name>dfs.namenode.http-address.mycloud.nn2name>
<value>b.cloud.ha:50070value>
property>
<property>
<name>dfs.namenode.shared.edits.dirname>
<value>qjournal://a.cloud.ha:8485;b.cloud.ha:8485;c.cloud.ha:8485/mycloudvalue>
property>
<property>
<name>dfs.journalnode.edits.dirname>
<value>/home/hadoop/data/hadoop/journal/datavalue>
property>
<property>
<name>dfs.ha.automatic-failover.enabledname>
<value>truevalue>
property>
<property>
<name>dfs.client.failover.proxy.provider.mycloudname>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue>
property>
<property>
<name>dfs.ha.fencing.methodsname>
<value>
sshfence
shell(/bin/true)
value>
property>
<property>
<name>dfs.ha.fencing.ssh.private-key-filesname>
<value>/home/hadoop/.ssh/id_rsavalue>
property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeoutname>
<value>30000value>
property>
<property>
<name>ha.failover-controller.cli-check.rpc-timeout.msname>
<value>60000value>
property>
configuration>
d. 修改mapred-site.xml
hadoop@cloud1:~/apps/hadoop/etc/hadoop$ cp mapred-site.xml.template mapred-site.xml
hadoop@cloud1:~/apps/hadoop/etc/hadoop$ vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>mapreduce.jobhistory.addressname>
<value>a.cloud.ha:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>a.cloud.ha:19888value>
property>
configuration>
e. 修改yarn-site.xml。按照计划,ResourceManager配置在域名为a.cloud.ha和b.cloud.ha两台节点上。
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabledname>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.cluster-idname>
<value>yrcvalue>
property>
<property>
<name>yarn.resourcemanager.ha.rm-idsname>
<value>rm1,rm2value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm1name>
<value>b.cloud.havalue>
property>
<property>
<name>yarn.resourcemanager.hostname.rm2name>
<value>c.cloud.havalue>
property>
<property>
<name>yarn.resourcemanager.zk-addressname>
<value>a.cloud.ha:2181,b.cloud.ha:2181,c.cloud.ha:2181value>
property>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>yarn.log-aggregation.retain-secondsname>
<value>86400value>
property>
<property>
<name>yarn.resourcemanager.recovery.enabledname>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.store.classname>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStorevalue>
property>
f. 修改slave。按照计划,在域名为b.cloud.ha,c.cloud.ha的两台节点部署namenode和nodemanager。
b.cloud.ha
c.cloud.ha
g. 分发文件。此处将整个hadoop文件夹分发到剩余两台节点。所有节点hadoop文件夹皆在/home/hadoop/apps/
目录下。
操作节点:cloud1、cloud2、cloud3
在/etc/profile
末尾追加:
export HADOOP_HOME=/home/hadoop/apps/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
加载环境变量
source /etc/profile
执行hadoop version
验证环境变量配置,无异常表示配置完成
请务必按步骤依次操作,需要在两个及以上节点操作的,一定要在所有节点操作进行完成后,再继续下一个步骤,否则会产生不可预知错误。
操作节点:cloud1、cloud2、cloud3
依次在所有节点手动执行zkServer.sh start
来启动zookeeper节点。使用zkServer.sh status
和jps
命令查看启动状态。
操作节点:cloud1、cloud2、cloud3
按照计划,我们会在所有节点启动journalNode,因此以下命令需要在三台节点分别执行。
hadoop-daemon.sh start journalnode
操作节点:cloud1或cloud2
按照计划,我们会在cloud1和cloud2启动一主一备NameNode,任一节点操作即可。此处选用cloud1
hadoop namenode -format
第三步在cloud1进行了NameNode格式化,此处我们要在cloud2进行格式化。
hadoop@cloud1:hadoop namenode -bootstrapStandby
操作节点:cloud1、cloud2
按照计划,zkfc在cloud1、cloud2运行。事实上,zkfc也只能在NameNode上运行。启动之前,我们需要首先格式化zkfc。
a. 格式化zkfc,在任一NameNode节点操作即可。
hdfs zkfc -formatZK
b. 启动zkfc,此步骤需要在两个NameNode操作。
hadoop-daemon.sh start zkfc
启动完成后,使用jps命令应该可以看到DFSZKFailoverController
进程。
操作节点:cloud2
在cloud2执行以下命令启动HDFS及Yarn。启动相应服务需要在相应服务的主节点上启动。因为ResourceManager和Namenode在cloud2上皆有服务,故在cloud2启动
start-dfs.sh;start-yarn.sh
操作节点:cloud1
mr-jobhistory-daemon.sh start historyserver
操作节点:任一节点即可
a. 经过以上所有步骤之后,各个节点包含的服务应该如下图:分别与计划中规划的服务对应
对于任意节点没有起来的进程,可通过hadoop-daemon.sh启动HDFS系列组件或通过yarn-daemon.sh启动Yarn相关组件,但启动之前应该首先将错误排除。
b. 命令行检查主服务节点状态:
hadoop@cloud1:~/apps/hadoop/etc/hadoop$ hdfs haadmin -getServiceState nn1
active
hadoop@cloud1:~/apps/hadoop/etc/hadoop$ hdfs haadmin -getServiceState nn2
standby
hadoop@cloud1:~/apps/hadoop/etc/hadoop$ yarn rmadmin -getServiceState rm1
18/12/17 19:28:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
active
hadoop@cloud1:~/apps/hadoop/etc/hadoop$ yarn rmadmin -getServiceState rm2
18/12/17 19:28:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
standby
至此,HA集群搭建完毕。关于集群的kill测试,可以根据以下几方面测试,此处不再叙述。