Hadoop(四)HDFS 读写流程

2023-05-16

HDFS 的读写流程

  HDFS 将文件切割为默认大小的块(block)存放在不同的 DataNode上;
  上传文件和读取文件是 HDFS 重要的流程;

HDFS 的写文件流程

在这里插入图片描述
图文解释:
  1、Client 连接 HDFS ,发送上传文件的请求;
  2、NameNode 响应请求,对文件进行校验;校验成功后返回要存放文件的 block 所对应的 DataNode 的信息列表;
    列如:
      block01:dataNode1、dataNode2
      block02:dataNode2、dataNode4
  3、Client 拿到了 dataNode 的列表后,开始上传文件;
  4、先上传 block1,按照列表将其上传到 dataNode1、dataNode2;
  5、所有的 dataNodes 列表中的数据块都上传完之后,返回确认上传信息;
  6、收到全部上传完毕的确认信息,Client 关闭文件输出流;
  7、NameNode 接收到 Client 的信息判断文件是否上传成功,如果成功就更新元数据信息;

步骤详解:
  1、使用 HDFS 提供的 Client 向 NameNode 发送RPC请求,请求上传文件;
  2、NameNode 收到请求,判断要上传的文件是否已经存在及路径是否完整及用户是否具备权限操作;
  3、NameNode 判断后,向 Client 返回说可以上传该文件;
  4、Client 将文件在逻辑上切分成多个 packets ,并在内部以数据队列 data queue 的形式对 packets 进行管理;
  5、Client 向 NameNode 申请 blocks 获取到存放 packets 及对应的副本(replicas) 的合适的 dataNodes 列表,副本数及列表的大小根据 namenode 中的 replication 来定;
    packet1 : replica1 : dataNode1
    packet1 : replica2 : dataNode2
    packet1 : replica3 : dataNode3

    packet2 : replica1 : dataNode2
    packet2 : replica2 : dataNode3
    packet2 : replica3 : dataNode4

    packet3 : replica1 : dataNode1
    packet3 : replica2 : dataNode3
    packet3 : replica3 : dataNode4

  6、Client 以管道(pipeline)形式将第一个 packet 上传到该 packet 对应的所有 replicas 中;
  7、Client 把 packet1 的第一个副本 replica1 以流的形式写入 dataNode1;
  8、dataNode1 存储了 packet1 的 replica1 之后,再将其复制为 replica2 并以 pipeline 的形式在 dataNodes 列表中的下一个 dataNode2 中,进行 replica2 的写入,之后的依次类推;
  9、列表中的最后一个 dataNode 完成传输之后,会通过 pipeline 返回给 Client 一个确认队列 ack packet;
  10、客户端根据 ack packet 返回的信息,确认 packet1 的 3 个 replica 全部传输完毕,将 data queue 中的 packet1 移除;然后进行接下来的 packet2、packet3 的传输;
  11、在传输的过程中如果某个 dataNode 出现了故障,将关闭当前的 pipeline 且将故障的 datanode 从 pipeline 中移除,剩余的 block 继续在剩下的 dataNode 中以 pipeline 的形式继续传输,且 Client 会通知 nameNode 并分配一个新的 dataNode,保持 replicas 设定的数量。
  12、完成全部 packets 的传输之后,Client 调用 close() 关闭数据流;
  13、一个 packet 只要写入最小的副本数(dfs.replication.min 默认为1)即认为该 packet 已经写入成功,而该副本作为 block 可以在集群中进行异步复制,直到达到设定的副本数(dfs.replication 默认为3);因为 NameNode 在申请 blocks 时就知道了文件由哪些 blocks 组成,所以返回成功之前 NameNode 只需要等待 blocks 完成最小的复制量就好了;

在这里插入图片描述

HDFS 的读文件流程

