1 - HDFS 文件的写入

1.1 写入过程

1、Client 发起文件上传请求,通过 RPC 与 NameNode 建立连接,NameNode 检查 Client 是否有相应权限,以及目标文件是否已存在、父目录是否存在,向 Client 返回是否可以上传;

2、Client 从 NameNode 中获取第一个 block 的传输目的地,也就是应该传输到哪些 DataNode 上;

3、NameNode 根据配置文件中指定的备份数量及机架感知原理进行文件分配,返回可用的 DataNode 的地址,假设分别是 A、B、C;

机架感知:Hadoop 在设计时考虑到数据存储的安全与高效,数据文件在 HDFS 上默认存放三份副本。

副本的存储策略为:客户端所在 DataNode 一份,同机架内其它某一节点上一份,不同机架的某一节点上一份。

4、Client 先向 DataNode A 上传数据(也是一个 RPC 调用,建立 pipeline ),A 收到请求会继续调用 B,然后 B 调用 C,建立完成所有的 pipeline 之后,逐级返回 Client;

5、Client 开始向 DataNode A 上传第一个 block,以 packet 为单位(默认是64K),A 收到一个 packet 就会传给 B,B 传给 C,A 每传一个 packet 会放入一个 ack 队列等待应答;

6、数据被分割成一个个的 packet 数据包在 pipeline 上依次传输,在 pipeline 反方向上逐个发送 ack(操作是否成功的应答),最终由 pipeline 中第一个 DataNode 节点 A 将 pipelineack 发送给 Client;

7、当一个 block 传输完成后,Client 再次请求 NameNode 上传第二个 block ,继续上述 (4) - (7) 步骤。

1.2 写入异常时的处理

当数据写入失败时,HDFS 会作出以下反应:

首先管道会被关闭,任何在确认通知队列中的文件包都会被添加到数据队列的前端,以确保故障节点下游的 DataNode 不会漏掉任何一个数据包。

为存储在另一个正常的 DataNode 的当前数据块指定一个新的标识,并将标识传送给 NameNode,以便 故障 DataNode 在恢复后可以删除存储的部分数据块

删除故障 DataNode 的 pipeline 连接,基于两个正常的 DataNode 构建新的 pipeline,剩余的数据块写入新的 pipeline 中。

NameNode 在注意到副本个数不足时,会在其他 DataNode 上创建一个新的副本。后续的数据块就能正常的接受处理。

1.3 写入的一致性

  • 新建一个文件后,HDFS 的命名空间中立即可见;
  • 写入文件的内容不保证立即可见(即使数据流已经调用 flush() 方法刷新并存储);
  • 当前正在写入的块对其他 Reader 不可见;
  • 调用 hflush() 方法后,数据被写入 DataNode 的内存中,可保证对所有 Reader 可见;
  • 调用 hsync() 方法后,数据就会被写到磁盘上;
  • 如果没有调用 hflush()hsync(),客户端在故障的情况下可能丢失正在写入的数据块。

2 - HDFS 文件的读取

2.1 读取过程

1、Client 向 NameNode 发起 RPC 请求,来确定请求文件 block 所在的位置;

2、NameNode 会视情况返回文件的部分或者全部 block 列表:对每个 block,NameNode 都会返回含有该 block 副本的 DataNode 地址 —— 按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序规则是:

网络拓扑结构中距离 Client 近的靠前 —— 网络拓扑需要根据数据中心、机架、数据节点等因素手动设置;

心跳机制中超时汇报的 DataNnode 状态为 STALE 的排靠后。

3、Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是 DataNode,就会从本地直接获取数据(短路读取特性);

4、底层本质是建立 Socket Stream(FSDataInputStream),重复调用父类 DataInputStream 的 read 方法,直到这个 block 上的数据读取完毕;

5、当读完列表的 block 后,若文件读取还没有结束,客户端会继续向 NameNode 获取下一批的 block 列表;

DataInputStream#read() 方法是并行读取 block 信息,仍然是以 packet 为单位(默认是64K)在 pipeline 上依次传输;

6、读取完所有的 block 后,客户端会将它们合并成一个完整的文件。

【注意】NameNode 只是返回 Client 请求的 block 的 DataNode 地址,并不会返回 block 的具体数据。

2.2 读取异常时的处理

1)如果客户端和所连接的 DataNode 在读取数据时出现故障,那客户端就会去尝试连接存储这个 block 的下一个最近的 DataNode,同时它会 记录这个发生故障的 DataNode,以免后面再次连接该节点。

2)客户端每读完一个 block 都会进行 checksum 验证,如果从某个 DataNode 上读取到的 block 是损坏的,客户端会通知 NameNode 更新该 block 的相关信息,然后从下一个拥有该 block 副本的 DataNode 继续读取文件。

版权声明

