Hadoop构建数据仓库实践
上QQ阅读APP看书,第一时间看更新

4.3 配置HDFS Federation

HDFS Federation是Hadoop-0.23.0版本新增的功能,是为解决HDFS单点故障而提出的NameNode水平扩展方案。该方案允许HDFS创建多个namespace以提高集群的扩展性和隔离性。本节主要介绍了HDFS Federation的原理和配置。

1. HDFS的两层结构

如图4-2所示,HDFS主要包含两层结构。

图4-2 HDFS的两层结构

● 命名空间

由目录、文件和数据块组成,支持所有与命名空间相关的文件系统操作,如创建、删除、修改和列出文件或目录。

● 数据块存储服务

由数据块管理和存储两部分组成。数据块管理(在NameNode中执行)主要功能包括:通过节点注册和周期性的心跳,维护集群中DataNode的成员关系;处理块报告,并维护数据块的位置;支持创建、删除、获取块的位置等数据块相关的操作;管理块复制。存储则是DataNodes提供的功能,它在本地文件系统存储实际的数据块并允许针对数据块的读写访问。

早期HDFS架构只允许整个集群中存在一个命名空间,而该命名空间被仅有的一个NameNode管理。这个架构使得HDFS非常容易实现,但是,这种设计导致了很多局限。

2. HDFS局限性

● 块存储和命名空间高耦合

NameNode中的命名空间和块管理的结合使得这两层架构耦合在一起,难以让其他可能的NameNode实现方案直接使用块存储。

● NameNode不易扩展

HDFS的底层存储是可以水平扩展的(底层存储指的是DataNodes,当集群存储空间不够时,可简单地添加机器以进行水平扩展),但命名空间不可以。当前的命名空间只能存放在单个NameNode上,而NameNode在内存中存储了整个分布式文件系统中的元数据信息,这限制了集群中数据块,文件和目录的数目。

● 性能

文件操作的性能受制于单个NameNode的吞吐量。

● 隔离性

现在大部分集群都是共享的,每天有来自不同部门的不同用户提交作业。单个NameNode难以提供隔离性,即:某个用户提交的负载很大的作业会减慢其他用户的作业执行,单一的NameNode无法按照应用类别将不同作业分派到不同NameNode上。

3. Federation架构

Federation架构如图4-3所示。

图4-3 Federation架构

采用Federation的最主要原因是实现简单,Federation能够快速地解决大部分单NameNode的问题。Federation主要改变是在DataNode、配置和工具,而NameNode本身的改动非常少,这样NameNode原先的鲁棒性不会受到影响,也使得该方案与之前的HDFS版本兼容。

为了水平扩展NameNode, federation使用了多个独立的NameNode及命名空间。这些NameNode之间是分离的,也就是说,它们之间相互独立且不需要互相协调,各自分工,管理自己的区域。分布式的DataNode被用作通用的数据块存储设备。每个DataNode要向集群中所有的NameNode注册,且周期性地向所有NameNode发送心跳和块报告,并执行来自所有NameNode的命令。

一个block pool由属于同一个命名空间的数据块组成,每个DataNode可能会存储集群中所有block pool的数据块。

每个block pool内部自治,也就是说各自管理自己的block,不会与其他block pool交流。一个NameNode失效,不会影响其他NameNode。

某个NameNode上的命名空间和它对应的block pool一起被称为命名空间卷。它是管理的基本单位。当一个NameNode及命名空间被删除后,其所有DataNode上对应的block pool也会被删除。当集群升级时,每个命名空间卷作为一个基本单元进行升级。

一个ClusterID用来标识集群中的所有节点。当一个NameNode被格式化时,需要提供此ClusterID,或者自动生成一个ClusterID。生成的ClusterID被用于集群中其他NameNodes的格式化。

4. Federation配置

现在为前面已安装的Apache Hadoop配置Federation,要达到以下三个目的:

● 现有Hadoop集群只有一个NameNode,现在要增加一个NameNode。

● 两个NameNode构成HDFS Federation。

● 不重启现有集群,不影响数据访问。

(1)现有环境

5台CentOS release 6.4虚拟机,在各个主机的/etc/hosts文件中都配置了域名解析,IP地址和主机名如下:

