[大数据] hadoop高可用(HA)部署(未完)

摘要:
在Hadoop的全分布式安装中,我们部署了一组全分布式Hadoop集群,包括1个NN和3个DN。在hadoop2.x中,SBNN用于完成SNN功能并提供HA备份。

一、HA部署架构

 [大数据] hadoop高可用(HA)部署(未完)第1张

如上图所示,我们可以将其分为三个部分:

1.NN和DN组成Hadoop业务组件。浅绿色部分。

2.中间深蓝色部分,为Journal Node,其为一个集群,用于提供高可用的共享文件存储(元数据存储)。

3.蓝色部分为Zookeeper,提供自动NN切换。

hadoop全分布式安装 中,我们已经部署了一套全分布式的Hadoop集群,包含1个NN和3个DN。

我们在全分布式的基础上将其中一个DN(安装SNN的节点)变为SBNN(备用NN)。

在全分布式中,存在一个SNN(secondary Node),那是Hadoop 1.x中采用的技术。在hadoop 2.x中,使用SBNN(standby Namenode)来完成SNN的功能,并提供HA 备用。

各部分组件工作原理介绍:

1.NN之间的元数据同步:

  1)多个NN之间要同步的元数据分为两种,静态数据和动态数据。静态数据指HDFS上存放文件的权限、偏移量等信息,动态数据指这些文件存放的块的信息。

  2)静态信息由NN直接持久化到磁盘,而动态数据是由DN向上汇报的。

  3)动态数据的同步,无需多个NN之间传递数据,只需要DN同时向多个NN汇报数据即可。

  4)静态数据则可以通过JN集群或NFS(已淘汰,存在单点故障)来实现。

2.Journal Node:

     1)JN节点组成的集群,用于存放多个NN之间共享的元数据,功能类似于我们在全分布式部署时指定的/var/hadoop文件夹。

  2)当主NN挂掉时,SBNN可以从JN集群中同步元数据。JN集群提供高可用,保证元数据的安全性和一致性。

  3)JN集群的节点数量一般为单数,使用过半机制,例如3个节点的集群可以允许一台宕机,5个节点的集群可以允许两台宕机。如果是偶数(一般不用偶数),6个节点的集群,也只能允许两台宕机。

3.Zookeeper:

  1)每一个NN上存在一个Failover Controller进程(简称ZKFC),即图中蓝色椭圆部分。

  2)Zookeeper提供选举机制,所有的NN通过ZKFC进程向Zookeeper申请成为主节点,即注册,谁注册成功,谁就是主节点,其余的为备用节点。

  3)注册成功的NN会在Zookeeper上产生一个znode节点,节点之下是该NN的信息,我们可以把Zookeeper看成一个小型的数据库。

  4)Zookeeper除了提供注册功能(register),还提供事件监控功能(event)。这里的事件是指NN是否出现故障,由处于NN节点上得ZKFC进程来监听,ZKFC提供健康监控和选举功能。当ZKFC发现NN出现故障,则马山通知Zeekeeper。

  5)Zookeeper知道主节点挂掉后,则会通知SBNN节点(其实是SBNN委托Zookeeper来监控主节点)。

  6)SBNN收到通知后,会将自己的级别从备提升为Active(这里实际上是一个由Zookeeper发起的回调,回调的是客户端的函数,这里的客户端就是ZKFC)。

  7)当SBNN变成ANN后,他会强制性的将前任ANN的Active状态进行变更。避免形成Split brain(脑裂)情况出现。

二、部署时要注意的点(写在前面)

1.由于两个NN之间要互相操作(例如SBNN在NN出现问题的使用要操作NN,杀掉相应进程),所以两台NN之间需要相互做免秘钥登录。

2.在配置好Hadoop后,格式化HDFS之前,要先启动 Journal Nodes

三、节点规划

我们对节点所要担任的角色进行规划:

 NN-1NN-2DNZKZKFCJNN
Node01*   **
Node02 *****
Node03  ** *
Node04  **  

1)NN-1和NN-2表示两个NameNode。

2)ZK集群有3个节点,分别在node02-04。

3)ZKFC一定是对应NameNode的。

4)JNN集群的三个节点分别在node01-03。

四、Hadoop HA配置流程及解释

参照官方文档:

https://hadoop.apache.org/docs/r2.6.5/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

即基于QJM的HA环境搭建,另一种方式基于NFS(不推荐)。

1.NN之间免秘钥操作

# node01上操作
ssh-keygen
-t rsa ssh-copy-id -i /root/.ssh/id_rsa.pub root@node02 ssh-copy-id -i /root/.ssh/id_rsa.pub root@node03 ssh-copy-id -i /root/.ssh/id_rsa.pub root@node04
# node02上操作
ssh-keygen
-t rsa ssh-copy-id -i /root/.ssh/id_rsa.pub root@node01 ssh-copy-id -i /root/.ssh/id_rsa.pub root@node03 ssh-copy-id -i /root/.ssh/id_rsa.pub root@node04

2.配置hdfs-site.xml

