原来你是这样的Hadoop HA?

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部署前的环境配置:
  1. jdk1.8安装并配置环境变量
  2. ssh免密,注意因为是多帮主帮派(namenode)故在“两个帮主”(namenode)节点生成密钥分别分发给所以节点

  3. Zookeeper安装,每个节点都要安装。

2.2 Hadoop 节点部署
ip主机名服务备注
192.168.216.111hadoop01jdk、NameNode、DataNode、JouranlNode、ResourceManger、NodeManager正帮主
192.168.216.112hadoop02jdk、NameNode、DataNode、JouranlNode、ResourceManger、NodeManager副帮主
192.168.216.113hadoop03jdk、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"的区别:
  1. 使用 " fs.defaultFS “首先会判断Hadoop是否开启HA(高可用),使用” fs.defaultFS "一般使用在Hadoop HA
  2. 使用 " 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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏日先锋小队长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值