Hadoop简介

来源:互联网 发布:淘宝蹭淘气值评价 编辑:程序博客网 时间:2024/06/13 09:40

Hadoop是一个能够对大量数据进行分布式处理的软件框架。Hadoop最核心的设计是:HDFS(hadoop distributed File System)和MapReduce。HDFS(分布式文件系统)为海量数据提供了存储,MapReduce则为海量数据提供了计算。

Hadoop由以下几个项目构成:



1、Hadoop Common :Hadoop体系最底层的一个模块,为hadoop各子项目提供各种工具,如配置文件和日志操作。

2、HDFS:提供高吞吐量的应用程序数据访问。对于外部客户机而言,HDFS就像一个传统的分级文件系统,可以创建、删除、移动、重命名。但HDFS的架构是基于一组特定的节点构建的。这些节点包括NameNode(只有一个),它在HDFS内部提供元数据服务;DataNode,它为HDFS提供存储块。NameNode可以控制所有的文件操作。HDFS

内部的所有通信都是基于TCP/IP通信。

3、MapReduce:一个分布式海量数据处理的软件框架集计算集群。

4、Zookeeper:针对大型分布式系统的可靠协调系统,提供的功能包括:配置服务、名字服务、分布式同步、组服务。Zookeeper的目标是封装好复杂易出错的关键接口,将简单易用的接口和性能高效、功能稳定的系统提供给用户。


HDFS(hadoop distributed file system)是一个高度容错性的系统,适合部署在廉价机器上,HDFS提供高吞吐量的数据访问,适合有超大数据集的应用程序。

HDFS特点:

1.大数据文件,适合T级别的大文件或者一堆大数据文件的存储。

2、文件分块存储,HDFS会将一个完整的大文件平均分块存储到不同的机器上, 在读取文件时可以同时从多个主机取不同区块的文件,多主机读取比单主机读取效率高的多。

3.流式数据访问:一次写入多次读写,这种模式和传统的文件不同,它不支持动态改变文件内容,而是要求让文件一次写入就不做变化,要变化也只能是在文件末尾添加内容。HDFS更多考虑到了数据批处理,而不是用户交互处理。

4、廉价硬件,HDFS可以应用再普通PC机上,这种机制能让一些公司用几十台廉价的计算机就可以撑起一个大数据集群。

5、硬件故障,HDFS认为所有的计算机都会出现故障,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其他某几个主机上,如果其中一台主机失效,可以迅速找另一块副本取文件。


Namenode和Datanode

HDFS采用master/slave架构,一个HDFS集群是由一个Namenode和一定数目的Datanodes组成,Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是  一个节点一个,负责管理它所在的节点上的存储,HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据,从内部看,一个文件其实被分成一个或者多个数据块,这些块存储在一组Datanode上,Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或者目录。它也负责确定数据块到具体Datanode节点的映射,Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。



HDFS采用java语言开发,因此任何支持java的机器都可以部署Namenode或Datanode。

数据复制:HDFS被设计成能够在一个大集群中跨机器可靠的存储超大文件。它将每个文件存储成一系列的数据块,除了最后一个,所有的数据块都是同样大小的。为了容错,文件的所有数据块都会有副本,每个文件的数据块大小和副本系数都是可以配置的。应用程序可以指定摸个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。HDFS的文件都是一次性写入的,并且严格要求在任何时候只能有一个写入者。

Namenode全权管理数据块的复制,它周期性的从集群中的每个Datanode接收心跳信号和块状态报告(Blockreport)。接收到心跳信号意味着该Datanode节点工作正常,块状态报告包含了一个该Datanode

上所有数据块的列表。


副本存放:副本存放是HDFS可靠性和性能的关键,优化的副本存放策略是HDFS区分与其他大部分分布式文件系统的重要特性。HDFS通过一种称为机架感知的策略来改进数据的可靠性、可用性和网络带宽的利用率。

大型HDFS实例一般运行在跨越多个机架的计算机组成的集群上,不同机架上的两台机器之间的通讯需要经过交换机,在大多数情况下,同一个机架内的两台机器间的带宽会比不同机架的两台机器间的带宽大。

通过一个机架感知过程,Namenode可以确定每个Datanode所属的机架id,一个简单但没有优化的策略是将副本存放在不同的机架上,这样可以防止当整个机架失效时数据丢失,并且允许读数据的时候充分利用多个机架的带宽。这种策略设置可以将副本均匀分布在集群中,有利于当组件失效情况下的负载均衡。但是,因为这种策略的一个写操作需要传输数据块到多个机架,这增加了写的代价。

在大多情况下,副本系数是3,HDFS存放策略是将一个副本存放在本地机架的节点上,一个副本放在同一机架的另一个节点上,最后一个副本放在不同机架的节点上,这种策略减少了机架间的数据传输。这就提高了写操作的效率。机架的错误远比节点的错误少。所以这个策略不会影响到数据的可靠性和可用性。同时,因为数据块只放在两个(不是三个)不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。

