Hadoop核心组件之HDFS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z1219346000/article/details/79979186

一.HDFS简介

  HDFS(Hadoop Distributed File System,Hadoop分布式文件系统),源自于Google于2003年10月发表的GFS论文,是GFS克隆版,为hadoop提供存储功能。

官方解释:Hadoop分布式文件系统(HDFS)是一种为在商用硬件上运行而设计的分布式文件系统。 它与现有的分布式文件系统有许多相似之处。 但是,与其他分布式文件系统的不同的地方很值得注意:HDFS是高度容错;可部署在低成本硬件上。HDFS提供对应用程序数据的高吞吐量访问,适用于具有大数据集的应用程序。 HDFS放宽了一些POSIX要求来启用对文件系统数据的流式访问。 HDFS最初是作为Apache Nutch网络搜索引擎项目,是Apache Hadoop Core项目的一部分。

二.高可靠

HDFS集群是由一个namenode和多个datanodes组成,namenode用来存储元数据(namenode:管理节点 由命名空间的元数据和数据块池组成,数据池包含该命名空间下的所有数据块),上传的文件都会被切割成block块的形式存储在datanode中(每个block块默认128M),每个block块都会默认在不同的节点上存储3份 ,如果一个节点宕掉,那么系统会默认从其他节点读取另外的副本并复制出来一份,仍然坚持3个复份,如果过一会之前那个宕掉的机器自己恢复了,那个数据超过了3份 就会从其中的删除一个,总之就是维持在每个数据块的3个复份,datanode定期会向namenode以rpc的方式发送心跳(默认3秒),如果10分钟之内未发送则namenode认为此datanode宕掉。但是如果namenode宕掉的话呢?两种方法:1.搭建HA(我会在以后的文章写到)2.namenode在启动的会默认创建一个检查点checkpoint ,scondarynamenode会定期向namenode发送信息,通过对fsimage(镜像文件)、editlog(操作日志)进行日志的合并,合并条件:1.按照时间进行合并默认60分钟(dfs.namenode.checkpoint.period   3600) 2.hdfs的操作次数默认100万次(dfs.namenode.checkpoint.txns, 100万)。

三.副本放置策

BlockPlacementPolicyDefault类中的注释具体解释了3个副本的存放位置

The class is responsible for choosing the desired number of targets
 for placing block replicas.
 The replica placement strategy is that if the writer is on a datanode,
 the 1st replica is placed on the local machine, 
 otherwise a random datanode. The 2nd replica is placed on a datanode
 that is on a different rack. The 3rd replica is placed on a datanode
 which is on a different node of the rack as the second replica
概括为以下三点:

    • 1 如果写请求方所在机器是其中一个datanode,则直接存放在本地,否则随机在集群中选择一个datanode.
    • 2.第二个副本存放于不同第一个副本的所在的机架.
    • 3.第三个副本存放于第二个副本所在的机架,但是属于不同的节点.

Replication 机架感知

对于一个大的集群,它可能不会在一个扁平化的拓扑结构中直接的连接所有节点。通常的做法是,在多个机架的分散的节点。机架的节点共享一个开关,并且机架开关由一个或多个核心交换机连接。不同机架的两个节点的通信,要经历多个开关。大部分情况下,同一机架节点之间的网络带宽比不同机架之间的网络带宽要更大。

HDFS使用一个简单的但高有效性的策略来分配块的副本。如果在 HDFS 集群的某些节点上正在执行打开一个文件以用来写入块的操作,那么第一个副本被分配到正在操作的客户端的这台机器上。第二个副本被随机分配到不同于第一个副本所在的机架的另一个机架上。第三个副本被随机分配到第二个副本所在机架的不同节点上。意思是,一个块被分配到了不同的机架上面。这个关键规则适用于数据的每一个快,两个副本在同一机架,另一个在不同的机架上。

三.HDFS的写流程:

                                       (官方图)

具体描述如下:

1. 首先HDFS Client创建DistributedFileSystem对象通过RPC调用NameNode去创建一个没有blocks关联的新文件。创建前,NameNode会检验当前要写入的文件是否存在,客户端是是否有权限创建等,校验通过, namenode就会记录下新文件,否则就会抛出IO异常。

2. 检验通过后,在自己的元数据中为新文件分配文件名,同时为此文件分配数据块的备份数(此备份数可以在搭建时的参数文件中设定,也可以后来改变,系统默认3份),并为不同的备份副本分配不同的DataNode,并生成列表,将列表返回客户端。

3.Client调用DistributedFileSystem对象的create方法,创建一个(FSDataOutputStream)文件输出流对象,协调NameNode和DataNode,开始写数据到DFSOutputStream对象内部的Buffer中,然后数据被分割成一个个小的packet(数据在向DataNode传递时以Packet最小单位),然后排成队列data quene。DataStreamer会去处理接受data quene,它先询问NameNode这个新的Block最适合存储的在哪几个DataNode里,把他们排成一个Pipeline。

4.DataStreamer把packet按队列输出到管道的第一个DataNode中,同时把NameNode生成的列表也带给第一个DataNode,当第1个packet传递完成时(注意是packet而不是整个数据传递完成),第一个DataNode传递信息给第二个DataNode开始把传递完成的pakage以管道的形式再传递给第二个DataNode,同时把除掉第一个DataNode节点信息的列表把传给第二个DataNode,依此类推,直到传递到最后一个DataNode,它会返回Akc到前一个DataNode,最终由Pipeline中第一个DataNode节点将Pipeline ack发送给Client

5.完成向文件写入数据Client在文件输出流(FSDataOutputStream)对象上调用close方法,关闭流,调用DistributedFileSystem对象的complete方法,通知NameNode文件写入成功。

四.读流程

                                          (官方图)

具体描述如下:

1.首先调用FileSystem对象的open方法,其实是一个DistributedFileSystem的实例

2. DistributedFileSystem通过rpc获得文件的第一批个block的locations,同一block按照重复数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面.

3.前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream最会找出离客户端最近的datanode并连接。

4.数据从datanode流向客户端。

5.如果第一块的数据读完了,就会关闭指向第一块的 datanode连接,接着读取下一块。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。

6.如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流。

五.优缺点 

优点:

1.高容错性:数据自动保存多个副本,副本丢失后,会自动恢复。

2. 适合批处理:移动计算而非数据、数据位置暴露给计算框架。

3.适合大数据处理:GB TB PB级数据,1000以上各节点规模。

4. 流式文件访问:一次性写入,多次读取;保证数据一致性。

5.可构建在廉价机器上:通过多副本提高可靠性,提供了容错和恢复机制。

缺点:

(1) 低延迟数据访问:比如毫秒级、低延迟与高吞吐率。

(2) 小文件存取:占用NameNode大量内存,寻道时间超过读取时间。

(3) 并发写入、文件随机修改:一个文件只能有一个写者,仅支持append




阅读更多

没有更多推荐了,返回首页