Hadoop核心组件之HDFS

原创 2018年04月17日 20:55:34

一.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




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

hadoop的三大核心组件之HDFS和YARN

Hadoop的三大核心组件之HDFS和YARN Hadoop集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起。 (1)HDFS集群:负责海量数据的存储,集群中...
  • Zonzereal
  • Zonzereal
  • 2017-09-26 14:42:04
  • 4658

Hadoop核心组件:四步通晓HDFS

HDFS作为Hadoop的核心组件,掌握和了解HDFS对于学习Hadoop有着重要的意义,本文通过四个步骤全面阐述HDFS的操作应用,是学习Hadoop人员不得不看的经典分享。...
  • dashujuedu
  • dashujuedu
  • 2016-12-16 11:28:15
  • 1333

Hadoop核心之HDFS 架构设计

概述:HDFS即Hadoop Distributed File System分布式文件系统,它的设计目标是把超大数据集存储到分布在网络中的多台普通商用计算机上,并且能够提供高可靠性和高吞吐量的服务。分...
  • suifeng3051
  • suifeng3051
  • 2015-09-18 16:55:53
  • 8744

一篇很好的Hadoop入门文章:Hadoop是什么、核心HDFS与MapReduce的原理

Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身。 《Hadoop基础教程》是我...
  • zhangliangzi
  • zhangliangzi
  • 2016-07-30 10:12:08
  • 5081

大数据开发利器:Hadoop(1)

1.1 Hadoop 简介   Hadoop是Apache软件基金会旗下的一个开源分布计算平台,为用户提供底层细节透明的分布式基础架构。   Hadoop是基于JAVA语言开发的,由于JAVA语言的特...
  • Dr_Lecter
  • Dr_Lecter
  • 2016-10-09 23:42:22
  • 332

Hadoop(三)——核心之一HDFS

上篇讲述了Hadoop分布式集群环境的搭建,其实重要是HDFS分布式文件系统的搭建,MapReduce主要是需要我们程序员来进行编写算法来进行逻辑运算的。这篇就重点来讲述一下HDFS(HadoopDi...
  • liujiahan629629
  • liujiahan629629
  • 2015-08-28 00:06:09
  • 4800

hadoop基础概念之Hadoop核心组件

本文通过Hadoop组件,大数据处理,Hadoop核心三个方面层层递进,引出Hadoop和组件作用,对于了解和认知Hadoop具有一定的指导作用。...
  • dashujuedu
  • dashujuedu
  • 2016-12-01 15:48:50
  • 1905

hadoop学习——Hadoop核心组件

下图展示了hadoop生态系统的核心组件。                                     下面来简单介绍各个组件的作用:  HDFS(Hadoop dist...
  • hehongbo7632566
  • hehongbo7632566
  • 2014-11-18 21:21:18
  • 1274

hadoop简介ppt

  • 2010年01月17日 22:16
  • 1.42MB
  • 下载

Hadoop与Spark的核心组件对比

一、Hadoop的核心组件           Hadoop的核心组件包括:MapReduce和HDFS。           1、HDFS的体系结构           我们首先介绍HDFS的体系结...
  • u012050154
  • u012050154
  • 2016-09-09 10:37:16
  • 2265
收藏助手
不良信息举报
您举报文章:Hadoop核心组件之HDFS
举报原因:
原因补充:

(最多只允许输入30个字)