hadoop--HDFS

1 简介

HDFS是一个分布式文件储存系统,数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件。是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。
它具有通透性和容错性:
通透性:让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。
容错性:即使系统中有某些节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。

1.1 设计目标

1) 存储非常大的文件

2) 采用流式的数据访问方式

HDFS基于这样的一个假设:最有效的数据处理模式是一次写入、多次读取数据集经常从数据源生成或者拷贝一次,然后在其上做很多分析工作,支持一次写入多次查询,不支持并发写,支持append增加,小文件不适合使用。
分析工作经常读取其中的大部分数据,即使不是全部。 因此读取整个数据集所需时间比读取第一条记录的延时更重要。

3) 运行于商业硬件上

Hadoop不需要特别贵的、reliable的机器,可运行于普通商用机器(可以从多家供应商采购) 商用机器不代表低端机器在集群中(尤其是大的集群),节点失败率是比较高的HDFS的目标是确保集群在节点失败的时候不会让用户感觉到明显的中断。

1.2 HDFS不支持的应用类型

1) 低延时的数据访问

对延时要求在毫秒级别的应用,不适合采用HDFS。HDFS是为高吞吐数据传输设计的,因此可能牺牲延时HBase更适合低延时的数据访问。

2) 大量小文件

文件的元数据(如目录结构,文件block的节点列表,block-node mapping)保存在NameNode的内存中, 整个文件系统的文件数量会受限于NameNode的内存大小。
经验而言,一个文件/目录/文件块一般占有150字节的元数据内存空间。如果有100万个文件,每个文件占用1个文件块,则需要大约300M的内存。因此十亿级别的文件数量在现有商用机器上难以支持

3) 多方读写,需要任意的文件修改

HDFS采用追加(append-only)的方式写入数据。不支持文件任意offset的修改。不支持多个写入器(writer)。

2 HDFS的核心概念

2.1 Blocks

物理磁盘中有块的概念,磁盘的物理Block是磁盘操作最小的单元,读写操作均以Block为最小单元,一般为512 Byte。文件系统在物理Block之上抽象了另一层概念,文件系统Block物理磁盘Block的整数倍。通常为几KB。Hadoop提供的df、fsck这类运维工具都是在文件系统的Block级别上进行操作。

HDFS的Block块比一般单机文件系统大得多,默认为128M。HDFS的文件被拆分成block-sized的chunk,chunk作为独立单元存储。比Block小的文件不会占用整个Block,只会占据实际大小。例如, 如果一个文件大小为1M,则在HDFS中只会占用1M的空间,而不是128M。

大小设计原则

1 尽量小的查找时间比例
如果Block设计比较小,查找Block位置的时间占了传输时间的很大部分,那么传输的效率会比较低
2 合理的Map、Reduce的任务个数
Block设置过大,那么Map、Reduce的任务个数会比较小,如果小于集群机的数量,会使得作业运行效率非常低。
所以Block的大小设计是平衡上述两点的结果。

2.2 Namenode 和 Datanode

元数据:描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
整体:整个HDFS集群由Namenode和Datanode构成master-worker(主从)模式。Namenode复杂构建命名空间,管理文件的元数据等,而Datanode负责实际存储数据,负责读写工作。

2.2.1 Namenode:

是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
文件包括:

  • fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
  • edits:操作日志文件。
  • fstime:保存最近一次checkpoint的时间

元数据的存储细节
这里写图片描述
图片介绍:例如要读取文件3,它分成了两块blk_1和blk_2,他们分别存储于h0,h1,h3 和h0, h2,h4,那么客户端得到这些元信息,就可以去h0或h1或h3拿block1(h0坏了就去h1拿,就近原则),然后拿齐block1和block2组合起来就是整个文件3。

2.2.1 Namenode工作特点:
1 Namenode始终在内存中保存metedata,用于处理“读请求”
到有“写请求”到来时,namenode会首先写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回
2 Hadoop会维护一个fsimage文件,也就是namenode中metedata的镜像,但是fsimage不会随时与namenode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。
3 Secondary namenode就是用来合并fsimage和edits文件来更新NameNode的metedata的。

2.2.2 SecondaryNameNode:

是Namenode的HA(高可靠性)的解决方案,由Zookeeper负责管理。整个集群里面只有一个active的Namenode,其他Namenode处于standby的状态,当active的损坏,启动standby的NameNode。
执行过程:
从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,替换旧的fsimage。默认在安装在NameNode节点上,但这样不安全,应该安装在不同的位置。

checkpiont:
等于记录一个检查点,有两种记录方式:

  • fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。
  • fs.checkpoint.size 规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间。默认为64M。

SecondaryNameNode工作流程:
1 secondary通知namenode切换edits文件
2 secondary从namenode获得fsimage和edits(通过http)
3 secondary将fsimage载入内存,然后开始合并edits
4 secondary将新的fsimage发回给namenode
5 namenode用新的fsimage替换旧的fsimage

2.2.3 Datanode:

提供真实文件数据的存储服务。
文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block。
剩余的小文件不占用整个Block:不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。
Replication。为了高可靠性,储存多复本。默认是三个。

整体的结构图:

这里写图片描述
流程简介:用户(Client)发送读写信息给Namenode(如果是写信息,namenode会先向edits写日志,如果成功返回才修改内存),然后向客户端返回元信息,客户端得到这些信息后去Datanode读取数据,Secondarynamenode是用于Namenode的备份,用于active的Namenode和备份的standby的Namenode之间的信息同步。

2.3 Block Caching

DataNode通常直接从磁盘读取数据,但是频繁使用的Block可以在内存中缓存。默认情况下,一个Block只有一个数据节点会缓存。但是可以针对每个文件可以个性化配置。
作业调度器可以利用缓存提升性能,例如MapReduce可以把任务运行在有Block缓存的节点上。
用户或者应用可以向NameNode发送缓存指令(缓存哪个文件,缓存多久), 缓存池的概念用于管理一组缓存的权限和资源。

2.3 HDFS Federation

我们知道NameNode的内存会制约文件数量,HDFS Federation提供了一种横向扩展NameNode的方式。在Federation模式中,每个NameNode管理命名空间的一部分,例如一个NameNode管理/user目录下的文件, 另一个NameNode管理/share目录下的文件。
每个NameNode管理一个namespace volumn,所有volumn构成文件系统的元数据。每个NameNode同时维护一个Block Pool,保存Block的节点映射等信息。各NameNode之间是独立的,一个节点的失败不会导致其他节点管理的文件不可用。
客户端使用mount table将文件路径映射到NameNode。mount table是在Namenode群组之上封装了一层,这一层也是一个Hadoop文件系统的实现,通过viewfs:协议访问。

3 命令行接口

简介:

  • 调用文件系统(FS)Shell命令应使用 bin/hadoop fs 的形式。
  • 所有的FS shell命令使用URI路径作为参数。
  • URI格式是scheme://authority/path。HDFS的scheme是hdfs,对本地文件系统,scheme是file。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。

常用的命令:

-help [cmd] //显示命令的帮助信息
-ls(r) (path) //显示当前目录下所有文件
-du(s) (path) //显示目录中所有文件大小
-count[-q] (path) //显示目录中文件数量
-mv (src) (dst) //移动多个文件到目标目录
-cp (src) (dst) //复制多个文件到目标目录
-rm(r) //删除文件(夹)
-put (localsrc>(dst) //本地文件复制到hdfs
-copyFromLocal //同put
-moveFromLocal //从本地文件移动到hdfs
-get [-ignoreCrc] (src) (localdst) //复制文件到本地,可以忽略crc校验
-getmerge (src) (localdst) //将源目录中的所有文件排序合并到一个文件中
-cat (src) //在终端显示文件内容
-text (src) //在终端显示文件内容
-copyToLocal [-ignoreCrc] (src) (localdst) //复制到本地
-moveToLocal (src> (localdst>
-mkdir (path) //创建文件夹
-touchz (path) //创建一个空文件

4 Java接口

实际的应用中,对HDFS的大多数操作还是通过FileSystem来操作,主要关注HDFS的实现类DistributedFileSystem及相关类。

猜你喜欢

转载自blog.csdn.net/xiayto/article/details/79849533