分类: HADOOP
2014-03-19 14:27:27
Hadoop是一个基于JAVA的支持数据密集型分布式应用的分布式文件系统。它能够保证应用可以在上千个低成本商用硬件存储结点上处理PB级的数据。Hadoop是Apache开源项目,Yahoo支持这个项目并在自己的web搜索和商业广告业务上使用它。Hadoop开发类似于Google的MapReduce和Google文件系统的技术。图 5.9为Hadoop的整体结构。
Hadoop作为一个开源项目,受到GoogleFS很大启发。Hadoop包括两个部分:Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)和MapReduce编程模型,其中HDFS运行在商用硬件上,它和现有分布式文件系统很相似,但也具备了明显的差异性,比如HDFS是高度容错的,可运行在廉价硬件上;HDFS能为应用程序提供高吞吐率的数据访问,适用于大数据集的应用中;HDFS在POSIX规范进行了修改,使之能对文件系统数据进行流式访问,从而适用于批量数据的处理。HDFS为文件采用一种"一次写多次读"的访问模型,从而简化了数据一致性问题,使高吞吐率数据访问成为可能,一些Map/Reduce应用和网页抓取程序在这种访问模型下表现完美。
如果距离数据越近,计算就越为有效,特别是在大数据集情况下,它能最小化网络冲突并提高系统的总吞吐率。因此HDFS提出了"移动计算能力比移动数据更廉价" 的设计理念,它将计算迁移到距离数据更近的位置,而不是将数据移动到应用程序运行的位置,HDFS提供了这种迁移应用程序的API接口。
HDFS是一种主/从模式的系统结构,如错误!未找到引用源。5.9所示,主服务器,即上图中的命名节点,它管理文件系统命名空间和客户端访问,具体文件系统命名空间操作包括'打开'、'关闭'、'重命名'等,并负责数据块到数据节点之间的映射;此外,存在一组数据节点,它除了负责管理挂载在节点上的存储设备,还负责响应客户端的读写请求。HDFS将文件系统命名空间呈现给客户端,并运行用户数据存放到数据节点上。从内部构造看,每个文件被分成一个或多个数据块,从而这些数据块被存放到一组数据节点上;数据节点会根据命名节点的指示执行数据块创建、删除和复制操作。
大量的低成本商用计算机具有较高的失效率,因此失效检测,快速高效的恢复是Hadoop文件系统的主要设计目标。同时Hadoop也更加适用于批量流水数据存取应用而不是交互较多的小I/O应用,事实上它更加关注提高系统的整体吞吐率而不是响应时间。同时HDFS更优化存储大文件(最好是64MB的倍数)。并且系统使用简单的一致性协议,因此主要针对面向写一次读很多次的应用。Hadoop同时给应用程序提供接口以保证处理过程尽量靠近数据的位置,减少中间数据传输的开销。Hadoop很容易从一个平台移植到另一个平台。
HDFS有一个主从结构。一个HDFS集群包含一个NameNode和多个DataNode。NameNode是主服务器,维护文件系统命名空间、规范客户对于文件的存取和提供对于文件目录的操作。DataNode负责管理存储结点上的存储空间和来自客户的读写请求。DataNode也执行块创建、删除和来自NameNode的复制命令。
HDFS被设计用来可靠性地保存大文件,它使用一组顺序块保存文件,除文件最后一个块外,其他的块大小相等。块大小和文件的副本数依赖于每个文件自己的配置。NameNode周期性的收到每个DataNode的心跳和块报告,前者表示相应的DataNode是正常的,而后者包括DataNode上所有block的列表。机架可知的副本放置策略是HDFS性能和可靠性的关键。它通过在多个节点上复制数据以保证可靠性。缺省的冗余度是3,两个数据副本在同一个机架,另一个在其他的机架。当用户访问文件时,HDFS把离用户最近的副本数据传递给用户使用。
HDFS的命名空间存放在NameNode上,NameNode使用事务log(EditLog)去记录文件系统元数据的任何改变。而文件系统命名空间包括文件和块的映射关系和文件系统属性等它们存放在FsImage文件中,Editlog和FsImage都保存在NameNode的本地文件系统中。同时它还在内存中保存整个文件系统的命名空间和文件的块映射图。
所有HDFS的通讯协议是建立在TCP/IP协议之上的,在客户和NameNode之间建立ClientProtocol协议,文件系统客户端通过一个端口连接到命名节点上,通过客户端协议与命名节点交换;而在DataNode和NameNode之间建立DataNode协议。上面两种协议都封装在远程过程调用协议(Remote Procedure Call,RPC)之中。一般地,命名节点不会主动发起RPC,只响应来自客户端和数据节点的RPC请求。
HDFS提出了数据均衡方案,即,如果某个数据节点上的空闲空间低于特定的临界点,那么就会启动一个计划自动地将数据从一个数据节点迁移到空闲的数据节点上。当对某个文件的请求突然增加时,那么也可能启动一个计划创建该文件新的副本,并分布到集群中以满足应用的要求。副本技术在增强均衡性的同时,也增加系统可用性。
当一个文件创建时,HDFS并不马上分配空间,而是在开始时,HDFS客户端在自己本地文件系统使用临时文件中缓冲的数据,只有当数据量大于一个块大小时,客户端才通知NameNode分配存储空间,在得到确认后,客户端把数据写到相应的DataNode上的块中。当一个客户端写数据到HDFS文件中时,本地缓冲数据直到一个满块形成,DataNode从NameNode获取副本列表,客户端把数据写到第一个DataNode后,当这个DataNode收到小部分数据时(4KB)再把数据传递给第二个DataNode,而第二个DataNode也会以同样方式把数据写到下一个副本中。这就构成了一个流水线式的更新操作。
在删除文件时,文件并不立刻被HDFS删除,而是重命名后放到/trash目录下面,直到一个配置的过期时间到才删除文件。
文件系统是建立在数据结点集群上面,每个数据结点提供基于块的数据传输。浏览器客户端也可以使用HTTP存取所有的数据内容。数据结点之间可以相互通信以平衡数据、移动副本,以保持数据较高的冗余度。
From: