Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有不少共同点。但同时,它和其余的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,很是适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是做为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。这个项目的地址是http://hadoop.apache.org/core/。html
1. HDFS有如下几个主要特色:java
处理超大文件:存储的一个超大文件能够达到数GB级、数TB级、数PB级。node
集群规模动态扩展:节点动态加入到集群,能够数百数千个apache
流式数据读写:HDFS的设计思想“一次写入,屡次读取”,一个数据集一旦由数据源生成,就会被复制分发到不一样的存储节点中,而后响应各类各样的数据分析任务请求。HDFS处理的应用通常是批处理,而不是用户交互式处理,注重的是数据的吞吐量而不是数据的访问速度。安全
运行于廉价的商用机器集群上:HDFS设计时充分考虑可靠性、安全性及高可用性,所以Hadoop对硬件要求比较低,能够运行于廉价的商用机器集群,无需昂贵的高可用性机器服务器
2. HDFS的局限性:网络
不适合低延迟数据访问:HDFS是为了处理大型数据集,主要是为了达到高的数据吞吐量而设计,这就可能以高延迟做为代价。10毫秒如下的访问能够无视hdfs,不过hbase能够弥补这个缺点架构
没法高效存储大量小文件:namenode节点在内存中存储整个文件系统的元数据,所以文件的数量就会受到限制,每一个文件的元数据大约150字节分布式
不支持多用户写入及任意修改文件:不支持多用户对同一文件进行操做,并且写操做只能在文件末尾完成,即追加操做。oop
在一个全配置的集群上,运行HDFS意味着在网络分布的不一样服务器上运行一些守护进程(daemon),这些进程有各自的特殊角色,并相互配合,一块儿造成一个分布式文件系统
数据块
HDFS也有和LInux文件系统相似的块的概念,只不过默认的块的大小是64MB,和普通文件系统相似,HDFS上的文件也进行分块,块做为单独的存储单元,以Linux上普通文件形式保存在数据节点的文件系统中。数据块是HDFS的文件存储单元
HDFS被设计成支持大文件,适用HDFS的是那些须要处理大规模的数据集的应用。这些应用都是只写入数据一次,但却读取一次或屡次,而且读取速度应能知足流式读取的须要。HDFS支持文件的“一次写入屡次读取”语义。一个典型的数据块大小是64MB。于是,HDFS中的文件老是按照64M被切分红不一样的块,每一个块尽量地存储于不一样的Datanode中。
HDFS使用数据块有以下好处:
一、HDFS能够保存比存储节点单一磁盘大的文件
文件块能够保存在不一样的磁盘上
二、简化了存储子系统
将管理块和管理文件的功能区分开,简化了存储管理,也消除了分布式管理文件元数据的复杂性
三、方便容错,有利于数据复制
数据块会在不一样的机器上进行复制(通常副本数为3,保存在3个不一样的地方)
为何HDFS中要使用这么大的数据块?
能够减小管理数据块须要的开销
Namenode 和 Datanode
HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和必定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode通常是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户可以以文件的形式在上面存储数据。从内部看,一个文件其实被分红一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操做,好比打开、关闭、重命名文件或目录。它也负责肯定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的建立、删除和复制。
Namenode和Datanode被设计成能够在普通的商用机器上运行。这些机器通常运行着GNU/Linux操做系统(OS)。HDFS采用Java语言开发,所以任何支持Java的机器均可以部署Namenode或Datanode。因为采用了可移植性极强的Java语言,使得HDFS能够部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其它机器分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的状况比较少见。
集群中单一Namenode的结构大大简化了系统的架构。Namenode是全部HDFS元数据的仲裁者和管理者,这样,用户数据永远不会流过Namenode。
客户端
客户端是用户和HDFS进行交互的手段,HDFS提供了各类各样的客户端,包括命令行接口、java API、Thrift接口、C语言库、用户空间文件系统等
一、http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html
二、《Hadoop技术内幕 深刻解析HADOOP COMMON和HDFS架构设计与实现原理》