● 192.168.56.101 master

● 192.168.56.102 slave1

● 192.168.56.103 slave2

● 192.168.56.104 slave3

● 192.168.56.105 master2

其中master、slave1、slave2、slave3是我们刚才安装的Hadoop集群节点,master2是新增的一台“干净”的机器,已经配置好免密码ssh,将作为新增的NameNode。

Hadoop版本:hadoop 2.7.2。

现有配置:master作为Hadoop集群的NameNode、SecondaryNameNode、ResourceManager; slave1、slave2、slave3作为Hadoop集群的DataNode、NodeManager。

(2)配置步骤

步骤01编辑master上的hdfs-site.xml文件,修改后的文件内容如下所示。

    <? xml version="1.0" encoding="UTF-8"? >
    <? xml-stylesheet type="text/xsl" href="configuration.xsl"? >
    <configuration>
    <property>
            <name>dfs.namenode.name.dir</name>
            <value>file:/home/grid/hadoop-2.7.2/hdfs/name</value>
    </property>
    <property>
            <name>dfs.datanode.data.dir</name>
            <value>file:/home/grid/hadoop-2.7.2/hdfs/data</value>
    </property>
    <property>
            <name>dfs.replication</name>
            <value>3</value>
    </property>
    <property>
            <name>dfs.webhdfs.enabled</name>
            <value>true</value>
    </property>

    <! -- 新增属性 -->
    <! -- 配置两个命名空间ns1和ns2-->
    <property>
            <name>dfs.nameservices</name>
            <value>ns1, ns2</value>
    </property>

        <! -- 配置ns1的属性 -->
    <property>
            <name>dfs.namenode.rpc-address.ns1</name>
            <value>master:9000</value>
    </property>
    <property>
            <name>dfs.namenode.http-address.ns1</name>
            <value>master:50070</value>
    </property>
    <property>
            <name>dfs.namenode.secondary.http-address.ns1</name>
            <value>master:9001</value>
    </property>
    <! -- 配置ns2的属性 -->
    <property>
            <name>dfs.namenode.rpc-address.ns2</name>
            <value>master2:9000</value>
    </property>
    <property>
            <name>dfs.namenode.http-address.ns2</name>
            <value>master2:50070</value>
    </property>
    <property>
            <name>dfs.namenode.secondary.http-address.ns2</name>
            <value>master2:9001</value>
    </property>
    </configuration>

步骤02复制master上的hdfs-site.xml文件到集群上的其他节点。

    scp hdfs-site.xml slave1:/home/grid/hadoop-2.7.2/etc/hadoop/
    scp hdfs-site.xml slave2:/home/grid/hadoop-2.7.2/etc/hadoop/
    scp hdfs-site.xml slave3:/home/grid/hadoop-2.7.2/etc/hadoop/

步骤03将Java目录、Hadoop目录、环境变量文件从master复制到master2。

    scp -rp /home/grid/hadoop-2.7.2 master2:/home/grid/
    scp -rp /home/grid/jdk1.7.0_75 master2:/home/grid/
    # 用root执行
    scp -p /etc/profile.d/* master2:/etc/profile.d/

步骤04启动新的NameNode、SecondaryNameNode。

    # 在master2上执行
    source /etc/profile
    $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
    $HADOOP_HOME/sbin/hadoop-daemon.sh start secondarynamenode

执行成功后,使用jps命令查看master2上的Java进程,可以看到启动了NameNode、SecondaryNameNode进程,如下所示。

    [grid@master2~]$ jps
    2285 Jps
    2244 SecondaryNameNode
    2154 eNode

步骤05刷新DataNode收集新添加的NameNode,在集群中任意一台机器上执行均可。

    $HADOOP_HOME/bin/hdfs dfsadmin -refreshNamenodes slave1:50020
    $HADOOP_HOME/bin/hdfs dfsadmin -refreshNamenodes slave2:50020
    $HADOOP_HOME/bin/hdfs dfsadmin -refreshNamenodes slave3:50020

至此,HDFS Federation配置完成,从Web查看两个NameNode的状态分别如图4-4和图4-5所示。从图中可以看到两个NameNode的ClusterID相同。

图4-4 第一个NameNode

图4-5 第二个NameNode