图文解释:
  1、使用 HDFS 提供的 Client 向 NameNode 发送RPC请求,请求读取文件;
  2、NameNode 响应请求,返回该文件全部的 blocks 的信息,dataNodes 列表
    列如:
      block01:dataNode1、dataNode2、dataNode3
      block02:dataNode2、dataNode3、dataNode4
  3、Client 会选择离 Client 最近的 dataNode 进行 block 的读取;如果 Client 本身就是 dataNode 节点,Client 就直接在本地读取;
  4、读取完当前的 block1 之后,Client 关闭当前 dataNode 的链接,然后寻找读取下一个 block2 的 dataNode;
  5、当读取完当前的 blocks 列表之后,发现整个文件还没有读取完,Client 会继续向 NameNode 请求下一批 blocks 的信息,再进行读取,直到读完整个文件;
  6、读取过程中,每读完一个 block 都会进行 checksum 验证;如果读取 dataNode 时出现错误,Client 将通知 NameNode 再从下一个拥有该 block 的 dataNode 继续读;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hadoop(四)HDFS 读写流程 的相关文章

  • hive - 在值范围之间将一行拆分为多行

    我在下面有一张表 想按从开始列到结束列的范围拆分行 即 id 和 value 应该对开始和结束之间的每个值重复 包括两者 id value start end 1 5 1 4 2 8 5 9 所需输出 id value current
  • 使用 PyArrow 从 HDFS 读取镶木地板文件

    我知道我可以使用 pyarrow 连接到 HDFS 集群pyarrow hdfs connect 我也知道我可以使用读取镶木地板文件pyarrow parquet s read table 然而 read table 接受文件路径 而hdf
  • 处理 oozie 工作流程中的循环

    我有一个 oozie 用例 用于检查输入数据可用性并根据数据可用性触发 MapReduce 作业 所以我编写了一个 shell 脚本来检查输入数据 并在 oozie 中为其创建了一个 ssh 操作 输入数据检查的重试次数和重试间隔应该是可配
  • Flume将数据从MySQL迁移到Hadoop

    请分享您的想法 需求是将MySQL db中的数据迁移到Hadoop HBase进行分析 数据应该实时或接近实时地迁移 Flume可以支持这个吗 有什么更好的方法 据我了解 Flume 并不是为此而设计的 Flume 基本上用于读取日志 如数
  • java.lang.ClassNotFoundException:找不到类 org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem

    我是 Spark 和 Kubernetes 世界的新手 我使用 docker image tool sh 实用程序使用与 Hadoop 3 2 捆绑在一起的官方 Spark 3 0 1 构建了 Spark docker 映像 我还为 Jup
  • 如何按行扩展数组值!!使用 Hive SQL

    我有一个有 4 列的表 其中一列 项目 类型是 ARRAY 其他是字符串 ID items name loc id1 item1 item2 item3 item4 item5 Mike CT id2 item3 item7 item4 i
  • 运行 Sqoop 导入和导出时如何找到最佳映射器数量?

    我正在使用 Sqoop 版本 1 4 2 和 Oracle 数据库 运行 Sqoop 命令时 例如这样 sqoop import fs
  • HBase、Hadoop:如何估计 HBase 表或 Hadoop 文件系统路径的大小?

    我有多个 HBase 表 如何估计在 java 中使用的表的大致大小 一种方法是你必须使用java客户端访问hdfs 通常在 hbase文件夹 所有表格信息 将在场 Hadoop 外壳 你可以检查使用hadoop fs du h path
  • 在蜂巢中出现错误

    当我连接到 ireport 时 如果说在 hive shell 中显示表 则会出现此错误 元数据错误 java lang RuntimeException 无法实例化 org apache hadoop hive metastore Hiv
  • 与文件名中的冒号“:”作斗争

    我有以下代码 用于加载大量 csv gz 并将它们转储到其他文件夹中 并将源文件名作为一列 object DailyMerger extends App def allFiles path File List File val parts
  • 为什么我们需要将外部表移动到托管 Hive 表?

    我是 Hadoop 新手 正在学习 Hive 在 Hadoop 权威指南第 3 版中 第 12 页 第428章 最后一段 我不明白下面关于 HIVE 中外部表的段落 一种常见的模式是使用外部表访问存储在 HDFS 中的初始数据集 由另一个进
  • 全部配对图表上的所有路径

    这可能是一个没有最佳解决方案的问题 假设我有一个有向图 不知道它是否有循环 循环检测将是这个问题的方面之一 给定一组顶点 可能是数百万个顶点 我需要计算给定图的所有唯一对之间的所有不同路径 没有重复顶点的路径 我该如何应对这种情况 让我们看
  • 以不同用户身份运行 MapReduce 作业

    我有一个与 Hadoop 交互的 Web 应用程序 Cloudera cdh3u6 特定的用户操作应在集群中启动新的 MapReduce 作业 该集群不是一个安全集群 但它使用简单的组身份验证 因此 如果我以自己的身份通过 ssh 连接到它
  • 如何在Hadoop中序列化List集合对象?

    有没有办法在 Hadoop 中序列化 java 集合 The Writable接口仅适用于 Java 原语 我有以下类属性 private String keywords private List
  • sqoop 通过 oozie 导出失败

    我正在尝试将数据导出到mysql from hdfs通过sqoop 我可以通过 shell 运行 sqoop 并且它工作正常 但是当我通过调用oozie 它出现以下错误并失败 我还包括了罐子 没有描述性日志 sqoop脚本 export c
  • 以编程方式读取 Hadoop Mapreduce 程序的输出

    这可能是一个基本问题 但我在谷歌上找不到答案 我有一个映射缩减作业 它在其输出目录中创建多个输出文件 我的 Java 应用程序在远程 hadoop 集群上执行此作业 作业完成后 需要使用以下命令以编程方式读取输出org apache had
  • Spark/Yarn:HDFS 上不存在文件

    我在 AWS 上设置了 Hadoop Yarn 集群 有 1 个主服务器和 3 个从服务器 我已经验证我有 3 个活动节点在端口 50070 和 8088 上运行 我在客户端部署模式下测试了 Spark 作业 一切正常 当我尝试使用 Spa
  • MapReduce 中的分区到底是如何工作的?

    我认为我总体上对 MapReduce 编程模型有一定的了解 但即使在阅读了原始论文和其他一些来源之后 我仍然不清楚许多细节 特别是关于中间结果的分区 我将快速总结到目前为止我对 MapReduce 的理解 我们有一个可能非常大的输入数据集
  • AWS EMR 引导操作为 sudo

    我需要更新 etc hosts适用于我的 EMR 集群 EMR AMI 4 3 中的所有实例 整个脚本无非就是 bin bash echo e ip1 uri1 gt gt etc hosts echo e ip2 uri2 gt gt e
  • Hadoop 超立方体

    嘿 我正在启动一个基于 hadoop 的超立方体 具有灵活的维度数 有人知道这方面现有的方法吗 我刚刚发现PigOLAP草图 http wiki apache org pig PigOLAPSketch 但没有代码可以使用它 另一种方法是Z

随机推荐