作者:瘦风(https://healchow.com)

出处:博客园-瘦风的南墙(https://www.cnblogs.com/shoufeng)

感谢阅读,公众号 「瘦风的南墙」 ,手机端阅读更佳,还有其他福利和心得输出,欢迎扫码关注

HDFS 03 - 你能说说 HDFS 的写入和读取过程吗?的更多相关文章

  1. HDFS写入和读取流程

    HDFS写入和读取流程 一.HDFS HDFS全称是Hadoop Distributed System.HDFS是为以流的方式存取大文件而设计的.适用于几百MB,GB以及TB,并写一次读多次的场合.而 ...

  2. 从HDFS的写入和读取中,我发现了点东西

    摘要:从HDFS的写入和读取中,我们能学习到什么? 本文分享自华为云社区<从HDFS的写入和读取中,我们能学习到什么>,作者: breakDawn . 最近开发过程涉及了一些和文件读取有关 ...

  3. Hadoop HDFS (3) JAVA訪问HDFS

    如今我们来深入了解一下Hadoop的FileSystem类. 这个类是用来跟Hadoop的文件系统进行交互的.尽管我们这里主要是针对HDFS.可是我们还是应该让我们的代码仅仅使用抽象类FileSyst ...

  4. Hadoop HDFS (3) JAVA訪问HDFS之二 文件分布式读写策略

    先把上节未完毕的部分补全,再剖析一下HDFS读写文件的内部原理 列举文件 FileSystem(org.apache.hadoop.fs.FileSystem)的listStatus()方法能够列出一 ...

  5. HDFS概述(4)————HDFS权限

    概述 Hadoop分布式文件系统(HDFS)的权限模型与POSIX模型的文件和目录权限模型一致.每个文件和目录与所有者和组相关联.该文件或目录将权限划分为所有者的权限,作为该组成员的其他用户的权限.以 ...

  6. HDFS概述(1)————HDFS架构

    概述 Hadoop分布式文件系统(HDFS)是一种分布式文件系统,用于在普通商用硬件上运行.它与现有的分布式文件系统有许多相似之处.然而,与其他分布式文件系统的区别很大.HDFS具有高度的容错能力,旨 ...

  7. 初识HDFS(10分钟了解HDFS、NameNode和DataNode)

    概览 首先我们来认识一下HDFS, HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.它其实是将一个大文件分成若干块保存在不同服务器的多个节点中.通 ...

  8. HDFS API 操作实例(一) HDFS读写操作

    1. 读取HDFS文件 1.1 字符读取HDFS上的文件 Configuration conf = new Configuration(); Path path = new Path(pathstr) ...

  9. Flume启动时报错Caused by: java.lang.InterruptedException: Timed out before HDFS call was made. Your hdfs.callTimeout might be set too low or HDFS calls are taking too long.解决办法(图文详解)

    前期博客 Flume自定义拦截器(Interceptors)或自带拦截器时的一些经验技巧总结(图文详解) 问题详情 -- ::, (agent-shutdown-hook) [INFO - org.a ...

随机推荐

  1. jackson学习之九:springboot整合(配置文件)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章汇总 jackson学习之一:基本信息 jac ...

  2. C - Oulipo

    The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...

  3. P4755 Beautiful Pair (分治 + 主席树)

    题意:1e5的数组 计算有多少对 ai * aj <= max(ai ai+1...aj-1 aj) 题解:在处理这种涉及到区间极值的题时 好像是个套路分治 从级值中间分成两个区间 从区间短的那 ...

  4. 阅读笔记:Item-based Collaborative Filtering Recommendation Algorithms

    概要: 推荐系统通过信息获取技术解决在线的个人的消息.产品或者服务的推荐问题.这些系统,特别是基于k临近协同过滤算法,在网络上取得了广泛的成功.可用信息和访问人数的巨大增加成了推荐系统一个难题.基于商 ...

  5. hdu3559 Frost Chain (概率dp+记忆化搜索)

    Problem Description In the unimaginable popular DotA game, the hero Lich has a wonderful skill: Fros ...

  6. P1439 【模板】最长公共子序列(DP)

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  7. Codeforces Round #177 (Div. 2) B. Polo the Penguin and Matrix (贪心,数学)

    题意:给你一个\(n\)x\(m\)的矩阵,可以对矩阵的所有元素进行\(\pm d\),问能否使得所有元素相等. 题解:我们可以直接记录一个\(n*m\)的数组存入所有数,所以\((a_1+xd)=( ...

  8. Windows系统自带的DOS窗口

    写在前面: 整理自网络 记录学习过程,方便复习 说明 DOS全称为Disk Operating System,意思是"磁盘操作系统" DOS是个人计算机上的一类操作系统,windo ...

  9. Nginx location相关配置说明

    Nginx location相关配置说明       基于不同的IP.不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块ngx_http_core_module实现. 新建PC web站点 [ ...

  10. 在QT C++中调用 Python并将软件打包发布(裸机可运行)

    为了提高工作效率,需要一个可以自动生成多份相关联的word文档免去繁琐复制粘贴工作的软件.最后选定使用QT C++做界面和主要逻辑程序设计,对word的操作使用python写好对应的函数,然后在QT中 ...