您的位置:首页 > 运维架构 > 网站架构

Hadoop 2.x高可用性部署

2016-11-12 21:36 267 查看

一、HDFS HA(高可用性)原理

  在Hadoop2.0.0之前,NameNode(NN)在HDFS集群中存在单点故障(single point of failure),每一个集群中存在一个NameNode,如果NN所在的机器出现了故障,那么将导致整个集群无法利用,直到NN重启或者在另一台主机上启动NN守护线程。

  主要在两方面影响了HDFS的可用性:

  (1)在不可预测的情况下,如果NN所在的机器崩溃了,整个集群将无法利用,直到NN被重新启动;

  (2)在可预知的情况下,比如NN所在的机器硬件或者软件需要升级,将导致集群宕机。

  HDFS的高可用性将通过在同一个集群中运行两个NN(active NN & standby NN)来解决上面两个问题,这种方案允许在机器破溃或者机器维护快速地启用一个新的NN来恢复故障。

  在典型的HA集群中,通常有两台不同的机器充当NN。在任何时间,只有一台机器处于Active状态;另一台机器是处于Standby状态。Active NN负责集群中所有客户端的操作;而Standby NN主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢复。

  为了让 Standby NN的状态和Active NN保持同步,即元数据保持一致,它们都将会和JournalNodes守护进程通信。当Active NN执行任何有关命名空间的修改,它需要持久化到一半以上的JournalNodes上(通过edits log持久化存储),而Standby NN负责观察edits log的变化,它能够读取从JNs中读取edits信息,并更新其内部的命名空间。一旦Active NN出现故障,Standby NN将会保证从JNs中读出了全部的Edits,然后切换成Active状态。Standby NN读取全部的edits可确保发生故障转移之前,是和Active NN拥有完全同步的命名空间状态。

  为了提供快速的故障恢复,Standby NN也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的Database将配置好Active NN和Standby NN的位置,并向它们发送块文件所在的位置及心跳,如下图所示:

  


  Hadoop2.2.0中HDFS的高可用性实现原理

  

  在任何时候,集群中只有一个NN处于Active 状态是极其重要的。否则,在两个Active NN的状态下NameSpace状态将会出现分歧,这将会导致数据的丢失及其它不正确的结果。为了保证这种情况不会发生,在任何时间,JNs只允许一个 NN充当writer。在故障恢复期间,将要变成Active 状态的NN将取得writer的角色,并阻止另外一个NN继续处于Active状态。

  为了部署HA集群,你需要准备以下事项:

  (1)NameNode machines:运行Active NN和Standby NN的机器需要相同的硬件配置;

  (2)JournalNode machines:也就是运行JN的机器。JN守护进程相对来说比较轻量,所以这些守护进程可以可其他守护线程(比如NN,YARN ResourceManager)运行在同一台机器上。在一个集群中,最少要运行3个JN守护进程,这将使得系统有一定的容错能力。当然,你也可以运行3 个以上的JN,但是为了增加系统的容错能力,你应该运行奇数个JN(3、5、7等),当运行N个JN,系统将最多容忍(N-1)/2个JN崩溃。

在HA集群中,Standby NN也执行namespace状态的checkpoints,所以不必要运行Secondary NN、CheckpointNode和BackupNode;事实上,运行这些守护进程是错误的。

二、HDFS HA配置步骤

首先在配置之前关闭已经启动的所有进程,(关闭集群)

为了方便起见独立拷贝一份集群模式出来

主要是备份一下etc目录下的hadoop文件夹,data目录下的tmp

之后对etc/hadoop目录下文件做配置



配置文件

core-site.xml中将指定namenode所在机器的属性删除:
fs.defaultFS
,重新配置默认文件系统

<configuration>

<!-- 配置文件指定默认的文件系统,客户端会使用到 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>

<property>
<name>hadoop.tmp.dir</name>
<value>/opt/app/hadoop-2.5.0/data/tmp</value>
</property>

<property>
<name>hadoop.http.staticuser.user</name>
<value>beifeng</value>
</property>

