3.17-3.18 HDFS2.x中高级特性讲解

一、hdfs federation

hdfs federation即hdfs的联邦;可以理解为有多个namenode节点的hdfs集群;

HA方案解决的是单点故障问题,而Fdederation解决的是单命名空间问题。

集群的全部元数据都存放在一个名称节点上,当集群足够大的时候,这个名称节点就成了性能的瓶颈。

而且这种设计不能进行 的隔离,用户的所有操作都必须由这一个节点来处理。

HDFS Federation就是使HDFS支持多个命名空间,并且允许在HDFS中同时存在多个NameNode。

image

HDFS Federation的构架如上,其使用了多个独立的NameNode/NameSpace,从而使HDFS的命名服务器能水平扩张。

各个名称节点之间是联合的,即他们相互独立且不需要相互协调,各自分工,管理好自己的区域。

分布式的DataNode对联合的NameNode来说是通用的数据块存储设备。每个数据节点要向所有的名称节点注册,

并且周期性发送心跳和块信息报告,同时处理来自所有NameNode的指令。

只有一个名称节点的HDFS只有一个命名空间,它使用全部的块,而Federation中有多个独立的命名空间,每个命名空间使用一个块池(block pool)。

块池就是属于单个命名空间的一组块。每一个datanode为所有的block pool的存储块。dataNode是一个物理概念而block pool是一个重新将块划分的逻辑概念。

同个dataNode中可以存着属于多个block pool的多个块。block pool允许一个命名空间在不通知其它命名空间的情况下为一个新的block创建Block ID,

同时,一个nameNode的失效不会影响其下的dataNode为其它nameNode服务。

当datanode与Namenode建立联系并开始会话后自动建立Block pool。每个block都有一个唯一的标识,这个标识我们称之为扩展的块ID(Extended Block ID)= BlockID+BlockID。

这个扩展的块ID在HDFS集群之间都是唯一的,这为以后集群归并创造了条件。

Datanode中的数据结构都通过块池ID(BlockPoolID)索引,即datanode中的BlockMap,storage等都通过BPID索引。

在HDFS中,所有的更新、回滚都是以Namenode和BlockPool为单元发生的。即同一HDFS Federation中不同的Namenode/BlockPool之间没有什么关系。

需要注意的是,HDFS Federation并不能解决单点故障问题。也就是说,每个名称节点仍然可能存在单点故障,节点间是联盟关系而非互为备份。

因此,我们还是需要为每个节点设置ha机制。

多命名空间的管理用的是一种叫client side mount table的方法。


如下面的图所示,白色大三角形是客户端所看到的,黑色三角形是各个子命名空间。用户可以通过访问不同挂载点来访问不同空间。

image

二、File System Snapshots

HDFS快照是一个只读的基于时间点文件系统拷贝。快照可以是整个文件系统的也可以是一部分。常用来作为数据备份,防止用户错误和容灾快照功能。

HDFS实现功能:|
    >Snapshot创建的时间复杂度为O(1),但是不包括Node的寻找时间
    >只有当修改SnapShot时,才会有额外的内存占用,内存使用量为0(V).M为修改的文件或者目录数
    >在DataNode上面的blocks不会复制,做Snapshot的文件是纪录了block的列表和文件的大小,但是没有数据的复制
    >Snapshot并不会影响HDFS的正常操作:修改会按照时间的反序记录,这样可以直接读取到最新的数据。
      快照数据是当前数据减去修改的部分计算出来的。

相关命令:

设置一个目录为可快照
     bin/hdfs dfsadmin-allowSnapshot <path>

取消目录可快照
     bin/hdfs dfsadmin-disallowSnapshot <path>

生成快照
     bin/hdfs dfs-createSnapshot <path>[<snapshotName>]

删除快照
     bin/hdfs dfs-deleteSnapshot <path><snapshotName>

列出所有可快照目录
     bin/hdfs IsSnapshottableDir

比较快照之间的差异
    bin/hdfs snapshotDiff <path><fromSnapshot><toSnapshot>

三、集中式缓存管理

Hadoop从2.3.0版本开始支持HDFS缓存机制,HDFS允许用户将一部分目录或文件缓存在HDFS当中,
NameNode会通知拥有对应块的DataNodes将其缓存在DataNode的内存当中。

优势
    >防止那些被频繁使用的数据从内存中清除;
    >因为DataNode的缓存由NameNode来管理,applications在做任务安排时可以查询这个缓存的列表,
     使用一个被缓存的块副本能够提高读性能;
    >当块被DataNode缓存之后,客户端可以使用一个新的、高效的、zero-copy的读API,因为缓存中的数据
     已经被计算过checksum,当使用新APl时,客户端基本上是零开销的;
    >可以提高集群的内存利用率。当使用操作系统的缓存时,对一个块的重复读会导致所有的副本都会被
     放到缓冲区当中,当使用集中式缓存时,用户可以指定n个副本中的m个才会被缓存,可以节约n-m的内存;

使用场景
    >集中式缓存对那些频察访问的的文件是非常有用的,例如hive中经常被使用的fact表就非常适合缓有;
    >另一方面,缓存一年的查询结果可能没那么有用了,因为这个结果可能只会被查看一次;
    >有助于提高混合类型作业的SLA性能,把高优先级的数据缓存起来可以确保它不会与低优先级的数据竞争磁盘IO;

四、Distributed Copy

1、DistCP

Distributed Copy:分布式copy

比如有多个hadoop集群(如:正式版、测试版),可以用此功能来跨集群copy数据;

#用法
bash$ hadoop distcp hdfs://nn1:8020/foo/bar  hdfs://nn2:8020/bar/foo

2、HFTP

但是当集群版本不一致的时候,用dictcp可能就会出问题;

此时可以用HFTP;底层为MapReduce

但是官网提示:HFTP和HSFTP在2.x中已弃用,并且在3.0中不可用。它们已被WebHDFS取代。

webHDFS: http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/WebHDFS.html

介绍
HFTP是一种Hadoop文件系统实现,允许您从远程Hadoop HDFS集群读取数据。读取通过HTTP完成,数据来自DataNodes。
HFTP是一个只读文件系统,如果您尝试使用它来写入数据或修改文件系统状态,它将抛出异常。

如果您有多个具有不同版本的HDFS群集,并且您需要将数据从一个移动到另一个,则HFTP主要非常有用。
即使在不同版本的HDFS之间,HFTP也是线路兼容的。例如,您可以执行以下操作:
hadoop distcp -i hftp://sourceFS:50070/src  hdfs://destFS:8020/dest
请注意,HFTP是只读的,因此目标必须是HDFS文件系统。(此外,在此示例中,应使用新文件系统的配置来运行distcp。)

扩展名HSFTP默认使用HTTPS。这意味着数据将在传输过程中加密。

猜你喜欢

转载自www.cnblogs.com/weiyiming007/p/10728977.html