注:机架感知:HDFS和MapReduce组件是能够感知机架的:Namenode和jobTracker通过调用管理员配置模块中的APIresolve来获取集群里每个slave的机架id。该API将slave的DNS名称(或IP地址)转换成机架id。


副本选择:为了降低整体的带宽消耗和读取延时,HDFS会尽量让读程序读取离它最近的副本,如果在读取程序的同一个机架上有一个副本,那么就读取该副本,如果一个HDFS集群跨越多个数据中心,那么客户端也会将首先读本地数据中心的副本。


安全模式:Namenode启动后会进入一个称为安全模式的特殊状态,处于安全模式的Namenode 是不会进行数据块的复制的。Namenode从所有的Datanode接收心跳信号和块状态报告。块状态报告包括了某个Datanode的所有的数据块列表,每个数据块都有一个指定的最小副本数,当Namenode监测确认摸个数据块的副本数据达到了这个最小值,那么该数据块就被认为是副本安全的(safely replicated),在一定百分比(这个参数可配置)的数据块被Namenode监测确认安全后(加一个额外的30秒等待时间),Namenode将推出安全模式状态。接下来它会确定还有哪些数据没有达到指定数据,并将这些数据块复制到其他Datanode上。


文件系统元数据的持久化:Namenode上保存着HDFS的名字空间,对于任何文件系统元数据产生修改的操作,Namenode都会使用一种称为EditLog的事务日志记录下来,如,在HDFS中创建一个文件,Namenode就会在Editlog中插入一条记录来表示。同样修改文件的副本系数也将往Editlog插入一条记录。Namenode在本地操作系统的文件系统中存储这个Editlog。整个文件系统的名字空间,包括数据块到文件的映射、文件的属性等都存储在一个称为FsImage文件中,这个文件也是放在Namenode所在的本地文件系统上。

Namenode在内存中保存着整个文件系统的名字空间和文件数据块映射(Blockmap)的映像。这个关键的元数据结构设计得很紧凑,因而一个有4G内存的Namenode足够支撑大量的文件和目录。当Namenode启动时,它从硬盘中读取Editlog和FsImage,将所有Editlog中的事务作用在内存中的FsImage上,并将这个新版本的FsImage从内存中保存到本地磁盘上,然后删除旧的Editlog,因为这个旧的Editlog的事务都  已经作用在FsImage上了。这个过程称为一个检查点(checkpoint)。在当前实现中,检查点只发生在Namenode启动时,在不久的将来将实现支持周期性的检查点。
Datanode将HDFS数据以文件的形式存储在本地的文件系统中,它并不知道有关HDFS文件的信息。它把每个HDFS数据块存储在本地文件系统的一个单独的文件中。Datanode并不在同一个目录创建所有的文件,实际上,它用试探的方法来确定每个目录的最佳文件数目,并且在适当的时候创建子目录。在同一个目录中创建所有的本地文件并不是最优的选择,这是因为本地文件系统可能无法高效地在单个目录中支持大量的文件。当一个Datanode启动时,它会扫描本地文件系统,产生一个这些本地文件对应的所有HDFS数据块的列表,然后作为报告发送到Namenode,这个报告就是块状态报告。


通讯协议:所有的HDFS通讯协议都是建立在TCP/IP协议之上。客户端通过一个可配置的TCP端口连接到Namenode,通过ClientProtocol协议与Namenode交互。而Datanode使用DatanodeProtocol协议与Namenode交互。一个远程过程调用(RPC)模型被抽象出来封装ClientProtocol和Datanodeprotocol协议。在设计上,Namenode不会主动发起RPC,而是响应来自客户端或 Datanode 的RPC请求。


健壮性:HDFS主要目标是即使在出错的情况下也要保证数据存储的可靠性。常见的三种错误:Namenode出错,Datanode出错和网络割裂(network partitions)


磁盘数据错误,心跳监测和重新复制

每个Datanode节点周期性的向Namenode发送心跳信号,网络割裂可能导致一部分Datanode跟Namenode失去联系。Namenode通过心跳信号的缺失来监测这一情况,并将这些近期不在发送心跳信号Datanode标记为宕机,不会再将新的IO请求发送给它们,任何存储在宕机的Datanode的数据将不在有效,Datanode的宕机可能会引起一些数据块的副本系数低于指定值,Namenode不断监测这些需要复制的数据块,一旦发现就启动复制操作。在下列情况下,可能需要重新复制:某个Datanode节点失效,某个副本遭到破坏,Datanode 上的硬盘错误,或者文件的副本系数增大。


集群策略:HDFS的架构支持数据均衡策略,如果某个Datanode节点上的空闲空间低于特定的临界值,按照均衡策略系统就会自动将数据从这个Datanode移动到其他空间的Datanode,当对某个文件的请求突然增加,那么也可能启动一个计划创建该文件新的副本,并且同时重新平衡集群中的其他数据。这些均衡策略目前还未实现。


