Hadoop分布式文件系统HDFS
HDFS,Hadoop Distributed File System,是一个设计用来保存大数据量的数据的分布式文件系统(TB级甚至是PB级),并提供快速访问这些数据的能力,数据通过冗余的方式保存在多台机器上,以来保存对失败的容错性和并行应用的高度可用性。
HDFS的设计相对其它分布式文件系统,比如NFS,对几个问题是健壮的,特别市:
1.HFDS设计用来保存非常大的数据量信息,就需要将数据分布到大量的机器上,它支持比NFS大得多的文件大小。
2.HFDS的数据保存是可靠的,如果集群中的某些机器工作不正常,数据仍然是可用的。
3.HDFS提供快速,可扩展的数据访问能力。
4.通过简单添加一些机器,就可以使集群能服务于更多得客户端是可能的。
5.HDFS与Hadoop MapReduce能很好地集成,它在可能的情况下,能使数据读取、计算本地化。
HDFS虽然具有很强的可扩展性,但由于它高性能的设计也使它局限于某些应用范围,它并不是如NFS通用。HDFS做出的一些权衡:
1、应用程序使用HDFS要使用流式读取文件,HDFS对流式读取文件进行了优化,但这seek到文件的任一位置操作代价就高了。
2.数据是一次写入,多次读取;Hadoop不支持写操作关闭文件后,再更新文件。但可以追加文件。
3.文件很大,流式读取,所以系统不提供本地缓存机制。
4.Hadoop假设每个机器都可能永远或暂时的失败,集群必须能应付多台机器同时失效的情况,集群性能下降应与损失的机器成比例,但系统作为一个整体不应变得很慢,也不应该有数据丢失,Hadoop用复制数据的策略来克服这一困难。
HDFS是基于Google File System设计的,它是块结构的文件系统,单个文件被分成相同大小的块,这些块被分布到集群中的多台机器上,集群中的单个机器被称为数据节点(DataNode),一个文件可由多个块组成,它们并不需要放到同一台机器上,保存每个块的机器是由负载均衡随机选择的,因此访问一个文件需要多台机器协作。使用多台机器保存一个文件,这些机器中任一一台崩溃都会导致文件不可访问,HDFS通过将每块复制到多台机器(默认3台)的方式来解决这个问题。
HDFS中默认使用块大小为64MB,这使得HDFS减少了对每个文件元数据的存储量,另外,通过把大量数据连续化存放在磁盘上,就可以快速地流式读取数据(不是利用Linux上的文件系统吗?)。这种设计的结果是HDFS倾向于处理大文件。HDFS希望程序从开始顺序读到结尾的方式读,这在MapReduce形式的编程中非常有用。
HDFS是在一些机器中以块的形式保存文件,但这些文件并不是普通文件系统的一部分,在运行Hadoop服务的数据节点上输入ls命令,可以显示普通文件系统的内容,不能显示HDFS中的文件,这是因为HDFS是在一个不同的命名空间中运行的,它与本地文件内容是隔离的,HDFS中的文件是保存在数据节点服务管理德一个特定目录下,这些文件没有名字,只有块id,无法通过linux文件命令与HDFS中的文件交互。
文件系统可靠地保存它的元数据是很重要的,HDFS文件数据是以一次写入,多次读取的方式访问的,元数据结构(文件名,目录名)会被大量客户端同时修改,元数据结构信息不失去同步行是很重要的,所以这些只由一台机器来处理,它被称为名称节点(NameNode),保存着文件系统中所有元数据。因为每个文件都有较少的元数据(它只保存文件名、权限、和文件每块的位置),所有元数据都保存在NameNode的内存中,可以进行快速的访问。要打开一个文件,客户端从NameNode取得该文件每个块的位置,即哪些节点保存着这个文件的块,客户端再直接从DataNode中读取每个块,这个过程可以并行读取。NameNode并不直接参与块数据的传输可以减少它的压力。