Hadoop Distributed System (HDFS) 写入和读取流程

这篇具有很好参考价值的文章主要介绍了Hadoop Distributed System (HDFS) 写入和读取流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、HDFS

HDFS全称是Hadoop Distributed System。HDFS是为以流的方式存取大文件而设计的。适用于几百MB,GB以及TB,并写一次读多次的场合。而对于低延时数据访问、大量小文件、同时写和任意的文件修改,则并不是十分适合。

目前HDFS支持的使用接口除了Java的还有,Thrift、C、FUSE、WebDAV、HTTP等。HDFS是以block-sized chunk组织其文件内容的,默认的block大小为64MB,对于不足64MB的文件,其会占用一个block,但实际上不用占用实际硬盘上的 64MB,这可以说是HDFS是在文件系统之上架设的一个中间层。之所以将默认的block大小设置为64MB这么大,是因为block-sized对于 文件定位很有帮助,同时大文件更使传输的时间远大于文件寻找的时间,这样可以最大化地减少文件定位的时间在整个文件获取总时间中的比例 。

二、HDFS的体系结构

构成HDFS主要是Namenode(master)和一系列的Datanode(workers)。Namenode是管理HDFS的目录树和相 关的文件元数据,这些信息是以"namespace image"和"edit log"两个文件形式存放在本地磁盘,但是这些文件是在HDFS每次重启的时候重新构造出来的。Datanode则是存取文件实际内容的节 点,Datanodes会定时地将block的列表汇报给Namenode。

由于Namenode是元数据存放的节点,如果Namenode挂了那么HDFS就没法正常运行,因此一般使用将元数据持久存储在本地或远程的机器 上,或者使用secondary namenode来定期同步Namenode的元数据信息,secondary namenode有点类似于MySQL的Master/Salves中的Slave,"edit log"就类似"bin log"。如果Namenode出现了故障,一般会将原Namenode中持久化的元数据拷贝到secondary namenode中,使secondary namenode作为新的Namenode运行起来。

Hadoop Distributed System (HDFS) 写入和读取流程

​三、读写流程

GFS论文提到的文件读取简单流程:

Hadoop Distributed System (HDFS) 写入和读取流程

​详细流程:

Hadoop Distributed System (HDFS) 写入和读取流程

​文件读取的过程如下:

  1. 使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;

  2. Namenode会视情况返回文件的部分或者全部block列表,对于每个block,Namenode都会返回有该block拷贝的DataNode地址;

  3. 客户端开发库Client会选取离客户端最接近的DataNode来读取block;如果客户端本身就是DataNode,那么将从本地直接获取数据.

  4. 读取完当前block的数据后,关闭与当前的DataNode连接,并为读取下一个block寻找最佳的DataNode;

  5. 当读完列表的block后,且文件读取还没有结束,客户端开发库会继续向Namenode获取下一批的block列表。

  6. 读取完一个block都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读。

GFS论文提到的写入文件简单流程:

Hadoop Distributed System (HDFS) 写入和读取流程

​详细流程:

Hadoop Distributed System (HDFS) 写入和读取流程

写入文件的过程比读取较为复杂:

  1. 使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;

  2. Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;

  3. 当 客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,并向Namenode申请新的blocks,获取用来存储replicas的合适的datanodes列表, 列表的大小根据在Namenode中对replication的设置而定。

  4. 开始以pipeline(管道)的形式将packet写入所 有的replicas中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此 pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。

  5. 最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返回的ack packet后会从"ack queue"移除相应的packet。

  6. 如 果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除, 剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持 replicas设定的数量。文章来源地址https://www.toymoban.com/news/detail-478076.html

到了这里,关于Hadoop Distributed System (HDFS) 写入和读取流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Hadoop】HDFS读写流程和客户端命令使用

    🦄 个人主页——🎐开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁 感谢点赞和关注 ,每天进步

    2024年02月11日
    浏览(42)
  • Java实现读取转码写入ES构建检索PDF等文档全栈流程

    之前已简单使用ES及Kibana和在线转Base64工具实现了检索文档的demo,并已实现WebHook的搭建和触发流程接口。 传送门: 基于GitBucket的Hook构建ES检索PDF等文档全栈方案 使用ES检索PDF、word等文档快速开始 总体思路:基于前面已经搭建的WebHook触发流程,接收到push更新消息之后,使用

    2024年03月10日
    浏览(56)
  • 一百八十二、大数据离线数仓完整流程——步骤一、用Kettle从Kafka、MySQL等数据源采集数据然后写入HDFS

    经过6个月的奋斗,项目的离线数仓部分终于可以上线了,因此整理一下离线数仓的整个流程,既是大家提供一个案例经验,也是对自己近半年的工作进行一个总结。 项目行业属于交通行业,因此数据具有很多交通行业的特征,比如转向比数据就是统计车辆左转、右转、直行

    2024年02月07日
    浏览(50)
  • 从零开始的Hadoop学习(六)| HDFS读写流程、NN和2NN工作机制、DataNode工作机制

    1.1 HDFS写数据流程 1.1.1 剖析文件写入 (1)客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。 (2)NameNode 返回是否可以上传。 (3)客户端请求第一个 Block 上传到哪几个 DataNode 服务上。 (4)NameNode 返回 3个 DataN

    2024年02月10日
    浏览(49)
  • Clickhouse分布式表引擎(Distributed)写入核心原理解析

    Clickhouse分布式表引擎(Distributed)写入核心原理解析 Clickhouse分布式表引擎(Distributed)查询核心原理解析 Distributed表引擎是分布式表的代名词,它自身不存储任何数据,而是作为数据分片的透明代理,能够自动路由数据至集群中的各个节点 ,所以Distributed表引擎需要和其他数

    2023年04月27日
    浏览(47)
  • [论文笔记] Gemini: A Computation-Centric Distributed Graph Processing System

    Gemini: 以计算为中心的分布式图处理系统 [Paper] [Slides] [Code] OSDI’16 提出了 Gemini, 一个分布式图处理系统, 应用了多种针对计算性能的优化以在 效率之上构建可扩展性 . Gemini 采用: 稀疏-稠密信号槽 抽象, 将混合推拉计算模型扩展到分布式场景 基于分块的划分 (chunk-based partiti

    2024年02月15日
    浏览(39)
  • Apache Hadoop: Building a Big Data Distributed Environm

    作者:禅与计算机程序设计艺术 Apache Hadoop (以下简称HDFS)是一个开源的分布式文件系统,用来存储大量的数据集并进行计算处理。它可以处理超大数据集、实时数据分析、日志聚类等应用场景。HDFS被广泛应用于企业数据仓库、电子商务网站、搜索引擎、Hadoop生态系统中的大多

    2024年02月06日
    浏览(47)
  • HDFS文件创建与写入

    实验环境 Linux Ubuntu 16.04 前提条件: 1)Java 运行环境部署完成 2)Hadoop 的单点部署完成   实验内容 在上述前提条件下,学习HDFS文件创建、写入、追加与合并等操作 实验步骤 启动HDFS,在命令行窗口输入下面的命令: 运行后显示如下,根据日志显示,分别启动了NameNode、Dat

    2024年02月02日
    浏览(40)
  • Spark解析JSON文件,写入hdfs

    一、用Sparkcontext读入文件,map逐行用Gson解析,输出转成一个caseclass类,填充各字段,输出。 解析JSON这里没有什么问题。 RDD覆盖写的时候碰到了一些问题 : 1.直接saveAsTextFile没有覆盖true参数; 2.转dataframe时,还得一个一个字段显化才能转成dataframe; 3.write时,一开始打算写

    2024年01月23日
    浏览(40)
  • 一百七十三、Flume——Flume写入HDFS后的诸多小文件问题

    在用Flume采集Kafka中的数据写入HDFS后,发现写入HDFS的不是每天一个文件,而是一个文件夹,里面有很多小文件,浪费namenode的宝贵资源 在Flume任务的配置文件设置 a1.sinks.k1.hdfs.rollSize = 0   a1.sinks.k1.hdfs.rollCount = 0   而不是 a1.sinks.k1.hdfs.round=true a1.sinks.k1.hdfs.roundValue=10 a1.sinks.k1

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包