`

Hadoop 学习总结之一:HDFS简介

阅读更多

一、HDFS的基本概念

1.1、数据块(block)

  • HDFS(Hadoop Distributed File System)默认的最基本的存储单位是64M的数据块。
  • 和普通文件系统相同的是,HDFS中的文件是被分成64M一块的数据块存储的。
  • 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。

1.2、元数据节点(Namenode)和数据节点(datanode)

  • 元数据节点用来管理文件系统的命名空间
    • 其将所有的文件和文件夹的元数据保存在一个文件系统树中。
    • 这些信息也会在硬盘上保存成以下文件:命名空间镜像(namespace image)及修改日志(edit log)
    • 其还保存了一个文件包括哪些数据块,分布在哪些数据节点上。然而这些信息并不存储在硬盘上,而是在系统启动的时候从数据节点收集而成的。
  • 数据节点是文件系统中真正存储数据的地方。
    • 客户端(client)或者元数据信息(namenode)可以向数据节点请求写入或者读出数据块。
    • 其周期性的向元数据节点回报其存储的数据块信息。
  • 从元数据节点(secondary namenode)
    • 从元数据节点并不是元数据节点出现问题时候的备用节点,它和元数据节点负责不同的事情。
    • 其主要功能就是周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。这点在下面会相信叙述。
    • 合并过后的命名空间镜像文件也在从元数据节点保存了一份,以防元数据节点失败的时候,可以恢复。

1.2.1、元数据节点文件夹结构

 

  • VERSION文件是java properties文件,保存了HDFS的版本号。
    • layoutVersion是一个负整数,保存了HDFS的持续化在硬盘上的数据结构的格式版本号。
    • namespaceID是文件系统的唯一标识符,是在文件系统初次格式化时生成的。
    • cTime此处为0
    • storageType表示此文件夹中保存的是元数据节点的数据结构。

namespaceID=1232737062

cTime=0

storageType=NAME_NODE

layoutVersion=-18

1.2.2、文件系统命名空间映像文件及修改日志

  • 当文件系统客户端(client)进行写操作时,首先把它记录在修改日志中(edit log)
  • 元数据节点在内存中保存了文件系统的元数据信息。在记录了修改日志后,元数据节点则修改内存中的数据结构。
  • 每次的写操作成功之前,修改日志都会同步(sync)到文件系统。
  • fsimage文件,也即命名空间映像文件,是内存中的元数据在硬盘上的checkpoint,它是一种序列化的格式,并不能够在硬盘上直接修改。
  • 同数据的机制相似,当元数据节点失败时,则最新checkpoint的元数据信息从fsimage加载到内存中,然后逐一重新执行修改日志中的操作。
  • 从元数据节点就是用来帮助元数据节点将内存中的元数据信息checkpoint到硬盘上的
  • checkpoint的过程如下:
    • 从元数据节点通知元数据节点生成新的日志文件,以后的日志都写到新的日志文件中。
    • 从元数据节点用http get从元数据节点获得fsimage文件及旧的日志文件。
    • 从元数据节点将fsimage文件加载到内存中,并执行日志文件中的操作,然后生成新的fsimage文件。
    • 从元数据节点奖新的fsimage文件用http post传回元数据节点
    • 元数据节点可以将旧的fsimage文件及旧的日志文件,换为新的fsimage文件和新的日志文件(第一步生成的),然后更新fstime文件,写入此次checkpoint的时间。
    • 这样元数据节点中的fsimage文件保存了最新的checkpoint的元数据信息,日志文件也重新开始,不会变的很大了。

 

1.2.3、从元数据节点的目录结构

 

1.2.4、数据节点的目录结构

 

  • 数据节点的VERSION文件格式如下:

namespaceID=1232737062

storageID=DS-1640411682-127.0.1.1-50010-1254997319480

cTime=0

storageType=DATA_NODE

layoutVersion=-18

  • blk_<id>保存的是HDFS的数据块,其中保存了具体的二进制数据。
  • blk_<id>.meta保存的是数据块的属性信息:版本信息,类型信息,和checksum
  • 当一个目录中的数据块到达一定数量的时候,则创建子文件夹来保存数据块及数据块属性信息。

二、数据流(data flow)

2.1、读文件的过程

  • 客户端(client)用FileSystem的open()函数打开文件
  • DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息。
  • 对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。
  • DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据。
  • 客户端调用stream的read()函数开始读取数据。
  • DFSInputStream连接保存此文件第一个数据块的最近的数据节点。
  • Data从数据节点读到客户端(client)
  • 当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
  • 当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。
  • 在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。
  • 失败的数据节点将被记录,以后不再连接。

 

2.2、写文件的过程

  • 客户端调用create()来创建文件
  • DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。
  • 元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。
  • DistributedFileSystem返回DFSOutputStream,客户端用于写数据。
  • 客户端开始写入数据,DFSOutputStream将数据分成块,写入data queue。
  • Data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。
  • Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
  • DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。
  • 如果数据节点在写入的过程中失败:
    • 关闭pipeline,将ack queue中的数据块放入data queue的开始。
    • 当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。
    • 失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。
    • 元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。
  • 当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。

  • 大小: 71.9 KB
  • 大小: 19.3 KB
  • 大小: 43.9 KB
  • 大小: 148.7 KB
  • 大小: 58 KB
  • 大小: 172.9 KB
5
0
分享到:
评论
7 楼 morry 2010-06-13  
期待你的hadoop系列
6 楼 swordice 2010-05-24  
有个疑问,在写文件的时候,假如文件块是64M,那么在调用客户端addBlock以后,会通知Datanode创建一个64M的block,并开始写数据。如果文件大小不足64M,那么多余分配的block的空间是怎么释放的?是在客户端在调用close的时候就释放了,还是Namenode通知Datanode释放的或者其他什么途径?
一直没弄明白
5 楼 swordice 2010-05-24  
forfuture1978 写道
swordice 写道
你们最近也在用么?

是啊,等Lucene系列写完,就进行haddop系列

太好了,正好交流一下
4 楼 illu 2010-05-19  
forfuture1978 写道
swordice 写道
你们最近也在用么?

是啊,等Lucene系列写完,就进行haddop系列

期待哦~~~
3 楼 forfuture1978 2010-05-18  
swordice 写道
你们最近也在用么?

是啊,等Lucene系列写完,就进行haddop系列
2 楼 swordice 2010-05-18  
你们最近也在用么?
1 楼 luckaway 2010-03-25  
要出hadoop的专题文章了,哈哈! 期待ing,最近正想使用hadoop,因为不太熟悉,不太敢用!

相关推荐

    Hadoop学习总结之一:HDFS简介

    HDFS(Hadoop Distributed File System)是 Hadoop 生态系统中的一个核心组件,负责存储和管理大规模数据。下面是 HDFS 的基本概念和架构: 数据块(Block) HDFS 中的基本存储单位是 64M 的数据块。与普通文件系统...

    Hadoop学习总结和源码分析

    首先,我们从“Hadoop学习总结之一:HDFS简介.doc”开始,HDFS是Hadoop的核心,它是一个高度容错性的分布式文件系统,设计目标是存储大量数据并支持大规模的并行计算。HDFS采用了主从结构,由一个NameNode作为主节点...

    hadoop,hive,hbase学习资料

    2. **Hadoop学习总结之一:HDFS简介.doc**、**Hadoop学习总结之四:Map-Reduce的过程解析.doc**、**Hadoop学习总结之五:Hadoop的运行痕迹.doc**、**Hadoop学习总结之二:HDFS读写过程解析.doc**:这些文档详细介绍...

    Hadoop学习总结之五:Hadoop的运行痕迹

    - `fs.default.name`: `hdfs://192.168.1.104:9000` - `mapred.job.tracker`: `192.168.1.104:9001` - `dfs.replication`: `3` - `hadoop.tmp.dir`: `/data/hadoopdir/tmp` #### 三、特殊配置实现远程调试 ...

    分布式存储系统:HDFS:HDFS生态系统:Hadoop工具与应用.docx

    分布式存储系统:HDFS:HDFS生态系统:Hadoop工具与应用.docx

    深入 Hadoop 的心脏:HDFS 架构解析与工作机制

    Hadoop 的分布式文件系统(HDFS)是大数据处理的基石,它为存储大规模数据集提供了一个可靠的基础架构。HDFS 以其高吞吐量、可扩展性和容错性而著称,是 Hadoop 生态系统中不可或缺的一部分。以下是关于 HDFS 架构...

    Hadoop原理与技术hdfs命令行基本操作

    一、实验目的 熟悉hdfs命令行基本操作 二、实验环境 Windows 10 VMware Workstation Pro虚拟机 Hadoop环境 Jdk1.8 三、实验内容 1:hdfs常见命令: (1)查看帮助:hdfs dfs -help (2)查看当前目录信息:hdfs ...

    hadoop-hdfs-client-2.9.1-API文档-中英对照版.zip

    赠送jar包:hadoop-hdfs-client-2.9.1.jar; 赠送原API文档:hadoop-hdfs-client-2.9.1-javadoc.jar; 赠送源代码:hadoop-hdfs-client-2.9.1-sources.jar; 赠送Maven依赖信息文件:hadoop-hdfs-client-2.9.1.pom;...

    Hadoop实战高手之路---从零开始”的第六讲Hadoop图文训练课程:使用HDFS命令行工具操作Hadoop分布式集群初体验

    - **HDFS(Hadoop Distributed File System)**:是Hadoop的核心组件之一,提供了一个高度可靠的数据存储系统,能够在廉价硬件上存储大量数据,并支持数据的高效访问。 - **MapReduce**:是一种编程模型,用于处理和...

    java操作Hadoop源码之HDFS Java API操作-上传文件

    conf.set("fs.defaultFS", "hdfs://namenode_address:port"); ``` 2. **获取FileSystem实例**: 使用配置好的`Configuration`对象,我们可以获取到`FileSystem`的实例,这是与HDFS交互的主要接口: ```java ...

    hadoop-hdfs-2.7.3-API文档-中英对照版.zip

    Maven坐标:org.apache.hadoop:hadoop-hdfs:2.7.3; 标签:apache、hdfs、hadoop、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化...

    hadoop-hdfs-2.6.5-API文档-中文版.zip

    Maven坐标:org.apache.hadoop:hadoop-hdfs:2.6.5; 标签:apache、hdfs、hadoop、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档...

    HDFS.zip_Hadoop 平台_hadoop_hdfs

    HDFS(Hadoop Distributed File System)则是Hadoop的核心组件之一,负责数据的分布式存储。本篇将深入探讨Hadoop平台上的HDFS,以及如何在该平台上进行文件操作。 一、Hadoop平台基础 Hadoop是基于Java开发的,它...

    Hadoop学习总结

    HDFS是Hadoop的核心组件之一,是一个高度容错性的分布式文件系统。它被设计成能在普通的硬件上运行,并能够处理大规模的数据集。HDFS遵循主从架构,由NameNode(主节点)和DataNode(从节点)组成。NameNode负责元...

    hdfs官方文档 Hadoop分布式文件系统:结构与设计.pdf

    Hadoop分布式文件系统(HDFS)是为处理大规模数据集而设计的一种高容错性的分布式存储系统。HDFS源于Apache Nutch项目,是Hadoop项目的一部分,旨在支持高吞吐量的数据访问,适用于大规模批量处理任务,而非常规的...

    外网无法访问HDFS org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block

    报错 org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block 2、百度结果 参考 https://blog.csdn.net/xiaozhaoshigedasb/article/details/88999595  防火墙记得关掉; 查看DataNode是否启动;...

    大数据与云计算培训学习资料 Hadoop集群 细细品味Hadoop_第8期_HDFS初探之旅 共29页.pdf

    【大数据与云计算培训学习资料 Hadoop集群 细细品味Hadoop_第8期_HDFS初探之旅 共29页.pdf】 这篇文档是关于Hadoop集群的深入学习资料,特别是针对Hadoop分布式文件系统(HDFS)的初步探索。HDFS是Hadoop项目的核心...

    数据科学导论实验报告 实验1:常用Linux操作和 Hadoop操作

    启动Hadoop后,可以在HDFS中创建用户目录,并通过Hadoop命令如`hadoop fs -mkdir`创建目录,`hadoop fs -put`上传文件,`hadoop fs -ls`查看目录内容,以及`hadoop fs -get`将HDFS上的文件或目录下载到本地。...

Global site tag (gtag.js) - Google Analytics