Hadoop集群的联邦模式
注意:HDFS Federation是为了解决HDFS单点故障而提出的NameNode水平扩展方案
Federation方案可以允许创建多个namespace以提高集群的可扩展性和隔离性。
HDFS的两层结构
BlockStorage
由数据块管理和存储两部分组成。
数据块管理(在NameNode中)主要功能:通过节点注册和周期性的心跳、维护集群中DataNode的成员关系;处理块报告,并维护数据块的位置;支持创建、删除、获取块的位置等数据块相关的操作;管理块复制
存储(在DataNode中)主要功能: 在本地文件系统中存储实际的数据块并允许针对数据块的读写访问
NameSpace
主要是Namenode
的角色,有目录、文件和数据块组成,支持所有与命名空间相关的文件系统操作,如创建、删除、修改和列出文件或目录
HDFS的局限性
- 块管理和命名空间在
NameNode
中的结合使得这两层架构高度耦合在一起. - NameNode不易扩展(
NameNode在内存中存储了整个分布式文件系统的元数据信息,限制了集群中数据块\文件和目录的数目
) - 性能(文件操作的性能受制于单个NameNode的吞吐量)
- 隔离性(通常集群都是共享Namenode的,很难将多个不同业务部门的请求进行合理隔离以减少业务之间的影响)
Federation架构和搭建
Federation 主要改变实在DataNode
配置和工具,而NameNode的本身的改动很少.这样NameNode的鲁棒性不受影响,也使得和之前的HDFS架构方案进行兼容
一个ClusterID用来标识集群中的所有节点,当一个NameNode
被格式化时,需要提供ClusterID,或自动生成的ClusterId,该ID被用于急群众其他NameNode
的格式化
Federation配置的目标
- 现有集群有一个NameNode,增加一个NameNode
- 两个NameNode形成HDFS 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的局限性
- 块管理和命名空间在
NameNode
中的结合使得这两层架构高度耦合在一起. - NameNode不易扩展(
NameNode在内存中存储了整个分布式文件系统的元数据信息,限制了集群中数据块\文件和目录的数目
) - 性能(文件操作的性能受制于单个NameNode的吞吐量)
- 隔离性(通常集群都是共享Namenode的,很难将多个不同业务部门的请求进行合理隔离以减少业务之间的影响)
Federation架构和搭建
Federation 主要改变实在DataNode
配置和工具,而NameNode的本身的改动很少.这样NameNode的鲁棒性不受影响,也使得和之前的HDFS架构方案进行兼容
一个ClusterID用来标识集群中的所有节点,当一个NameNode
被格式化时,需要提供ClusterID,或自动生成的ClusterId,该ID被用于急群众其他NameNode
的格式化
Federation配置的目标
- 现有集群有一个NameNode,增加一个NameNode
- 两个NameNode形成HDFS 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的相关信息。
网友评论