1 .Hadoop HA 说明
1.1 Hadoop HA主备介绍
自Hadoop2.x版本后可以增加多个namenode节点【保存着整个系统的名称空间和文件数据块的地址映射又称“元数据”】,多个namenode有活跃(active)和 准备(Standby)两种状态 , 即一个帮派有一个正一个副,平时都是正帮主主持大局,但如果正帮主遭遇不测被Kill S掉后,这时候副帮主就得出来主持大局了。
1.2 Hadoop HA选举介绍
Hadoop HA 的正帮主(active)选举一般都要借助长老会(Zookeeper)帮助。长老会保存着每个帮会成员的生命水晶,生命水晶一般会检测到每个帮员生命特征,一但生命水晶熄灭也就代表人死亡。长老会会定时查看帮主的生命水晶状况,一但帮主生命水晶熄灭,长老会会立刻在副帮主之间推选出新的正帮主,从而继续管理帮内事务。
1.3 Hadoop HA同步机制(QJM)
当长老会(Zookeeper)推选出新的正帮主,那被推出的帮主他是如何快速接手帮内事务呢?答案是正副帮主之间有一个小本本,这个小本本记录着大小帮内的事务,帮主会将帮内事务写在这个正副帮主共享的小本本上面,所以一但帮主惨遭不测,其他帮主凭借帮主小本本也能快速上位处理帮内事务。
2. Hadoop HA 部署
2.1部署前的环境配置:
2.2 Hadoop 节点部署
ip | 主机名 | 服务 | 备注 |
---|---|---|---|
192.168.216.111 | hadoop01 | jdk、NameNode、DataNode、JouranlNode、ResourceManger、NodeManager | 正帮主 |
192.168.216.112 | hadoop02 | jdk、NameNode、DataNode、JouranlNode、ResourceManger、NodeManager | 副帮主 |
192.168.216.113 | hadoop03 | jdk、DataNode、JouranlNode、NodeManager |
# 解压Hadoop
[root@hadoop01 src]# tar -zxvf /home/hadoop-2.7.6.tar.gz -C /usr/local/src/
#配置hadoop环境变量
[root@hadoop01 src]# vi /etc/profile
#增加jdk、zookeeper、hadoop的地址
#注意:要添加你自己解压所在的地址,下面是我的解压地址
export JAVA_HOME=/usr/local/src/jdk1.8.0_152/
export ZK_HOME=/usr/local/src/zookeeper-3.4.10/
export HADOOP_HOME=/usr/local/src/hadoop-2.7.6/
export PATH=$PATH:$JAVA_HOME/bin:$ZK_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
#刷新环境变量
[root@hadoop01 src]# source /etc/profile
NameNode和ResourceManager配置高可用大概需要配置如下6个配置文件:
2.1.1 core-site.xml
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/core-site.xml
<configuration>
<!--指定hdfs文件系统的默认名-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://sw</value>
</property>
<!--指定zk的集群地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!--指定hadoop的临时目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadata/tmp</value>
</property>
</configuration>
注意 " fs.defaultFS "和 " fs.default.name"的区别:
- 使用 " fs.defaultFS “首先会判断Hadoop是否开启HA(高可用),使用” fs.defaultFS "一般使用在Hadoop HA
- 使用 " fs.default.name "一般在单一的Namenode节点(一个帮就一个帮主) ,如果在单一的Namenode节点用 " fs.defaultFS "就会报错
2.1.2 hdfs-site.xml
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/hdfs-site.xml
<configuration>
<!--指定块的副本数,默认是3-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--指定数据块的大小-->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<!--指定namenode的元数据目录-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadata/dfs/name</value>
</property>
<!--指定datanode存储数据目录-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadata/dfs/data</value>
</property>
<!--hdfs的命名空间,逻辑名称-->
<property>
<name>dfs.nameservices</name>
<value>sw</value>
</property>
<!--qianfeng下的namenode的别名-->
<property>
<name>dfs.ha.namenodes.sw</name>
<value>nn1,nn2</value>
</property>
<!--指定nn1和nn2的通信地址-->
<property>
<name>dfs.namenode.rpc-address.qianfeng.nn1</name>
<value>hadoop01:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.qianfeng.nn2</name>
<value>hadoop02:9000</value>
</property>
<!--指定namenode的web通信地址-->
<property>
<name>dfs.namenode.http-address.qianfeng.nn1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.qianfeng.nn2</name>
<value>hadoop02:50070</value>
</property>
<!--指定共享日志目录, 这个就是帮主的小本本-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/sw</value>
</property>
<!--指定开启namenode失败自动转移,这个就是长老会根据生命水晶检测选举新帮主-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--指定失败转移的类-->
<property>
<name>dfs.client.failover.proxy.provider.qianfeng</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--防止namenode的脑裂-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--指定超时时间设置-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!--指定日志的本地目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadata/journal1</value>
</property>
<!--是否开启webhdfs的-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!--是否开启hdfs的权限-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
2.1.3 mapred-site.xml
[root@hadoop01 hadoop-2.7.6]# mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/mapred-site.xml
<configuration>
<!--配置mapreduce的框架名称-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<final>true</final>
</property>
<!--指定jobhistoryserver的内部通信地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<!--指定jobhistoryserver的web地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
</configuration>
jobhistoryserver: 历史服务器,管理者可以通过历史服务器查看已经运行完成的Mapreduce作业记录。
2.1.4 yarn-site.xml
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/yarn-site.xml
<configuration>
<!--指定mapreduce的shuffle服务-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--是否开启yarn的HA-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>sw_yarn</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop02</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop02:8088</value>
</property>
<!--指定zookeeper的集群地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
2.1.5 slaves
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/slaves
hadoop01
hadoop02
hadoop03
2.1.6 hadoop-env.sh
[root@hadoop01 hadoop-2.7.6]# vi ./etc/hadoop/hadoop-env.sh
#添加jdk路径
export JAVA_HOME=/usr/local/src/jdk1.8.0_152/
3. Hadoop HA 开启
3.1 先启动三台的Zookeeper
#节点1
[root@hadoop01 hadoop-2.7.6]# zkServer.sh start
#节点2
[root@hadoop02 hadoop-2.7.6]# zkServer.sh start
#节点3
[root@hadoop03 hadoop-2.7.6]# zkServer.sh start
3.2 启动 JournalNode
JournalNode : 作为独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。(即帮主会把本帮的事务写在小本本上,副帮主也能同时获取小本本的记录)
[root@hadoop01 hadoop-2.7.6]# hadoop-daemons.sh start journalnode
3.3 namenode格式化并启动
HDFS集群有两类节点以管理节点-工作节点模式运行,即一个namenode(管理节点)和多个datanode(工作节点)。
namenode(管理文件系统的命名空间):它维护着文件系统树及整棵树内的所有文件和目录。namenode以两个文件形式永久保存在本地磁盘上 ”命名空间镜像文件“ 和 ”编辑日志文件“。
[root@hadoop01 ~]# hdfs namenode -format
[root@hadoop01 ~]# hadoop-daemon.sh start namenode
3.4 另外的namenode节点同步
副帮主查看帮主在小本本写的”羞羞“事,并记录在自己这里
[root@hadoop02 ~]# hdfs namenode -bootstrapStandby
3.5 格式化zkfc
#选择其中一个namenode节点进行格式化zkfc
#前提QuorumPeerMain服务必须处于开启状态,客户端zkfc才能格式化成功
[root@hadoop01 ~]# hdfs zkfc -formatZK
3.6 启动集群
[root@hadoop01 ~]# start-all.sh