</configuration>


hdfs-site.xml文件将SecondaryNameNode属性删除:
dfs.namenode.secondary.http-address


<configuration>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>

<!-- 指定namenode命名空间名称 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>

<!-- 指定名称(命名空间)下的两个节点 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>

<!-- 指定两台namenode所在的机器位置及交互端口号 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hadoop-senior01.ibeifeng.com:8020</value>
</property>

<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop-senior02.ibeifeng.com:8020</value>
</property>

<!-- 指定两台namenode外部访问的交互端口号 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop-senior01.ibeifeng.com:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop-senior02.ibeifeng.com:50070</value>
</property>

<!-- 指定JN日志节点的共享存储日志目录:不要忘记修改命名空间ns1 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop-senior01.ibeifeng.com:8485;hadoop-senior02.ibeifeng.com:8485;hadoop-senior03.ibeifeng.com:8485/ns1</value>
</property>

<!-- 指定JN本地真正存储日志的目录路径(需要自己手动创建) -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/app/hadoop-2.5.0/data/dfs/jn</value>
</property>

<!-- 配置客户端代理访问属性 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 指定SSH协议方式隔离,并指定用户名 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>

<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/beifeng/.ssh/id_rsa</value>
</property>

</configuration>


对02.03电脑做相同的配置,创建一个目录,备份两个已存在的目录



将配置文件分发到各个节点机器上面

cp -r hadoop/ hadoop-senior03.ibeifeng.com:/opt/app/hadoop-2.5.0/etc/

三、启动QJM HA



进入zookeeper目录cd /opt/app/zookeeper-3.4.5/

启动进程(每一台都要启动):
bin/zkServer.sh start


查看状态:
bin/zkServer.sh status


进程名称:QuorumPeerMain

然后再启动日志节点:cd /opt/app/hadoop-2.5.0/

sbin/hadoop-daemon.sh start journalnode


日志节点进程:journalnode

必须先启动日志节点,否则会导致格式化失败



格式化NameNode

bin/hdfs namenode -format


注意:只需要格式化第一台,第二台的namenode不需要格式化,因为管理的是同一个元数据(命名空间)


启动第一台的namenode

sbin/hadoop-daemon.sh start namenode




同步元数据(记住切换到第二台机器进行执行命令)

bin/hdfs namenode -bootstrapStandby




启动第二台的namenode

sbin/hadoop-daemon.sh start namenode




手动切换

目前两台都是standby状态





在第一台主机:
bin/hdfs haadmin -transitionToActive nn1




启动各个节点的datanode(三台)

sbin/hadoop-daemon.sh start datanode


测试文件数据是否共享

首先在文件系统上创建目录上传文件并读取

bin/hdfs dfs -mkdir -p tmp/conf

bin/hdfs dfs -put etc/hadoop/hdfs-site.xml tmp/conf






然后杀掉其中一台对外提供服务的namenode进程



手动切换另外一台额namenode对外提供服务

bin/hdfs haadmin -transitionToActive nn2 --forceactive






尝试读取文件,查看是否共享数据

bin/hdfs dfs -text tmp/conf/hdfs-site.xml


四、HDFS高可用性HA自动故障转移环境部署

首先在配置之前关闭已经启动的所有进程,(关闭集群):sbin/stop-dfs.sh

1

1

ZKFC作用:

进程名:DFSZKFailoverController

如果单独启动命令:
sbin/hadoop-daemon.sh start zkfc


发生故障,及时进行通知,帮助客户端定位哪个是对外提供服务的namenode,保证任意时刻只有一个namenode对外提供服务

首先要部署一个zookeeper集群

配置文件:hdfs-site.xml

<!-- 代表是否开启自动故障转移功能 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>


配置文件:core-site.xml

<!-- 告知系统运行的是zookeeper的服务,配置zookeeper的地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop-senior01.ibeifeng.com:2181,hadoop-senior02.ibeifeng.com:2181,hadoop-senior03.ibeifeng.com:2181</value>
</property>


