中高级特性

来源:http://www.smjxgs.com 作者:操作系统 人气:159 发布时间:2019-08-28
摘要:为什么需要Federation HDFS Federation能解决一下问题: 支持多个namespace,为什么需要多个namespace呢,因为一个namespace由于JVM内存的限制,存放的元数据有限,因此支持的datanode数目也有限制。

为什么需要Federation

HDFS Federation能解决一下问题:

  1. 支持多个namespace, 为什么需要多个namespace呢,因为一个namespace由于JVM内存的限制,存放的元数据有限,因此支持的datanode数目也有限制。

下面的分析来自另一篇博客,这里转一下:

由于Namenode在内存中存储所有的元数据(metadata),因此单个Namenode所能存储的对象(文件 块)数目受到Namenode所在JVM的heap size的限制。50G的
heap能够存储20亿(200 million)个对象,这20亿个对象支持4000个datanode,12PB的存储(假设文件平均大小为40MB)。
随着数据的飞速增长,存储的需求也随之增长。单个datanode从4T增长到36T,集群的尺寸增长到8000个datanode。存储的需求从12PB增长到大于100PB。
  1. 水平扩展出多个namenode后,就可以避免网络架构上的性能瓶颈问题

  2. 多个应用可以使用各自的namenode,从而相互隔离。

不过还是没有解决单点故障问题。 

Ubuntu 13.04上搭建Hadoop环境

Ubuntu 12.10 Hadoop 1.2.1版本集群配置

Ubuntu上搭建Hadoop环境(单机模式 伪分布模式)

Ubuntu下Hadoop环境的配置

单机版搭建Hadoop环境图文教程详解

搭建Hadoop环境(在Winodws环境下用虚拟机虚拟两个Ubuntu系统进行搭建)

l

架构图如下:

4887王中王鉄算盘奖结果 1

 

1. HDFS Federation架构介绍:

  1. HDFS介绍:

HDFS包含两层,分别是Namespace (命名空间)和 Block Storage service (块存储服务)。

4887王中王鉄算盘奖结果 2

HDFS

Block Storage Service包含两部分:

(1)Block Management (Namenode实现)

(2)Storage (Datanode实现)

传统的HDFS一般使用一个Namespace来管理整个集群,而且由一个namenode来管理这个namespace。HDFS Federation可以突破这个限制,可以支持多个namenodes/namespaces

  1. HDFS Federation:

为了水平扩展name service , federation使用多个独立的 Namenodes/Namespaces。

4887王中王鉄算盘奖结果 3

HDFS Federation

(1)Block pool

Block Pool是属于一个namespace的一组块,datanode存储集群中所有block pools的块。

(2)Cluster ID:

集群中的每一个节点都分配一个ClusterID。

  1. 使用HDFS Federation的原因:

(1)NameSpace可扩展性:HDFS的存储可以通过增加datanode节点来随意扩展。但是namenode保存元数据,如果存储的数据过大、或者集群中存在很多小文件,增加namenode可以很好地解决问题。

(2)性能:文件系统操作吞吐量(磁盘IO)是以往HDFS的瓶颈,对HDFS的访问和修改都需要经过namenode。

(3)隔离:在多用户环境下,一个namenode无法提供隔离,如果一个应用的负载过大的话,可能会影响其他关键任务。在多namenode节点环境下,不同的应用和用户可以被隔离到不同的namespace上。

测试环境

现在准备两个namenode server: namenode1和namenode2, /etc/hosts里面的配置如下:

 

#hdfs cluster
192.168.1.71 namenode1
192.168.1.72 namenode2
192.168.1.73 datanode1
192.168.1.74 datanode2
192.168.1.75 datanode3

现在来看看上面5台server的配置:

2. HDFS Federation 环境配置:

namenode1和namenode2的配置

1. 资源安装规划:

HDFS Federation只涉及到Namenode和Datanode,所以只考虑这2个角色的规划即可。在senior01上安装nn1,在senior02上安装nn2,同时在三台主机上安装datanode。

core-site.xml

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://namenode1:9000</value>
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
  </property>
  <property>
    <name>net.topology.node.switch.mapping.impl</name>
    <value>org.apache.hadoop.net.ScriptBasedMapping</value>
    <description> The default implementation of the DNSToSwitchMapping. It                                                                                                                                           
    invokes a script specified in net.topology.script.file.name to resolve                                                                                                                                           
    node names. If the value for net.topology.script.file.name is not set, the                                                                                                                                       
    default value of DEFAULT_RACK is returned for all node names.                                                                                                                                                    
    </description>
  </property>
  <property>
    <name>net.topology.script.file.name</name>
    <value>/opt/rack.lsp</value>
  </property>
  <property>
    <name>net.topology.script.number.args</name>
    <value>100</value>
    <description> The max number of args that the script configured with                                                                                                                                             
    net.topology.script.file.name should be run with. Each arg is an                                                                                                                                                 
    IP address.                                                                                                                                                                                                      
    </description>
  </property>
</configuration>

注意,hdfs://namenode1:9000在另一个namenode2上配置为hdfs://namenode2:9000刷新namenode的方法是:

[email protected]:~$ refresh-namenodes.sh 
Refreshing namenode [namenode1:9000]
Refreshing namenode [namenode2:9000]

拓扑查询仍然可以使用:

hdfs dfsadmin -printTopology

2. Federation配置:

(1). 配置hdfs-site.xml:

根据官网的配置样例,配置hdfs-site.xml。配置dfs.nameservices 的 ns1和ns2。

(2). 配置core-site.xml :

在分布式集群配置中,因为只有一个namenode,所以所有节点的fs.defaultFS配置项都是一致的(即namenode节点的URL)。但是在配置HDFS Federation时,由于有多个namenode,所以这些namenode的该项的访问地址都应该是自己

(3) 同步配置到其他节点:

同步配置到其他节点:

scp -r hadoop-2.5.0 natty@hadoop-senior02.pmpa.com:/opt/modules/

scp -r hadoop-2.5.0 natty@hadoop-senior03.pmpa.com:/opt/modules/

另外,由于senior02也是namenode,需要修改senior02的配置文件core-site.xml的fs.defaultFS配置项。

(4)在每一个Namenode节点格式化Namenode。

使用下面命令来格式化(需要在2个namenode上格式化):

$ bin/hdfs namenode -format -clusterId hdfs-cluster

这块需要注意,在格式化时候,指定了一个clusterId。在两个namenode上使用同样的语句进行格式化时,也就表明为这2个namenode指定了同一个clusterId,这样就表示2个namenode是属于同一个联盟的(Federation在这里体现)

(5)启动hdfs:

$ sbin/start-dfs.sh

(6)测试HDFS Federation:

在启动了2个hdfs federation后,我们访问50070端口,可以发现2个active 状态的 namenode:

4887王中王鉄算盘奖结果 4

namenode1  Active

4887王中王鉄算盘奖结果 5

namenode2  Active

在senior01上传一个文件:

$ bin/hdfs dfs -put sort.txt /

这时候,我们发现,在senior01上可以查看到这个文件,但是在senior02上查不到。

4887王中王鉄算盘奖结果 6

senior01 访问地址

4887王中王鉄算盘奖结果 7

senior02 访问地址

我们在第三台服务器senior03上 使用命令查看文件时能查看到sort.txt:

$ bin/hdfs dfs -ls /

因为,senior03的core-site.xml的配置项fs.defaultFS 的值为:hdfs://hadoop-senior01.pmpa.com:8020 。 如果修改这个值为hdfs://hadoop-senior02.pmpa.com:8020,在测试结果:

4887王中王鉄算盘奖结果,$ bin/hdfs dfs -ls /

这时候再查询时,已经查不到这个文件了。这其实说明HDFS Federation是配置了2个访问入口[ns1]和[ns2],他们之间是不重合的。

hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/home/hduser/mydata/hdfs/namenode</value>
  </property>
  <property>
    <name>dfs.namenode.hosts</name>
    <value>datanode1,datanode2,datanode3</value>
  </property>
  <property>
    <name>dfs.blocksize</name>
    <value>268435456</value>
  </property>
  <property>
    <name>dfs.namenode.handler.count</name>
    <value>100</value>
  </property>
<!--hdfs federation begin-->
  <property>
    <name>dfs.federation.nameservices</name>
    <value>ns1,ns2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns1</name>
    <value>namenode1:9000</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns2</name>
    <value>namenode2:9000</value>
  </property>
<!--hdfs federation end-->
</configuration>

注意添加了hdfs federation的配置,里面有两个namespaces: ns1和ns2,分别位于namenode1和namenode2上。

3. 三种启动方式:

(1)单独启动:

启动namenode,datanode:

$ sbin/hadoop-daemon.sh start namenode

$ sbin/hadoop-daemon.sh start datanode

启动Resource Manager, Node Manager : 

$ sbin/yarn-daemon.sh start resourcemanager

$ sbin/yarn-daemon.sh start nodemanager

(2)按模块启动:

$ sbin/start-dfs.sh

$ sbin/start-yarn.sh

(3)全部启动:

$ sbin/start-all.sh

slaves文件

把datanode的hostname都写进去

datanode1
datanode2
datanode3

 

4.常用工具distcp和hftp

Distcp工具是使用运行在Yarn的HDFS集群内和集群间的数据拷贝工具,使用MapReduce开发。该工具往往应用于同版本hadoop不同集群间的数据的复制。那么hftp主要应用于不同版本的hadoop集群间的数据拷贝。

下面以上边实验的基础来实验这2个命令。我在hadoop-senior01(namenode1)上上传2个文件,分别是/sort.txt  和 /input/wordcount.txt,下面分别利用 distcp和hftp来将这2个文件分别拷贝到hadoop-senior02(namenode2)上。

datanode的配置

1. distcp :

这里需要特别注意,因为distcp是使用mapreduce开发的,运行在yarn上,所以运行这个命令的时候,一定要保证yarn是在正常运行的。我的yarn的主节点(Resource Manager)运行在senior02上,所以需要在senior02上运行 sbin/start-yarn.sh来启动yarn。

之后运行distcp命令即可拷贝:

$ bin/hadoop distcp hdfs://hadoop-senior01.pmpa.com:8020/sort.txt hdfs://hadoop-senior02.pmpa.com:8020/

成功后,我们可以在namenode02上也看到这个文件了。

core-site.xml

<configuration>
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
  </property>
</configuration>

 

2.hftp:

上边提过hftp类似于网络层的ftp协议。使用hftp可以实现不同版本hadoop间的数据拷贝,例如从0.x版本拷贝到2.x版本。在使用hftp协议时候,应该使用50070端口(Web访问协议),拷贝到hdfs协议(8020 rpc端口)。

如下边语句运行:

$ bin/hadoop distcp -i hftp://hadoop-senior01.pmpa.com:50070/input/wordcount.txt hdfs://hadoop-senior02.pmpa.com:8020/input/wordcount.txt

其中-i参数的含义:忽略错误。

hdfs-site.xml

<configuration>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/home/hduser/mydata/hdfs/datanode</value>
  </property>
  <!--hdfs federation begin-->
  <property>
    <name>dfs.federation.nameservices</name>
    <value>ns1,ns2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns1</name>
    <value>namenode1:9000</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns2</name>
    <value>namenode2:9000</value>
  </property>
  <!--hdfs federation end-->
</configuration>

总体上来说,namenode的配置比较多,包括rack awareness的设置。
现在在两个namenode上格式化,并启动:

hdfs namenode -format -clusterId csfreebird
hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode

因为曾经格式化过namenode,要回答y表示重新格式化。

  • 1
  • 2
  • 下一页

HDFS Federation能解决一下问题: 1. 支持多个namespace, 为什么需要多个namespace呢,因为一个namespace由于JVM内存的限制,存放...

5. MapReduce执行流程:

XXX

6. 使用MapReduce实现二次排序:

XXX

本文由4887王中王鉄算盘奖结果发布于操作系统,转载请注明出处:中高级特性

关键词:

最火资讯