本文主要是介绍hadoop HA (高可用 high available)的搭建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
hadoop HA 的搭建
- hadoop HA 需求来源
- 为什么要搭建hadoop HA?
- 如何实现高可用?
- 如何写入zookeeper数据?
- hadoop HA 的搭建:
- 搭建准备
- 开始搭建
- 启动集群
hadoop HA 需求来源
为什么要搭建hadoop HA?
在hadoop 2.0之前,整个hdfs集群中只有一个nn,所以一旦nn节点宕机,则整个集群无法使用。这种现象称为单点故障。
解决办法: 设置2个namenode
在hadoop2.0之前,一个集群只能有一个nn,2.0可以设计2个nn,3.0可以支持多个nn。
在hadoop 2.0里,设计的2个nn,在同一时间,只有一个namenode对外提供服务,将这个称为 active namenode;另一个处于热备份状态,叫 standby namenode。一旦active namenode 宕机的时候,standby namenode 就立即无缝切换为 active namenode。 对于客户端来说,觉得集群是24小时都处于对外服务状态。 不过,宕机的namenode即使复活了,也只能做 standby 了。
- Active namenode:
- 只能有一个,正在活跃的,处理dn,客户端等。 Standby namenode:
- Active nomenode的热备。
如何实现高可用?
要想实现高可用,必须保证:
- 1)active 和 standby 的元数据,必须实时保持一致性
namenode的元数据,核心的有两部分:-
1.1)fsimage:磁盘元数据文件 (初始化的fsimage文件 (hdfs格式化时自己生成) + edits 定期合并而来)
所以 active 和 standby 要保持一致,只需要保证初始化的 fsimage 和 edits 保持一致即可。- 1.1.1)初始化的 fsimage 文件保持一致
将这个初始化的 fsimage 文件发送给另一个namenode就可以了。 - 1.1.2)保证 edits 文件保持一致
edits文件是持续性产生的,所以保证active 和 standby 的一致性,核心是保证active 和 standby 的 edits 文件实时一致即可。 active 将 edits 文件 存入 QJM 平台,standby 会时刻监听 QJM 平台 edits 文件的更新,一旦有更新,standby 会立即将更新的 edits 文件拉取到自己的节点。
- 1.1.1)初始化的 fsimage 文件保持一致
-
1.2)edits:编辑日志文件
-
- 2)active 和 standby 的状态信息一致,standby 实时感知active的存活状态。
借助于zookeeper,active可以将状态信息写入zookeeper中,standby监听zookeeper对应的状态信息节点,一旦发现状态信息改变了,立即将自己的状态切换为active,同时修改zookeeper中的状态信息。
切换过程中,为了避免发生脑裂(集群中有两个active namenode),standby在切换为active之前,会向active发送一个shell命令(kill -9,init 0),确保原来的active是宕机的。
如何写入zookeeper数据?
- active的namenode通过zkfc(zookeeper failoverControler)将数据写入zookeeper中。
- standby也通过zkfc获取zookeeper中active namenode的状态信息。
注意: zkfc是hadoop自带的,和namenode安装在同一个节点
hadoop HA 的搭建:
搭建准备
1)依赖环境
jdk
linux 用户 ip hosts 免密 用户设置。。。 9步
2)集群规划(重点)
hdfs规划如下:
namenode--2个
zkfc--2个
datanode--3个
jounalnode --3个
yarn resourcemanager --2个
nodemanager--3个
进程规划如下:
项目 | hadoop01进程 | hadoop02进程 | hadoop03进程 |
---|---|---|---|
hdfs | namenode | namenode | |
hdfs | zkfc | zkfc | |
hdfs | datanode | datanode | datanode |
hdfs | jounalnode | jounalnode | jounalnode |
yarn | resourcemanager | resourcemanager | |
yarn | nodemanager | nodemanager | nodemanager |
zookeeper | QuorumPeerMain | QuorumPeerMain | QuorumPeerMain |
总计 | 6个进程 | 7个进程 | 5个进程 |
开始搭建
1)上传
2)解压
tar -xvzf hadoop-2.7.7.tar.gz
3)配置环境变量
export HADOOP_HOME=/home/hadoop/app/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbinsource /etc/profilehadoop version
4)修改hadoop的配置文件
/home/hadoop/app/hadoop-2.7.7/etc/hadoop 下面1.) hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.8.0_732.) slaves 从节点 datanode|nodemanager
hadoop01
hadoop02
hadoop033.) core-site.xml
hadoop fs -ls /
hadoop fs -ls hdfs://hadoop01:9000/<!-- 指定hdfs的访问的url入口 完全分布式 hdfs://hadoop01:9000 高可用中 给的是一个nameservice bd1904 组名 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bd1904/</value>
</property><!-- 指定 hadoop 工作目录 namenode datanode -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/hadoopdata/</value>
</property><!-- 指定 zookeeper 集群访问地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>4.hdfs-site.xml<!-- 指定副本数 --><property><name>dfs.replication</name><value>2</value></property><!--指定 hdfs 的 nameservice 为 bd1904,需要和 core-site.xml 中保持一致--><property><name>dfs.nameservices</name><value>bd1904</value></property><!-- bd1904 下面有两个 NameNode,分别是 nn1,nn2 --><property><name>dfs.ha.namenodes.bd1904</name><value>nn1,nn2</value></property><!-- nn1 的 RPC 通信地址 --><property><name>dfs.namenode.rpc-address.bd1904.nn1</name><value>hadoop01:8020</value></property><!-- nn1 的 http 通信地址 --><property><name>dfs.namenode.http-address.bd1904.nn1</name><value>hadoop01:50070</value></property><!-- nn2 的 RPC 通信地址 --><property><name>dfs.namenode.rpc-address.bd1904.nn2</name><value>hadoop02:8020</value></property><!-- nn2 的 http 通信地址 --><property><name>dfs.namenode.http-address.bd1904.nn2</name><value>hadoop02:50070</value></property><!-- 指定 NameNode 的 edits 元数据在 JournalNode 上的存放位置 qjm节点 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/bd1904</value></property><!-- 指定 JournalNode 在本地磁盘存放数据的位置 --><property><name>dfs.journalnode.edits.dir</name><value>/home/hadoop/data/hadoopdata/journaldata</value></property><!-- 开启 NameNode 失败自动切换 --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property><!-- 配置失败自动切换实现方式 -->
<!-- 此处配置在安装的时候切记检查不要换行--><property><name>dfs.client.failover.proxy.provider.bd1904</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--><property><name>dfs.ha.fencing.methods</name><value>sshfenceshell(/bin/true)</value></property><!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 --><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/hadoop/.ssh/id_rsa</value></property><!-- 配置 sshfence 隔离机制超时时间 --><property><name>dfs.ha.fencing.ssh.connect-timeout</name><value>30000</value></property>5.mapred-site.xmlmv mapred-site.xml.template mapred-site.xml<!-- 指定 mr 框架为 yarn 方式 --><property><name>mapreduce.framework.name</name><value>yarn</value></property><!-- 设置 mapreduce 的历史服务器地址和端口号 --><property><name>mapreduce.jobhistory.address</name><value>hadoop03:10020</value></property>
<!-- mapreduce 历史服务器的 web 访问地址 --><property><name>mapreduce.jobhistory.webapp.address</name><value>hadoop03:19888</value></property>6.yarn-site.xml<!-- 开启 RM 高可用 --><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><!-- 指定 RM 的 cluster id rm 组名--><property><name>yarn.resourcemanager.cluster-id</name><value>yarnbd1904</value></property><!-- 指定 RM 的名字 --><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><!-- 分别指定 RM 的地址 --><property><name>yarn.resourcemanager.hostname.rm1</name><value>hadoop02</value></property><property><name>yarn.resourcemanager.hostname.rm2</name><value>hadoop03</value></property><!-- 指定 zk 集群地址 --><property><name>yarn.resourcemanager.zk-address</name><value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value></property><!-- 要运行 MapReduce 程序必须配置的附属服务 --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><!-- 开启 YARN 集群的日志聚合功能 --><property><name>yarn.log-aggregation-enable</name><value>true</value></property><!-- YARN 集群的聚合日志最长保留时长 --><property><name>yarn.log-aggregation.retain-seconds</name><value>86400</value></property><!-- 启用自动恢复 --><property><name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property><!-- 制定 resourcemanager 的状态信息存储在 zookeeper 集群上--><property><name>yarn.resourcemanager.store.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property>
5)远程发送
scp -r hadoop-2.7.7 hadoop01:/home/hadoop/app/
scp -r hadoop-2.7.7 hadoop03:/home/hadoop/app/scp -r hadoop-2.7.7 hadoop01:/home/jacob/app/sudo scp /etc/profile hadoop01:/etc
sudo scp /etc/profile hadoop03:/etcsource /etc/profile
启动集群
6)启动集群(以下步骤 严格按照顺序执行)
1)启动zk zkServer.sh start 2)启动qjm平台 启动journalnode进程3个节点的分别执行hadoop-daemon.sh start journalnode3)格式化hdfs namenode 在其中一个namenode节点执行 hadoop01 hadoop namenode -format 格式化元数据磁盘目录4)将hadoop01上的namenode的相关元数据信息 远程发送到另一个namenode节点scp -r /home/hadoop/data/hadoopdata/* hadoop02:/home/hadoop/data/hadoopdata/scp -r /home/jacob/data/hadoopdata/* hadoop02:/home/jacob/data/hadoopdata/5)初始化zkfc (在zkfc的一个节点执行)hdfs zkfc -formatZK看到 Successfully created /hadoop-ha/bd1904 in ZK. 这句话时表示成功目的是 在zk中创建对应的存储namenode的状态信息的节点6)启动 start-dfs.sh 任意节点启动start-yarn.sh 在yarn的其中一个主节点启动另一个yarn的主节点单独启动 resourcemanager命令:yarn-daemon.sh start resourcemanager也可以使用图形界面查看,在浏览器中查看:查看namenode状态:hadoop01:50070 或 hadoop02:50070查看resourcemanager的状态:hadoop02:8088 或 hadoop03:8088
关闭集群的顺序:
1)关闭hdfs stop-dfs.sh 任意节点2)关闭yarnstop-yarn.sh yarn的其中一个主节点yarn-daemon.sh stop resourcemanager3)关闭zk zkServer.sh stop 3个节点的分别执行
集群再次启动顺序
1)启动zk 2)启动hdfs 3)启动yarn
这篇关于hadoop HA (高可用 high available)的搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!