Hadoop生态学习之Federation模式搭建

2018-11-10  本文已影响6人  9c46ece5b7bd

Hadoop集群的联邦模式

注意:HDFS Federation是为了解决HDFS单点故障而提出的NameNode水平扩展方案

Federation方案可以允许创建多个namespace以提高集群的可扩展性和隔离性。

HDFS的两层结构

BlockStorage
由数据块管理和存储两部分组成。
数据块管理(在NameNode中)主要功能:通过节点注册和周期性的心跳、维护集群中DataNode的成员关系;处理块报告,并维护数据块的位置;支持创建、删除、获取块的位置等数据块相关的操作;管理块复制
存储(在DataNode中)主要功能: 在本地文件系统中存储实际的数据块并允许针对数据块的读写访问
NameSpace
主要是Namenode的角色,有目录、文件和数据块组成,支持所有与命名空间相关的文件系统操作,如创建、删除、修改和列出文件或目录

HDFS的局限性

Federation架构和搭建

Federation 主要改变实在DataNode配置和工具,而NameNode的本身的改动很少.这样NameNode的鲁棒性不受影响,也使得和之前的HDFS架构方案进行兼容

一个ClusterID用来标识集群中的所有节点,当一个NameNode被格式化时,需要提供ClusterID,或自动生成的ClusterId,该ID被用于急群众其他NameNode的格式化

Federation配置的目标

现有集群:

[master1]
192.168.0.1
[slave1]
192.168.0.2
[slave2]
192.168.0.3
[slave3]
192.168.0.4

需要增加一个192.168.0.5作为辅助的master2

** 修改master上的hdfs-site.xml配置文件**

$ cat file/hadoop/hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <!--定义namenode的存放路径: 存放fsimage文件,可以按照,分割的多个文件-->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///export/hdfs/servers/hadoop-2.7.6/hdfs/name</value>
        <final>true</final>
    </property>

    <!--定义datanode的存放路径: 真正存储数据块的地方[注意如果是多个目录,多个目录需要再不同磁盘;每个块在同一个机器上仅仅存储一份]-->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///export/hdfs/servers/hadoop-2.7.6/hdfs/data</value>
    </property>

    <!--配置副本数-->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>

    <!--Federation时需要去除这个配置-->
    <!--配置secondary namenode地址,如果设置了HA,就不再使用这个了-->
    <!--property>
      <name>dfs.namenode.secondary.http-address</name>
      <value>192.168.0.1:9001</value>
    </property>

    <property>
      <name>dfs.namenode.servicerpc-bind-host</name>
      <value>0.0.0.0</value>
    </property-->

    <!--开启webhdfs-->
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
        <final>true</final>
    </property>



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

    <!--ns1配置信息-->
    <property>
        <name>dfs.namenode.http-address.ns1</name>
        <value>192.168.0.1:50070</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.ns1</name>
        <value>192.168.0.1:9000</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address.ns1</name>
        <value>192.168.0.1:9001</value>
    </property>

    <!--ns2配置信息-->
    <property>
        <name>dfs.namenode.http-address.ns2</name>
        <value>192.168.0.5:50070</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.ns2</name>
        <value>192.168.0.5:9000</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address.ns2</name>
        <value>192.168.0.5:9001</value>
    </property>




</configuration>


按照新的配置部署master2

将修改后的配置同步到集群中全部节点

$ ansible -i test.txt *hadoop* -m copy -a "src=file/hadoop/slaves dest=/export/hdfs/servers/hadoop-2.7.6/etc/hadoop/slaves" -s
$ ansible -i test.txt *hadoop* -m copy -a "src=file/hadoop/mapred-site.xml dest=/export/hdfs/servers/hadoop-2.7.6/etc/hadoop/mapred-site.xml" -s

$ ansible -i test.txt *hadoop* -m copy -a "src=file/hadoop/core-site.xml dest=/export/hdfs/servers/hadoop-2.7.6/etc/hadoop/core-site.xml" -s

$ ansible -i test.txt *hadoop* -m copy -a "src=file/hadoop/hdfs-site.xml dest=/export/hdfs/servers/hadoop-2.7.6/etc/hadoop/hdfs-site.xml" -s

$ ansible -i test.txt *hadoop* -m copy -a "src=file/hadoop/yarn-site.xml dest=/export/hdfs/servers/hadoop-2.7.6/etc/hadoop/yarn-site.xml" -s


# 在master上执行如下:
[root@master2 sbin]# sh /export/hdfs/servers/hadoop-2.7.6/sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /export/hdfs/servers/hadoop-2.7.6/logs/hadoop-root-namenode-master2.out
[root@master2 sbin]# sh /export/hdfs/servers/hadoop-2.7.6/sbin/hadoop-daemon.sh start secondarynamenode
starting secondarynamenode, logging to /export/hdfs/servers/hadoop-2.7.6/logs/hadoop-root-secondarynamenode-master2.out


[root@master2 sbin]# jps
30273 Jps
30131 NameNode
30218 SecondaryNameNode

# 在集群中任意节点刷新Namenode记录
[root@master2 sbin]# hdfs dfs -ls /
18/11/08 22:35:03 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
drwxr-xr-x   - root supergroup          0 2018-11-08 19:23 /bgops

# 刷新节点信息
[root@master2 sbin]# hdfs dfsadmin -refreshNamenodes slave1:50020
18/11/08 22:36:00 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[root@master2 sbin]# hdfs dfsadmin -refreshNamenodes slave2:50020
18/11/08 22:36:05 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[root@master2 sbin]# hdfs dfsadmin -refreshNamenodes slave3:50020
18/11/08 22:36:09 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

此时可以使用两个Namenode节点的50070端口来查看hdfs的相关信息。

