一、适应场景
HDFS是Hadoop的分布式文件系统,即Hadoop Distributed Filesystem。
HDFS以流式数据访问模式来存储超大文件,运行于商用硬件集群上。这句话信息量太大,分解开来就是HDFS适合如下场景:
(1)超大文件
超大文件这里指具有几百MB、几百GB甚至几百TB大小的文件。存储PB级数据的Hadoop集群国内外都有。
(2)流式数据访问
一次写入,多次读取。数据文件生成并写入后就不再改变,接着长时间在此数据集上进行各种分析,这种设计简化了数据一致性问题,使得高吞吐量的数据访问成为可能。
(3)商用硬件
Hadoop设计运行在商用硬件集群上,而不需要运行在昂贵且高可靠的硬件上。Hadoop认为硬件错误是常态,HDFS在遇到这类故障时,能够继续运行而不会让用户觉察到明显的中断。
当然HDFS不能包治百病,它也有其不适合的场景:
(1)低时间延迟的数据访问
HDFS是为高数据吞吐量应用优化的,这可能会以高时间延迟为代价,对于要求低时间延迟(比如几十毫秒)数据访问需求,HBase会是更好的选择。
(2)大量的小文件
由于namenode将文件系统的元数据存储在内存中,如果有大量(比如数十亿)的小文件,那么这些文件的元数据总和将会超出当前硬件的能力。
(3)多用户写入,任意修改文件
HDFS中的文件可能只有一个writer,而且写操作总是将数据添加在文件的末尾,它不支持具有多个写入者的操作,也不支持在文件的任意位置进行修改。
二、基本概念
1、数据块
每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位。构建于单个磁盘之上的文件系统通过磁盘块来管理该文件系统中的块,该文件系统块的大小可以是磁盘块的整数倍。文件系统块一般为几千字节,而磁盘块一般为512字节。
HDFS同样也有块(block)的概念,但是大得多,默认为64MB。与单一磁盘上的文件系统相似,HDFS上的文件也被划分为块大小的多个分块(chunk),作为独立的存储单元。
HDFS的块比磁盘块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间可以明显大于定位在这个块开始位置所需的时间。这样,传输一个由多个块组成的文件的时间取决于磁盘传输速率。很多情况下,HDFS使用128MB的块设置,以后随着磁盘驱动器传输速率的提升,块的大小将会被设置得更大,当然这个参数也会受到MapReduce中map任(一次处理一个块中的数据)务与集群节点数的影响。
对分布式文件系统中的块进行抽象会带来很多好处:
(1)一个文件的大小可以大于网络中任意一个磁盘容量,甚至是整个HDFS集群只存储一个文件都可以。
(2)使用块抽象而非整个文件作为存储单元,大大简化了存储子系统的设计。
(3)块非常适合用于数据备份进而提供数据容错能力和可用性。
与磁盘文件系统相似,HDFS中fsck指令可以显示块信息:
%hadoop fsck / -files -blocks
2、namenode和datanode
HDFS集群有两类节点,并以管理者-工作者模式运行,即一个namenode(管理者)和多个datanode(工作者)。
namenode管理文件系统的命名空间,维护着文件系统树及整棵树内所有的文件和目录,这些信息以两个文件形式永久保存在本地磁盘上,即命名空间镜像文件和编辑日志文件。
datanode是文件系统的工作节点,它根据需要存储并检索数据块(受客户端或namenode调度),并且定期向namenode发送它所存储的块的列表。
三、系统架构
HDFS采用主从(Master/Slave)结构模型,主从架构表现的是Component之间的关系,即由主组件控制从组件。
一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中,NameNode作为主服务器即中心服务器,负责管理文件系统的命名空间(NameSpace)和客户端对文件的访问操作。集群中的DataNode一般是一个节点一个,负责管理它所在节点上的存储。HDFS允许用户以文件的形式存储数据。
从内部来看,文件被分成若干个数据块(Block),而且这若干个数据块存放在一组DataNode上。NameNode执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录等,同时决定数据块到具体DataNode节点的映射。DataNode负责处理文件系统客户端的文件读写请求,并在NameNode的统一调度下进行数据块的创建、删除和复制工作。下图给出了HDFS的体系结构:
图1 HDFS体系结构
HDFS通讯协议构建在TCP/IP协议之上,客户端通过一个可配置的TCP端口连接到NameNode,通过ClientProtocol协议与NameNode交互。而DataNode使用DatanodeProtocol协议与NameNode交互。从ClientProtocol和Datanodeprotocol协议抽象出一个远程过程调用(RPC)模型,在设计上,NameNode不会主动发起RPC,而是响应来自客户端和DataNode的RPC请求。
HDFS采用Java语言开发,因此任何支持Java的机器都可以部署NameNode和DataNode。一个典型的部署场景是集群中的一台机器运行一个NameNode实例,其他机器分别运行一个DataNode实例。当然,并不排除一台机器运行多个DataNode实例的情况。集群中单一的NameNode的设计则大大简化了系统的架构。当然NameNode也有单点风险,所以要尽量简化。NameNode是所有HDFS元数据的管理者,用户数据永远不会经过NameNode,即文件数据的读写是直接在DataNode上。
阅读(5041) | 评论(1) | 转发(2) |