热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Hadoop07】HDFS读/写数据流程(面试重点)

文章目录1.HDFS写数据1.1HDFS写数据流程1.2关于副本结点的选择流程2.HDFS读数据1.HDFS写数据1.1HDFS写数据流程HDFS读写流程:HDF


文章目录

  • 1. HDFS写数据
    • 1.1 HDFS写数据流程
    • 1.2 关于副本结点的选择流程
  • 2. HDFS读数据


1. HDFS写数据


1.1 HDFS写数据流程

在这里插入图片描述
HDFS读写流程:


  1. HDFS客户端创建 DistributedFileSystem(分布式文件系统)类的对象实例。【该对象中封装了与HDFS文件系统操作的相关方法】
  2. 调用DistributedFileSystem对象create()方法,通过 RPC 请求 NameNode 创建文件。
    NameNode执行各种检查判断: 目标文件是否存在、父目录是否存在、客户端是否具有创建文件的权限。
    检查通过后返回 FSDataOutputStream 输出流对象给客户端用于写数据
  3. 客户端通过 FSDataOutputStream 输出流开始写入数据
    ① NameNode根据网络拓扑挑选出一组DataNode用于存放数据,默认是3副本存储。
    ② DataStreamer将数据包流式传输到管道(pipeline)的第一个 DataNode,该DataNode存储数据包并将它发送到 pipeline 的第二个DataNode。同样的,第二个DataNode存储数据包并发送给第三个(也是最后一个)DataNode】
  4. 传输的反方向上,会通过ACK校验数据包传输是否成功
  5. 客户端完成数据写入后,在 FSDataOutputStream 输出流上调用 close() 方法关闭
  6. 客户端DsitributedFileSystem 告知NameNode文件写入完成,等待NameNode确认。
    【因为NameNode已经知道文件由哪些块组成,因此仅需等待最小复制块即可成功返回。最小复制是由参数 dfs.namenode.replication.min 指定,默认是1。即只要有1个副本上传成功,NameNode就认为已经上传成功,如果其他DataNode有缺失的块,可以通过这个DataNode继续复制】

抓住几个点:

  1. NameNode收到请求后并不是立即响应,而是要检查:目标文件是否存在、父目录是否存在、客户端是否具有创建文件的权限。
  2. 进行分布式数据传输时,并不是并行的传输,而是串行并发的传输。
    因为这样可以将客户端压力转到服务器端来,给用户更好的体验。
    在这里插入图片描述
  3. ① 客户端要向DataNode写数据时,是以一种管道(pipeline)的方式。将文件块拆分成多个64KB的数据包(packet),多个数据包流水式并发的对同一个DataNode进行写入。
    ② 传输单元为64KB,每个单元由若干个分组组成,每个分组为512B的数据 + 4B的校验位 = 516B


1.2 关于副本结点的选择流程

问:在前面说到写数据时,NameNode根据网络拓扑挑选出一组DataNode用于存放数据。那么NameNode是怎么挑选DataNode的?

在这里插入图片描述
答:假设副本数为3,则:


  1. 第一个副本在Client所在结点上;若客户机在集群外,则在集群中随机选一个(因为此时所有DataNode结点与Client距离相等)【保证效率】

    节点距离的计算:两个节点到达最近的共同祖先的距离总和。

  2. 第二个副本在另一个机架上随机选一个结点。【保证可靠】

  3. 第三个副本在第二个副本所在机随机选一个。【保证效率】


2. HDFS读数据

在这里插入图片描述

HDFS读数据的整体流程:


  1. HDFS客户端创建 DistributedFileSystem(分布式文件系统)类的对象实例。

  2. 调用DistributedFileSystem对象read()方法,通过 RPC 请求 NameNode 读取文件。
    NameNode执行各种检查判断: 目标文件是否存在、父目录是否存在、客户端是否具有读取文件的权限。
    检查通过后返回 FSDataInputStream 输出流对象给客户端用于读数据

  3. 客户端通过 FSDataInputStream 输出流开始写入数据
    ① 首先选择哪个DataNode结点?两个因素 {距离最近, DataNode所在服务器负载均衡低},然后从中读取第一个文件快blk_1
    ② 请求第二个文件块blk_2时,是在已经读取完成了blk_1之后才会发出该请求,是串行读,不是多线程并行。最后将读到的blk_2数据追加到blk_1末尾,就可以拼接成一个完整的文件。

    所以,我们在 hadoop 服务器上的data文件夹中找到hadoop存放数据的文件夹$HADOOP_HOME/data/dfs/data/current/BP-xxxxxxx/current/finalized/subdir0/subdir0,在里面将某个文件的几个blk_xxx按顺序拼接,也能恢复出原文件。

    # 将blk_1的数据写入abc.txt
    cat blk_1 >> abc.txt
    # 将blk_2的数据追加到abc.txt
    cat blk_2 >> abc.txt
    # 此时就可以恢复出文件abc.txt

  4. 客户端读完数据后,在 FSDataInputStream 输出流上调用 close() 方法关闭

  5. 客户端DsitributedFileSystem 告知NameNode文件读出完成。


推荐阅读
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
author-avatar
毕竟汤侦探
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有