分发配置文件

scp -r hadoop/core-site.xml hadoop/hdfs-site.xml hadoop-senior02.ibeifeng.com:/opt/app/hadoop-2.5.0/etc/hadoop/




初始化zookeeper生成znode节点目录

bin/hdfs zkfc -formatZK




进入zookeeperClient查看目录:
bin/zkCli.sh




启动HDFS相关守护进程

sbin/start-dfs.sh




运行一个MR程序,杀掉其中一个进程,观察是否切换成功

创建输入目录:
bin/hdfs dfs -mkdir tmp/input


上传测试数据:
bin/hdfs dfs -put /opt/datas/wc.input /user/beifeng/tmp/input


启动yarn相关进程:

sbin/yarn-daemon.sh start resourcemanager(第二台)
sbin/yarn-daemon.sh start nodemanager(三台全部)


杀死进程之前hadoop-senior01 的NameNode是active状态,hadoop-senior02的NameNode是standby状态

执行MR任务:
bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /user/beifeng/tmp/input /user/beifeng/tmp/output


在map跑完100%时,关掉hadoop-senior01 的NameNode





杀死进程之后hadoop-senior01 的NameNode是standby状态,hadoop-senior02的NameNode是active状态,MR程序能够正常运行结束

五、ResourceManager高可用性HA环境部署

首先在配置之前关闭已经启动的所有进程,(关闭集群)

备份 Hadoop下etc目录下的hadoop文件夹,data目录下的tmp与dfs文件夹



应该是备份分布式集群的配置文件:之前放到了dist-hadoop中



机器02,03也要做备份



三台电脑建议:1,2配置NameNode,2,3配置ResourcesManager

配置文件:yarn-site.xml

将指定ResourceManager所在机器位置属性删除:yarn.resourcemanager.hostname

配置

<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>

<!--指定YARN集群的ID名称-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-cluster</value>
</property>

<!--指定两台ResourceManager的ID名称-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm142,rm143</value>
</property>

<!--指定两台ResourceManager所在的机器位置-->
<property>
<name>yarn.resourcemanager.hostname.rm142</name>
<value>hadoop-senior02.ibeifeng.com</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm143</name>
<value>hadoop-senior03.ibeifeng.com</value>
</property>

<!--指定配置zookeeper的信息,所在机器及端口号-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop-senior01.ibeifeng.com:2181,hadoop-senior02.ibeifeng.com:2181,hadoop-senior03.ibeifeng.com:2181</value>
</property>

<!--指定重新恢复ResourceManager开启-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>

<!--指定ResourceManager信息状态存储的方式,默认在文件系统上,修改为zookeeper,大写的ZK-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>


将配置文件分发到各个节点机器上面去

scp -r etc/hadoop/ hadoop-senior03.ibeifeng.com:/opt/app/hadoop-2.5.0/etc/

注意:如果是重新拷贝一份部署环境的话,先要格式化namenode

bin/hdfs namenode -format 第一台

sbin/hadoop-daemon.sh start namenode 第一台

bin/zkServer.sh start 三台,进程名:QuorumPeerMain

sbin/hadoop-daemon.sh start datanode三台

sbin/yarn-daemon.sh start resourcemanager 第二,第三台

sbin/yarn-daemon.sh start nodemanager 三台

第二台与第三台进程一样



当在第三台运行http://hadoop-senior03.ibeifeng.com:8088 将重定向到第二台机器,

This is standby RM. Redirecting to the current active RM: http://hadoop-senior02.ibeifeng.com:8088/

测试

创建目录:bin/hdfs dfs -mkdir -p mapreduce/input

上传文件:bin/hdfs dfs -put /opt/datas/wc.input mapreduce/input

运行MR程序:

bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /user/beifeng/mapreduce/input /user/beifeng/mapreduce/output

杀掉第二台的ResourceManager进程



此时自动转到第三台机器上运行:

http://hadoop-senior03.ibeifeng.com:8088/cluster



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: