数据开发之离线计算_HDFS高可用集群&联邦集群

数据开发之离线计算_HDFS高可用集群&联邦集群

1.HA结构

1.1 HA原理

高可用是一种用来解决namenode的单点故障问题,避免namenode故障或者升级维护导致集群不可用。

ha通过在集群中运行2个namenode,分别出与active和standby状态,当active namenode发生故障或者管理人员主动维护升级时,可以被动或主动切换另一个namenode为active。

主备namenode共享namespace和datanode数据块。主备namenode通过JNS(journal nodes)技术进行通信,保持主备同步。当active namenode更新了namespace,它会将修改日志通过JNS发送给standby namenode,然后standby namenode将这些日志变更应用在自己的namespace,从而实现了主备namespace的一致,实现了namespace在逻辑上的共享。

1.2 高可用NameSpace原理

比如建立高可用集群,设置namespace为ns1,设置namenode为127.0.0.1:8020127.0.0.2:8020

通过hdfs命令Hadoop fs -ls hdfs://ns1/user访问时,会根据core-site.xml等配置文件顺序寻找namenode。比如先访问127.0.0.1:8020是不是处于active状态,是则访问hdfs://127.0.0.1:8020/user文件夹;不是则再访问127.0.0.2:8020是不是处于active状态。

2.Federation架构

2.1 单NameNode缺点

namenode存储着hdfs系统的元数据(metadata),包括文件名、备份数、文件路径等。

namenode运行过程中元数据需要存储在内存中,但是计算机内存是有上限的。当内存数据过大会导致hdfs系统的存储数量、数据吞吐性能受限。

为了解决namenode的性能问题,可以纵向扩展namenode,也就是增加单台namenode计算机的内存。但是这种方案有很多缺点:namenode存储数据过多,启动加载时间太长,比如50G的namenode启动时间需要30分钟到2小时;且内存过大会导致GC和jvm调优困难。

所以基于HDFS联邦集群的纵向扩展namenode方案更加合理。

2.2多NameNode结构

被同一个namenode所管理的数据都在同一个namespace下。

Federation是指多个namenode组成一个联邦,这些namenode之间相互独立,分别管理自己的命令空间。

集群中所有datanode提供数据块的共享存储功能,每个datanode都会想集群中所有namenode注册,并周期性向所有namenode发送心跳和汇报,也可以执行所有namenode发来的数据操作指令。

2.3块池概念

一个block pools由属于同一个namespace的所有数据块组成,这个块池中的数据块可以存在于集群中的所有datanode上,而每一个datanode也可以存储集群中所有块池的数据块。

每个块池在逻辑上独立管理,不与其他块池交互,所有当一个namenode出现故障时,并不会影响集群中的datanode为其他namenode提供服务。

一个namenode管理的namespace和对应的数据块池一起被称为一个命名空间卷,当一个那么namenode被删除时,它所管理的块池也会从datanode上删除掉。

3.HA配置实例

3.1 dfs.nameservices配置

在集群每台节点上的hdfs-site.xml上进行高可用配置:

  • dfs.nameservices:集群中的namespace;
  • dfs.ha.namenodes.{namespace}:namespace对应的主备namenode的名字;
  • dfs.namenode.rpc-address.{namespace}.{namenode}:namenode用来与datanode通信的rpc端口;
  • dfs.namenode.http-address.{namespace}.{namenode}:namenode用来与web客户端通信的http端口,就是在浏览器上查看hdfs文件夹的那个界面。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<property>
<name>dfs.nameservices</name>
<value>namespace1</value>
</property>
<property>
<name>dfs.ha.namenodes.namespace1</name>
<value>namenode1,namenode2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.namespace1.namenode1</name>
<value>127.0.0.1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.namespace1.namenode2</name>
<value>127.0.0.2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.namespace1.namenode1</name>
<value>127.0.0.1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.namespace1.namenode2</name>
<value>127.0.0.2:50070</value>
</property>

3.2 fs.defaultFS

在开启了HA的情况下,可以在core-site.xml文件中配置默认访问的namespace,但一定要是在hdfs-site.xml中配置为dfs.nameservices参数的namespace。

1
2
3
4
<property>
<name>fs.defaultFS</name>
<value>hdfs://namespace1</value>
</property>

配置该参数之后使用hdfs命令时如果不加namespace,会自动添加该namespace。比如执行Hadoop fs -ls /user则相当于执行Hadoop fs -ls hdfs://namespace1/user

3.3 fs.defaultFS与fs.default.name的区别

core-site.xml文件中的fs.default.name配置参数与fs.defaultFS作用相同,一般在开启了HA时使用fs.defaultFS配置namespace,没有开启HA时使用fs.default.name直接配置ip地址和端口号。

1
2
3
4
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>

4.Federation配置实例

一般会在创建federation集群时同时部署namenode高可用。

在集群每台节点上的hdfs-site.xml上进行federation配置,其中127.0.0.1和127.0.0.2分别作为namespace1的主备节点,127.0.0.3和127.0.0.4分别作为namespace2的主备节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<property>
<name>dfs.nameservices</name>
<value>namespace1,namespace2</value>
</property>
<property>
<name>dfs.ha.namenodes.namespace1</name>
<value>namenode1,namenode2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.namespace1.namenode1</name>
<value>127.0.0.1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.namespace1.namenode2</name>
<value>127.0.0.2:8020</value>
</property>
<property>
<name>dfs.ha.namenodes.namespace2</name>
<value>namenode1,namenode2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.namespace2.namenode1</name>
<value>127.0.0.3:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.namespace2.namenode2</name>
<value>127.0.0.4:8020</value>
</property>

在不同节点的core-site.xml文件中可以配置不同的fs.defaultFS参数,使得在不同节点上执行hdfs命令时补全的namespace不同。一般某节点就配置该节点所属的namespace,比如上述127.0.0.1和127.0.0.2节点上配置fs.defaultFS=namespace1,127.0.0.3和127.0.0.4节点上配置fs.defaultFS=namespace2。datanode节点上的fs.defaultFS则配置为任意一个都可以。

5.实用命令

  • hdfs getconf -confKey fs.defaultFS:查看hdfs默认命名空间
  • hdfs getconf -confKey fs.default.name:查看hdfs默认文件系统前缀
  • hdfs getconf -confKey dfs.nameservices:查看hdfs的所有命名空间列表