参照官方文档中 Deployment 小节的 Configuration details部分:

先在hdfs-site.xml中为HA的多个NN节点定义一个逻辑名称,来代表这一组NN,这里叫mycluster:

<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>

然后定义这里HA有哪些NN节点:

<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>

定义nn1和nn2的确切节点名(这里的nn1要与前面对应,可修改为自己想要的名称):

<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>node01:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>node02:8020</value>
</property>

注意:这里的端口号默认是8020,在前面我们部署的单节点情况下,使用的是9000端口。

定义http的访问端口,即提供WEB访问服务的端口号(这里同单节点一样,使用50070端口):

<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>node01:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>node02:50070</value>
</property>

定义JNN节点的edits.dir:

<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>

注意:这里的格式要正确,只需要修改JN所处的实际节点,端口是8485,最后的mycluster是我们的HA逻辑ID,但可以不与HA逻辑名相同,主要是用于区分多个HA集群共用一个JNN的情况。

指定NN进行故障转移时,使用的代理类(这里照着官方网站配就行):

<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

定义SBNN在要接替前任ANN时,如何来隔离前任ANN(可能是登录前任ANN来杀掉进程),从而保证只有一个Active节点来写JNN,避免Split brain的发生:

这里采用ssh的方式来隔离:

<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>

注意:这里使用的是私钥,需要将id_rsa的绝对路径配置进去。(秘钥有rsa和dsa两种,都可以)

定义JN的edits存放位置(前面配置的dfs.namenode.shared.edits.dir只是指定了JNN的节点位置):

<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/var/hadoop/ha/journalnode</value>
</property>

3.配置core-site.xml

在配置完hdfs-site.xml后,已经定义了逻辑名、包含节点、服务端口等信息。此时,要在core-site.xml中配置对应的信息。

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>

注意:我们之前在部署单NN节点时,这里使用的是hdfs://node01:9000,这里需要修改成HA集群的逻辑ID。

定义数据的存储位置:

<property>
  <name>hadoop.tmp.dir</name>
  <value>/var/hadoop/ha</value>
</property>

注意:将全分布式的/var/hadoop/full修改为/var/hadoop/ha;

4.启动JNN集群(重要)

修改完Hadoop的配置文件,在格式化HDFS之前,需要首先启动JNN集群,否则edits文件没有地方存储,则无法启动Hadoop。

免责声明:文章转载自《[大数据] hadoop高可用(HA)部署(未完)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Hurst指数以及MF-DFADjango解除端口占用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Flink 读写 iceberg

iceberg 0.11 发布的时候稍微尝试了一下,发现实际并没有说的那么厉害,很多功能其实还在开发中(比如: upsert) 贴段之前写的 flink sql: # HADOOP_HOME is your hadoop root directory after unpack the binary package. export HADOOP_CLASS...

卸载Ambari集群

清理ambari安装的hadoop集群本文针对redhat或者centos 对于测试集群,如果通过ambari安装hadoop集群后,想重新再来一次的话,需要清理集群。 对于安装了很多hadoop组件的话,这个工作很繁琐。接下来是我整理的清理过程。 1,通过ambari将集群中的所用组件都关闭,如果关闭不了,直接kill -9 XXX 2,关闭ambari...

hive权威安装出现的不解错误!(完美解决)两种方法都可以

   以下两种方法都可以,推荐用方法一! 如果有误,请见博客 MySQL用户权限(Host,User,Password)管理(mysql.user)   可以自己去增加和删除用户。别怕,zhouls! 方法一:   步骤一: yum -y install mysql-server   步骤二:service mysqld start   步骤三:my...

HBase BulkLoad批量写入数据实战

1.概述 在进行数据传输中,批量加载数据到HBase集群有多种方式,比如通过HBase API进行批量写入数据、使用Sqoop工具批量导数到HBase集群、使用MapReduce批量导入等。这些方式,在导入数据的过程中,如果数据量过大,可能耗时会比较严重或者占用HBase集群资源较多(如磁盘IO、HBase Handler数等)。今天这篇博客笔者将为大家分...

从未如此简单:10分钟带你逆袭Kafka!【转】

【51CTO.com原创稿件】Apache Kafka 是一个快速、可扩展的、高吞吐的、可容错的分布式“发布-订阅”消息系统, 使用 Scala 与 Java 语言编写,能够将消息从一个端点传递到另一个端点。 较之传统的消息中间件(例如 ActiveMQ、RabbitMQ),Kafka 具有高吞吐量、内置分区、支持消息副本和高容错的特性,非常适合大规模消息...

Hadoop学习之路(十二)分布式集群中HDFS系统的各种角色

NameNode 学习目标 理解 namenode 的工作机制尤其是元数据管理机制,以增强对 HDFS 工作原理的 理解,及培养 hadoop 集群运营中“性能调优”、“namenode”故障问题的分析解决能力 问题场景 1、Namenode 服务器的磁盘故障导致 namenode 宕机,如何挽救集群及数据? 2、Namenode 是否可以有多个?name...