Hadoop集群的联邦模式

注意:HDFS Federation是为了解决HDFS单点故障而提出的NameNode水平扩展方案

Federation方案可以允许创建多个namespace以提高集群的可扩展性和隔离性。

HDFS的两层结构

BlockStorage
由数据块管理和存储两部分组成。
数据块管理(在NameNode中)主要功能:通过节点注册和周期性的心跳、维护集群中DataNode的成员关系;处理块报告,并维护数据块的位置;支持创建、删除、获取块的位置等数据块相关的操作;管理块复制
存储(在DataNode中)主要功能: 在本地文件系统中存储实际的数据块并允许针对数据块的读写访问
NameSpace
主要是Namenode的角色,有目录、文件和数据块组成,支持所有与命名空间相关的文件系统操作,如创建、删除、修改和列出文件或目录

HDFS的局限性

Federation架构和搭建

Federation 主要改变实在DataNode配置和工具,而NameNode的本身的改动很少.这样NameNode的鲁棒性不受影响,也使得和之前的HDFS架构方案进行兼容

一个ClusterID用来标识集群中的所有节点,当一个NameNode被格式化时,需要提供ClusterID,或自动生成的ClusterId,该ID被用于急群众其他NameNode的格式化

Federation配置的目标

现有集群:

[master1]
192.168.0.1
[slave1]
192.168.0.2
[slave2]
192.168.0.3
[slave3]
192.168.0.4

需要增加一个192.168.0.5作为辅助的master2

** 修改master上的hdfs-site.xml配置文件**

$ cat file/hadoop/hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <!--定义namenode的存放路径: 存放fsimage文件,可以按照,分割的多个文件-->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///export/hdfs/servers/hadoop-2.7.6/hdfs/name</value>
        <final>true</final>
    </property>

    <!--定义datanode的存放路径: 真正存储数据块的地方[注意如果是多个目录,多个目录需要再不同磁盘;每个块在同一个机器上仅仅存储一份]-->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///export/hdfs/servers/hadoop-2.7.6/hdfs/data</value>
    </property>

    <!--配置副本数-->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>

    <!--Federation时需要去除这个配置-->
    <!--配置secondary namenode地址,如果设置了HA,就不再使用这个了-->
    <!--property>
      <name>dfs.namenode.secondary.http-address</name>
      <value>192.168.0.1:9001</value>
    </property>

    <property>
      <name>dfs.namenode.servicerpc-bind-host</name>
      <value>0.0.0.0</value>
    </property-->

    <!--开启webhdfs-->
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
        <final>true</final>
    </property>



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

    <!--ns1配置信息-->
    <property>
        <name>dfs.namenode.http-address.ns1</name>
        <value>192.168.0.1:50070</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.ns1</name>
        <value>192.168.0.1:9000</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address.ns1</name>
        <value>192.168.0.1:9001</value>
    </property>

    <!--ns2配置信息-->
    <property>
        <name>dfs.namenode.http-address.ns2</name>
        <value>192.168.0.5:50070</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.ns2</name>
        <value>192.168.0.5:9000</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address.ns2</name>
        <value>192.168.0.5:9001</value>
    </property>




</configuration>


按照新的配置部署master2

将修改后的配置同步到集群中全部节点

$ ansible -i test.txt *hadoop* -m copy -a "src=file/hadoop/slaves dest=/export/hdfs/servers/hadoop-2.7.6/etc/hadoop/slaves" -s
$ ansible -i test.txt *hadoop* -m copy -a "src=file/hadoop/mapred-site.xml dest=/export/hdfs/servers/hadoop-2.7.6/etc/hadoop/mapred-site.xml" -s

$ ansible -i test.txt *hadoop* -m copy -a "src=file/hadoop/core-site.xml dest=/export/hdfs/servers/hadoop-2.7.6/etc/hadoop/core-site.xml" -s

$ ansible -i test.txt *hadoop* -m copy -a "src=file/hadoop/hdfs-site.xml dest=/export/hdfs/servers/hadoop-2.7.6/etc/hadoop/hdfs-site.xml" -s

$ ansible -i test.txt *hadoop* -m copy -a "src=file/hadoop/yarn-site.xml dest=/export/hdfs/servers/hadoop-2.7.6/etc/hadoop/yarn-site.xml" -s


# 在master上执行如下:
[root@master2 sbin]# sh /export/hdfs/servers/hadoop-2.7.6/sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /export/hdfs/servers/hadoop-2.7.6/logs/hadoop-root-namenode-master2.out
[root@master2 sbin]# sh /export/hdfs/servers/hadoop-2.7.6/sbin/hadoop-daemon.sh start secondarynamenode
starting secondarynamenode, logging to /export/hdfs/servers/hadoop-2.7.6/logs/hadoop-root-secondarynamenode-master2.out


[root@master2 sbin]# jps
30273 Jps
30131 NameNode
30218 SecondaryNameNode

# 在集群中任意节点刷新Namenode记录
[root@master2 sbin]# hdfs dfs -ls /
18/11/08 22:35:03 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
drwxr-xr-x   - root supergroup          0 2018-11-08 19:23 /bgops

# 刷新节点信息
[root@master2 sbin]# hdfs dfsadmin -refreshNamenodes slave1:50020
18/11/08 22:36:00 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[root@master2 sbin]# hdfs dfsadmin -refreshNamenodes slave2:50020
18/11/08 22:36:05 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[root@master2 sbin]# hdfs dfsadmin -refreshNamenodes slave3:50020
18/11/08 22:36:09 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

此时可以使用两个Namenode节点的50070端口来查看hdfs的相关信息。

hdfs-2.png
上一篇下一篇

猜你喜欢

热点阅读