HDFS存入文件的整个流程

本文结合HDFS的副本和分块从宏观上描述HDFS存入文件的整个流程。HDFS体系中包含Client、NameNode、DataNode、SeconderyNameode四个角色,其中Client是客户端,NN负责管理,DN负责存储、SN协助管理。

先来看一个官网上的图

# 图 0 -HDFS的体系结构

HDFS的副本存储有如下规则:

1.client将第一副本放到最靠近的一台DN

2.第二副本优先放到另一个机架

3.以此类推,尽量保证副本放在不同的机架

由于副本和分块机制的存在,当从本地文件系统向HDFS上传文件时,其内部的流程相对比较复杂,可以通过下图及步骤说明进行理解。

# 图 1-1 -hdfs副本存储机制(3副本)

A.对于可存于单块的小文件:

1.client向NN(NameNode)发起存储请求,

2.NN查找自身是否已有相应的文件,

3.若无则,NN向client返回DN1(DataNode)路径,

4.client向DN1传送副本,

5.DN1通过管道异步向DN2传副本,

6.DN2通过管道异步向DN3传副本,

7.DN3通知DN2接收完成,

8.DN2通知DN1接收完成,

9.DN1通知NN接收完成。

B.对于需要分块的大文件:

大致流程同上,但在步骤3NN还会进行块的划分,随后步骤4client会将各块分别发送到分配的DN执行步骤4~9

从前述可见,在向HDFS传输文件的过程中,NameNode节点至关重要。NN负责掌管元数据。其作用相当于物理硬盘中的文件分配表FAT,NN中的数据如果发生丢失,DN中存储的数据也就没有了意义。

# 图 1-2 -NN元数据存储机制

1.client向NN请求写,

2.NN将分配block写入editslog文件,

3.NN响应client,

4.client向DN写文件,

5.client通知NN写完成,

6.NN将editslog更新到内存。

ps:常用及最新元数据放在内存,最新元数据放editslog,老元数据放fsimage,editslog写满之前将edits log(新元数据)转换并合并到fsimage。

# 图 1-3 -edits log合并机制

当editslog写满:

1.NN通知SecondryNameNode执行checkpoint操作,

2.NN停止向已满editslog写入,

3.NN创建新edits log维持写入,

4.SN下载NN的fsimage和已满editslog,

5.SN执行合并生成fsimage。checkpoint,

6.SN向NN上传fsi。cp,

7.NN将fsi。cp改名fsimage,

8.NN删除已满editslog。

# 图3 -元数据格式:文件全路径,副本数,块编号,块-所在DN的映射。

原文地址:https://www.cnblogs.com/eflypro/p/11818991.html

时间: 2024-11-05 16:08:56

HDFS存入文件的整个流程的相关文章

【Hadoop】HDFS - 创建文件流程详解

1.本文目的 通过解析客户端创建文件流程,认知hadoop的HDFS系统的一些功能和概念. 2.主要概念 2.1 NameNode(NN): HDFS系统核心组件,负责分布式文件系统的名字空间管理.INode表的文件映射管理.如果不开启备份/故障恢复/Federation模式,一般的HDFS系统就只有1个NameNode,当然这样是存在单点故障隐患的. NN管理两个核心的表:文件到块序列的映射.块到机器序列的映射. 第一个表存储在磁盘中,第二表在NN每次启动后重建. 2.2 NameNodeSe

hadoop学习笔记(六):HDFS文件的读写流程

一.HDFS读取文件流程: 详解读取流程: Client调用FileSystem.open()方法: 1 FileSystem通过RPC与NN通信,NN返回该文件的部分或全部block列表(含有block拷贝的DN地址). 2 选取举栗客户端最近的DN建立连接,读取block,返回FSDataInputStream. Client调用输入流的read()方法: 1 当读到block结尾时,FSDataInputStream关闭与当前DN的连接,并未读取下一个block寻找最近DN. 2 读取完一

HDFS写文件过程分析

转自http://shiyanjun.cn/archives/942.html HDFS是一个分布式文件系统,在HDFS上写文件的过程与我们平时使用的单机文件系统非常不同,从宏观上来看,在HDFS文件系统上创建并写一个文件,流程如下图(来自<Hadoop:The Definitive Guide>一书)所示:具体过程描述如下: Client调用DistributedFileSystem对象的create方法,创建一个文件输出流(FSDataOutputStream)对象 通过Distribut

Spark中加载本地(或者hdfs)文件以及SparkContext实例的textFile使用

默认是从hdfs读取文件,也可以指定sc.textFile("路径").在路径前面加上hdfs://表示从hdfs文件系统上读 本地文件读取 sc.textFile("路径").在路径前面加上file:// 表示从本地文件系统读,如file:///home/user/spark/README.md ‍ 网上很多例子,包括官网的例子,都是用textFile来加载一个文件创建RDD,类似sc.textFile("hdfs://n1:8020/user/hdfs

HDFS读文件过程分析:读取文件的Block数据

转自http://shiyanjun.cn/archives/962.html 我们可以从java.io.InputStream类中看到,抽象出一个read方法,用来读取已经打开的InputStream实例中的字节,每次调用read方法,会读取一个字节数据,该方法抽象定义,如下所示:public abstract int read() throws IOException;Hadoop的DFSClient.DFSInputStream类实现了该抽象逻辑,如果我们清楚了如何从HDFS中读取一个文件

Linux下按照时间和大小生成新文件的程序流程及其C代码实现

一.概述 在实际的软件开发项目中,会出现按照时间和大小生成新文件的需求.例如,某软件需求的描述如下: 按照如下两个条件之一生成新的文件: 第一,新的一天到来. 第二,文件的大小超过阈值. 本文详细介绍了根据时间和大小生成新文件的程序流程,并给出了C程序实现. 二.算法设计 对于这个按照不同的条件生成新文件的需求,在编写代码之前,我们要认真考虑以下问题: 1.如何知道当前写文件的时间与上次时间相比,是新的一天? 对于这个问题,最简单的做法是将上次写完文件之后的时间保存在内存中,等下次写文件之前读取

【第二天】用kettle向hdfs复制文件

http://blog.csdn.net/greatelite/article/details/18676281 遇到的问题: 在连接到hdfs服务器上,一直提示unable to connect to HDFS Server 解决过程中: ①网上找了各种说是jar包驱动不兼容,端口号不对,最后都没解决 ②最后发现,是服务器上hadoop与kettle所用hadoop插件不一致, 服务器上用的是Hadoop 2.0.0-cdh4.5.0,这是一个经过第三方包装过的hadoop,而我在$PDI_H

Hadoop HDFS分布式文件系统设计要点与架构

Hadoop简介:一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上.而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序.HDF

向Hive中导入HDFS上文件时要注意的问题

前几天往HDFS写文件写的时候把文件名起成了.aaa.txt,这样本来是可以的,上传到HDFS也是没有任务问题的,但是将这个文件与Hive进行关联的时候却出现问题了,并不是导入的时候报错了,是导入的时候什么也没有报,默认已为成功了,但是Hive中怎么都查不到数据,反复了好多次,最后把文件名改成了aaa.txt,问题解决了,难道Hive不认以.开头的文件?其实并不是不认,因为在Linux中以.打头的文件或文件夹都是隐藏的,用ls是查不到的,只有用ll才能看到,这就是关联后,为什么在Hive中查不到