hadoop学习之——hdfs

                                             HDFS的初识

    HDFSHadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上。它所具有的高容错、高可靠性、高可扩展性、高获得性、高吞吐率等特征为海量数据提供了不怕故障的存储,为超大数据集(Large Data Set)的应用处理带来了很多便利。

  Hadoop整合了众多文件系统,在其中有一个综合性的文件系统抽象,它提供了文件系统实现的各类接口,HDFS只是这个抽象文件系统的一个实例。提供了一个高层的文件系统抽象类org.apache.hadoop.fs.FileSystem,这个抽象类展示了一个分布式文件系统,并有几个具体实现,如下表1-1所示

1-1 Hadoop的文件系统

文件系统

URI方案

Java实现

org.apache.hadoop

定义

Local

file

扫描二维码关注公众号,回复: 558457 查看本文章

fs.LocalFileSystem

支持有客户端校验和本地文件系统。带有校验和的本地系统文件在fs.RawLocalFileSystem中实现。

HDFS

hdfs

hdfs.DistributionFileSystem

Hadoop的分布式文件系统。

HFTP

hftp

hdfs.HftpFileSystem

支持通过HTTP方式以只读的方式访问HDFSdistcp经常用在不同HDFS集群间复制数据。

HSFTP

hsftp

hdfs.HsftpFileSystem

支持通过HTTPS方式以只读的方式访问HDFS

HAR

har

fs.HarFileSystem

构建在Hadoop文件系统之上,对文件进行归档。Hadoop归档文件主要用来减少NameNode内存使用

KFS

kfs

fs.kfs.KosmosFileSystem

Cloudstore(其前身是Kosmos文件系统)文件系统是类似于HDFSGoogleGFS文件系统,使用C++编写。

FTP

ftp

fs.ftp.FtpFileSystem

FTP服务器支持的文件系统。

S3(本地)

s3n

fs.s3native.NativeS3FileSystem

基于Amazon S3的文件系统。

S3(基于块)

s3

fs.s3.NativeS3FileSystem

基于Amazon S3的文件系统,以块格式存储解决了S35GB文件大小的限制。

  Hadoop提供了许多文件系统的接口,用户可以使用URI方案选取合适的文件系统来实现交互。

 (转载)

HDFS的基础概念:

数据块(block)

     HDFS(Hadoop Distributed File System)默认的最基本的存储单位是64M的数据块。

     和普通文件系统相同的是,HDFS中的文件是被分成64M一块的数据块存储的。

     不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。

 

关于 Namenode 和 Datanode 

    HDFS体系结构中有两类节点,一类是NameNode,又叫"元数据节点";另一类是DataNode,又叫"数据节点"。这两类节点分别承担MasterWorker具体任务的执行节点。

1)元数据节点用来管理文件系统的命名空间

    其将所有的文件和文件夹的元数据保存在一个文件系统树中。

    这些信息也会在硬盘上保存成以下文件:命名空间镜像(namespace image)及修改日志(edit log)

   其还保存了一个文件包括哪些数据块,分布在哪些数据节点上。然而这些信息并不存储在硬盘上,而是在系统启动的时候从数据节点收集而成的。

2)数据节点是文件系统中真正存储数据的地方。

    客户端(client)或者元数据信息(namenode)可以向数据节点请求写入或者读出数据块。

    其周期性的向元数据节点回报其存储的数据块信

  

                   从hdfs中读取数据



  

                  从hdfs中写文件

 

3)从元数据节点(secondary namenode

    从元数据节点并不是元数据节点出现问题时候的备用节点,它和元数据节点负责不同的事情。

    其主要功能就是周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。这点在下面会相信叙述。

合并过后的命名空间镜像文件也在从元数据节点保存了一份,以防元数据节点失败的时候,可以恢复。

 

 

 



 

                        Hdfs的架构

 

 

 

 

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

2 HDFS的理解 

2.1 HDFS的体系结构

  HDFS是一个主/从(Master/Slave)式的结构如上图所示(hdfs体系结构) 

       从最终用户的角度来看,它就像传统的文件系统一样,可以通过目录路径对文件执行CRUD(增删查改)操作。但由于分布式存储的性质,HDFS拥有一个NameNode和一些DataNodesNameNode管理文件系统的元数据,DataNode存储实际的数据。客户端通过同NameNodeDataNode是的交互访问文件系统—>客户端联系NameNode以获取文件的元数据,而真正的I/O操作是直接和DataNode进行交互的。

  例如:客户端要访问一个文件,首先,客户端从NameNode中获得组成该文件数据块位置列表,即知道数据块被存储在DataNode上;然后,客户端直接从DataNode上读取文件数据。此过程中,NameNode不参与文件的传输。



 

1NameNode

  NameNode的作用是管理文件目录结构,是管理数据节点的。NameNode维护两套数据:一套是文件目录与数据块之间的关系,另一套是数据块与节点间的关系。前一套是静态的,是存放在磁盘上的,通过fsimageedits文件来维护;后一套数据时动态的,不持久化到磁盘,每当集群启动的时候,会自动建立这些信息。

  (2DataNode

  毫无疑问,DataNodeHDFS中真正存储数据的。这里要提到一点,就是Block(数据块)。假设文件大小是100GB,从字节位置0开始,每64MB字节划分为一个Block,以此类推,可以划分出很多的Block。每个Block就是64MB(也可以自定义设置Block大小)。

  (3)典型部署

HDFS的一个典型部署是在一个专门的机器上运行NameNode,集群中的其他机器各运行一个DataNode。(Of course,也可以在运行NameNode的机器上同时运行DataNode,或者一个机器上运行多个DataNode。)一个集群中只有一个NameNode的设计大大简化了系统

   2.2 关于Hdfs 的安全性措施

HDFS具备了较为完善的冗余备份和故障恢复机制,可以实现在集群中可靠地存储海量文件。

  (1冗余备份HDFS将每个文件存储成一系列的数据块(Block),默认块大小为64MB(可以自定义配置)。为了容错,文件的所有数据块都可以有副本(默认为3个,可以自定义配置)。当DataNode启动的时候,它会遍历本地文件系统,产生一份HDFS数据块和本地文件对应关系的列表,并把这个报告发送给NameNode,这就是报告块(BlockReport),报告块上包含了DataNode上所有块的列表。

  (2)副本存放HDFS集群一般运行在多个机架上,不同机架上机器的通信需要通过交换机。通常情况下,副本的存放策略很关键,机架内节点之间的带宽比跨机架节点之间的带宽要大,它能影响HDFS的可靠性和性能。HDFS采用一种称为机架感知(Rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。在大多数情况下,HDFS副本系数是默认为3HDFS的存放策略是将一个副本存放在本地机架节点上,一个副本存放在同一个机架的另一个节点上,最后一个副本放在不同机架的节点上。这种策略减少了机架间的数据传输,提高了写操作的效率。机架的错误远远比节点的错误少,所以这种策略不会影响到数据的可靠性和可用性。



 

  图5.副本存放的策略

  (3)心跳检测:NameNode周期性地从集群中的每个DataNode接受心跳包和块报告,NameNode可以根据这个报告验证映射和其他文件系统元数据。收到心跳包,说明该DataNode工作正常。如果DataNode不能发送心跳信息,NameNode会标记最近没有心跳的DataNode为宕机,并且不会给他们发送任何I/O请求。

  (4)安全模式

  (5)数据完整性检测

  (6)空间回收

  (7)元数据磁盘失效

  (8)快照(HDFS目前还不支持)

 

猜你喜欢

转载自lby2013.iteye.com/blog/2082525