数据完整性:从某个Datanode获取的数据块有可能是损坏的,损坏可能是由Datanode的存储设备错误、网络错误或者软件bug造成的。HDFS客户端软件实现了对HDFS文件内容的校验和(checksum)检查。当客户端创建一个新的HDFS文件,会计算这个文件每个数据块的校验和,并将校验和作为一个单独的隐藏文件保存在同一个HDFS名字空间下。当客户端获取文件内容后,它会检验从Datanode获取的数据跟相应的校验和文件中的校验和是否匹配,如果不匹配,客户端可以选择从其他Datanode获取该数据块的副本。


元数据磁盘错误:FsImage和Editlog是HDFS的核心数据结构。如果这些文件损坏了,整个HDFS实例都将失效。因而,Namenode可以配置成支持维护多个FsImage和Editlog的副本。任何对FsImage或者Editlog的修改,都将同步到它们的副本上。这种多副本的同步操作可能会降低Namenode每秒处理的名字空间事务数量。然而这个代价是可以接受的,因为即使HDFS的应用是数据密集的,它们也非元数据密集的。当Namenode重启的时候,它会选取最近的完整的FsImage和Editlog来使用。

Namenode是HDFS集群中的单点故障(single point of failure)所在。如果Namenode机器故障,是需要手工干预的。目前,自动重启或在另一台机器上做Namenode故障转移的功能还没实现。


数据组织

数据块:HDFS被设计成支持大文件,适用HDFS的是那些需要处理大规模的数据集的应用,这些应用都是只写入数据一次,但却读取一次或多次,并且读取速度应能满足流式读取的需要,HDFs支持文件的“一次写入多次读取”语义,一个典型的数据块大小是64MB。因此,HDFs中的文件总是按照64M被切分成不同的块,每个块尽可能的存储于不同的Datanode中。

Staging:客户端创建文件的请求其实并没有立即发送个Namenode,事实上,刚开始HDFS客户端会先将文件数据缓存在本地的一个临时文件。应用程序的写操作被透明的重定向到这个临时文件。当这个临时文件累积的数量超过一个数据库的大小,客户端才会联系Namenode。Namenode将文件名插入文件系统的层次结构中,并且分配一个数据块给它,然后返回Datanode的标识符和目标数据块传给客户端,接着客户端将这块数据从本地临时文件上传到指定的Datanode 上。当文件关闭时,在临时文件中剩余的没有上传的数据也会传输到指定的Datanode上,然后客户端告诉Namenode文件已经关闭,此时Namenode才将文件创建操作提交到日志里进行存储。如果Namenode在文件关闭前宕机了,怎该文件将丢失。

上述方法是对在HDFS上运行的目标应用进行认真考虑后得到的结果。这些应用需要进行文件的流式写入。如果不采用客户端缓存,由于网络速度和网络堵塞会对吞估量造成比较大的影响。这种方法并不是没有先例的,早期的文件系统,比如AFS,就用客户端缓存来提高性能。为了达到更高的数据上传效率,已经放松了POSIX标准的要求。


流水线复制:当客户端向HDFS文件写入数据的时候,一开始是写到本地临时文件中,假设该文件的副本系数设置3,当本地临时文件累积到一个数据块大小的时候,客户端会从Namenode获取一个Datanode列表用于存放副本,饭后客户端开始向第一个Datanode传输数据,第一个Datanode一小部分一小部分(4KB)地接收数据,将每一部分写入本地仓库,同时传输该部分到列表中的的第二个Datanode节点。第二个Datanode也是这样,一小部分一小部分地接收数据,写入本地仓库,并同时传给第三个Datanode。最后,第三Datanode接收数据并存储在本地,因此,Datanode能流水线式的从前一个接收数据,并在同时转发给下一个节点,数据以流水线的方式从前一个Datanode复制到下一个。


存储空间回收:当用户或者应用程序删除某个文件时,这个文件并没有立刻从HDFS中删除,实际上,HDFS会将这个文件重命名转移到/trash目录。只要文件还在/trash目录中,该文件就可以迅速地恢复,文件在/trash中保存的时间是配置的,当超过这个时间,Namenode就会将该文件从名字空间中删除,删除文件会使得该文件相关的数据块被释放,注意,从用户删除文件到HDFs空闲空间的增加之间会有一定时间的延迟。

/trash目录与其他的目录并没有什么区别,除了一点:该目录上HDFs会应用一个特殊策略来自动删除文件,目前的默认策略是删除/trash中保留时间超过6小时的文件。


减少副本系数:当一个文件的副本系数被减小后,Namenode会选择过剩的副本删除,下次心跳检测时会将该信息传递给Datanode。Datanode遂即移除响应的数据块,集群中的空闲空间加大。


MapReduce

mapReduce是一套从海量源数据提取分析元素最后返回结果集的编程模型。

0 0
原创粉丝点击