精华内容
下载资源
问答
  • HDFS读写数据流程

    2021-10-22 11:02:19
    HDFS读写数据流程 一、写数据流程 1、client 向NameNode请求上传文件 2、NameNode检查client是否拥有上穿文件的权限,同时检查目录是否正确,文件是否已经存在。 3、NameNode向client相应可以上传文件。 4、clint...

    HDFS读写数据流程

    一、写数据流程
    1、client 向NameNode请求上传文件
    2、NameNode检查client是否拥有上穿文件的权限,同时检查目录是否正确,文件是否已经存在。
    3、NameNode向client相应可以上传文件。
    4、clint请求上传第一个Block(0-128M),请求返回DataNode
    5、NameNode返回三个DataNode节点给clint(有些返回本地节点)
    6、client通过就近原则,以及考虑负载均衡,选择其中一个DataNode节点,请求建立Block传输通道。
    7、被选中的DataNode节点向client返回一个建立成功的应答
    8、被选中的节点向另外两个DataNode节点中的其中一个(这里就叫它2号节点)建立连接,然后2号节点给前一个节点返回一个应答
    9、2号节点再向第三个节点请求建立连接,第三个节点同样给2号节点返回应答
    10、数据开始传输 Packet(64k)
    在这里插入图片描述

    二、读数据流程

    1、client向NameNode请求下载某文件
    2、NameNode检查client是否有权限访问,检查是否存在该文件
    3、NameNode返回目标文件的元数据给client
    4、根据元数据找到对应的DataNode,同时,根据就近原则和考虑负载均衡,选择合适的节点下载数据(串行下载,下载完一个Block之后才能下载下一个Block)在这里插入图片描述

    展开全文
  • HDFS读写数据过程

    千次阅读 2021-06-22 00:29:48
    1.读流程 (图1): 1.打开文件:客户端通过通用文件系统抽象类...同时,名称节点返回拥有该数据块的所有数据节点的地址,同时根据距离客户端远近对数据节点进行排序。然后,DistributedFileSystem将实例化FSDataI.

    1.读流程 (1)


    1.打开文件 :客户端通过通用文件系统抽象类 FileSystem.open() 打开文件。然后 DistributedFileSystem 会创建输入流 FSDataInputStream
    2.获取数据块信息 :输入流通过 Client.getBlockLocations() 远程调用名称节点,并获取文件开始部分数据块的保存位置。同时,名称节点返回拥有该数据块的所有数据节点的地址,同时根据距离客户端远近对数据节点进行排序。然后, DistributedFileSystem 将实例化 FSDataInputStream 返回给客户端,同时返回最终数据块的数据节点地址。
    3.读取请求 :获得输入流 FSDataInputStream 后,客户端调用 read() 函数读取数据。输入流根据第 2 步数据节点排序结果, 选择距离客户端最近的节点建立连接并读取数据 。如果连接失败,则尝试与下一个节点连接。
    4.读取数据 :当数据块读取完毕后, FSDataInputStream 关闭第 3 步中连接的节点。
    5.寻找下一数据块信息 :输入流通过 getBlockLocations() 查找下一个数据块,若之前客户端已经缓存了该数据块的位置信息,则不需要调用。
    6.继续读取 :同步骤 4.
    7.关闭请求 : 当客户端全部读取完毕后,调用 FSDataInputStream Close() 函数关闭输入流。
    1 HDFS 1.0 读过程

    2.写流程 (2)


    1.创建文件请求 :客户端通过 FileSystem.create() 创建文件。然后 DistributedFileSystem 会创建输出流 FSDataOputStream
    2.创建文件元数据 :与读过程不同的是, DistributedFileSystem 采用 RPC 远程调用名称节点,在文件系统的命名空间中新建一个新的文件。名称节点会执行一些检查(如文件是否已经存在、客户端是否有权限等)。然后,名称节点构造新文件,并添加文件的元数据信息。接下来, DistributedFileSystem 将实例化 DFSOutputStream 返回给客户端,运行客户端通过该输出流写入数据。
    3.写入数据 :获得输出流 DFSOutputStream 后。客户端通过 write() 方法向 HDFS 中对应文件写入数据。
    4.写入数据包 :输出流 DFSOutputStream 中写入的数据会被分割成一个个分包,这些分包被放入 DFSOutputStream 对象的内部队列中。然后输出流会 向名称节点申请保存文件和副本数据块的指定个数的数据节点,这些节点直接排成数据流管道 。之前输出流的分包打包成数据包,首先发送给第一个数据节点,第一个数据节点再发送给第二个节点, 类似于流水线一样复制给若干个数据节点
    5.接收确认包 :为了保证不同机器上数据节点之间 复制 成功,接收到数据的数据节点需要向前发送 确认包 “(TCP ACK 确认包机制 ) 。最终最底部的数据节点逆流发送给头部的客户端,当客户端收到应答时,将对应的分包从内部队列移除。反复执行 (3)~(5) 步,直到数据全部写完。
    6.关闭请求 :当客户端写完时,会主动关闭输出流。
    7.写操作完成 : 通过 ClientProtocol.complete() 通知名称节点关闭文件,完成一次正常的写文件操作。
    2 HDFS 1.0 读过程

    【面试:写问题】

    (1)副本机制在哪里选?
        准备写时会请求NameNode,然后排序成PipeLine。准备读时则请求最近的节点。
    (2)上传Block时,dataNode挂了怎么办?
         当 DataNode 突然挂掉了, 客户端一段时间(超时) 接收不到这个 DataNode 发送的 ack 确认 ,客户端会通知 NameNode 。然后NameNode 检查该块的副本与规定的不符, NameNode 会通知 DataNode 去复制副本,并将挂掉的 DataNode 作下线处理,不 再让它参与文件上传与下载。因此,DataNode目前的办法是手动排错重启。
    (3)用户B在 block a中追加内容b,此时用户A能读取吗?(腾讯云面试问题)
    • 用户B追加过程: hdfs在写数据的时候,并不是在原来的目录里面直接开写的,而是会将需要写的块(block)复制到一个写入状态的目录里面去实现数据追加,当写入终止后,再移动到原来的目录中,覆盖旧的数据块。
    • 用户A读取过程: 在读取数据块过程中,datanode会检测数据块变化的,数据块是拆分为多个packet发送。发送之前都会判断一次数据块的内容是否发生变化,若读取过程中出现了块数据变化(读写竞争),也就是数据块被更新了,就会重新读取文件通道,并在packet缓冲区重新计算校验和,然后再发送。
    • 用户A读取数据时变化: 若变化会形成两种不同的网络传输模式->①若数据块变化了,packet在网络传输走Java传统IO传输,②未发生变化,packet走Java NIO零拷贝,这样可以极大提升网络传输性能。
        结论:因此, 读写互相不冲突,hdfs数据块主要是追加,因此数据读取的过程中即便发生变化,并不会影响到已经读取的数据。

    3.HDFS 1.0常见读写出错情况


    1. 名称节点出错
    有时名称节点内容保存的元数据信息不一定正确,因此 HDFS1.0 采用两种机制来确保名称节点安全, 见图 3
    • 将名称节点上元信息同步存储到其他文件系统(比如远程挂载的网络文件系统 NFS )中。
    • 利用第二名称节点中的元数据信息进行系统恢复。
    总体来说,第二名称节点只是起到了名称节点的 checkpoint (检查点)作用,并不真正做到 热备份 作用,因此还是有可能丢失部分信息。
    一般可以将两种方式结合使用:当名称节点发生故障时,首先到远程挂载的网络文件中获取备份的元数据信息,放在第二名称节点上进行恢复, 并把第二名称代替失效的名称节点使用 。不过在其他 HDFS 版本架构还有多名称节点结构,这里就不再详细介绍。
    3 名称节点恢复机制
    2. 数据节点出错
            当数据节点故障或者断网时,名称节点就无法收到一些来自数据节点的 心跳 信息,这时数据节点被标记为 宕机 ,节点上数据被标记为 不可读 见图 4 。此时,名称节点不再给它们发送任何 I/O 请求。甚至可能会导致一些数据块的副本数量小于 HDFS 预设的冗余因子。
        解决方案 :名称节点会定期检查数据节点,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本。此时,新的副本相当于是一个被调整位置后的数据块。
    4 数据节点出错情况
    3. 数据出错
            由于网络传输和磁盘异常等因素都会造成数据错误。 HDFS 客户端在设计时会采用 MD5 sha1 对数据块进行校验,以确保读取正确的数据, 见图 5 。因为文件在写入时会被分为若干个独立的块,所以客户端会对每个文件块进行信息摘录,并把信息写入同一个路径的隐藏文件里面。当客户端读取文件时,会先读取该信息文件,然后利用该信息文件对每个读取的数据块进行校验。如果校验出错,客户端会立即请求其他有副本信息的数据节点读取该数据块,并且通知名称节点,最后名称节点会重新检查并复制该数据块。
    5 数据出错恢复机制

     
    展开全文
  • 浅谈HDFS读写数据过程内部原理

    千次阅读 2018-05-28 10:00:39
    深入理解HDFS读写数据过程内部原理

                           浅谈HDFS读写数据过程内部原理

     文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍。

    本文将详细解释HDFS读写数据过程中系统底层究竟发生了什么以及其具体实现,希望可以帮助理解。

    首先读数据过程:

    HDFS客户端发出读数据命令之后

    configuration conf =new Configration();//配置文件,加载core-site.xml  hdfs-site.xml 得到读写的地址

    FileSystem fs=FileSystem.get(conf);//这一过程在底层实际上完成了FileSystem抽象类生成子类Distributed Filesystem 并实例                                                         化对象fs 的过程,真正对分布式文件进行操作的也是DistributedFileSystem的对象fs

    path filename=new Path("url");

    FSDataInputStream is=fs.open(filename);//此时会在内部创建一个输入流FSDateInputStream,输入流FSDateInputStream对                                                                 应着底层的DFSDateInputStream,由这个DFSInputStream 来对底层操作调用                                                                  ClientProtocal.getBlockLocation()方法得到NameNode的地址,进而得到                                                                           DataNode的地址,完成读的过程

    而当读取的文件占用超过一个数据块时,会重复进行该过程读取剩下的文件所在的数据块。

    以上便是读取数据的过程,我们可以发现操作数据的并不是我们程序员直接接触的FileSystem FSDataInputStream 等类,而是他们在底层对应的DistributedFileSystem以及DFSDataInputStream.

    附上流程图:



    写入的过程与读的过程类似,不在附加说明,唯一不同的是写入数据时HDFS采取流水线方法,当FSDataOutputStream 将数据写入第一个节点之后,会由第一个节点向第二个节点写入数据,一次向后达到备份的目的。

    附上流程图:



    加油吧,程序员!!!

    展开全文
  • Hdfs读写数据流程

    千次阅读 2017-04-29 19:20:46
    一:Hdfs数据流程 1、跟namenode通信查询元数据,找到文件块所在的datanode服务器 2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流 3、datanode开始发送数据(从磁盘里面读取数据放入流,以...

    一:Hdfs读数据流程

    1、跟namenode通信查询元数据,找到文件块所在的datanode服务器

    2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket

    3datanode开始发送数据(从磁盘里面读取数据放入流,packet为单位来做校验)

    4、客户端以packet为单位接收,先在本地缓存,然后写入目标文件




    二:Hdfs写数据流程

    1、和namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在

    2、namenode返回是否可以上传

    3、client请求第一个 block该传输到哪些datanode服务器上

    4、namenode返回3个datanode服务器ABC

    5、client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端

    6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答

    7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。






    三:实例

    Hdfs的JAVA客户端基本操作

    展开全文
  • Hadoop-HDFS数据读写过程(详细过程与图解)
  • 2021年大数据Hadoop(十):HDFS数据读写流程

    多人点赞 热门讨论 2021-05-24 23:56:52
    HDFS数据读写流程 HDFS数据流程 HDFS数据流程 HDFS数据读写流程 HDFS数据流程 详细步骤解析: 1、client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录...
  • 大数据入门阶段学些什么?我的后端工程师已经在大数据领域工作了一年多,我将谈谈我的学习...将数据记录到HDFS。当然,Flink还有很多其他功能,比如数据清理和数据分析。4。Spark是一个分布式计算引擎,它与纱线的...
  • HDFS读写流程

    千次阅读 2017-11-16 09:46:57
    HDFS 客户端读文件流程 1打开HDFS文件: HDFS客户端首先调用DistributedFileSystem .open方法打开HDFS文件,底层会调用ClientProtocal.open方法,返回一个用于读取的HdfsDataInputStream对象 2从...
  • HDFS读写过程

    2021-04-08 06:28:33
    HDFS读写过程 相关的类 FileSystem是一个通用文件系统的抽象类,可以被分布式文件系统继承,所有可能使用Hadoop文件系统的代码都要使用到这个类。 Hadoop为FileSystem这个抽象类提供了多种具体的实现,...
  • 1、写数据流程 (1) 客户端client通过Distributed FileSystem模块向NameNode请求上传文件,NameNode会检查目标文件是否已经存在,父目录时候存在。 (2) NameNode会返回是否可以上传,如果不可以上传则返回异常。...
  • HDFS数据流程 客户端通过DistributedFileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。 NameNode返回是否可以上传。 客户端请求第一个Block上传到哪几个DataNode...
  • HDFS读写流程及容错

    2021-01-03 18:16:10
    HDFS client向HDFS写入数据,先调用DistributedFileSystem.create() ②RPC调用namenode的create(),会在HDFS目录树中指定的路径,添加新文件;并将操作记录在edits.log中 namenode.create()方法执行完后,返回一个...
  • HDFS文件读写流程及数据完整性计算

    千次阅读 2019-11-05 18:02:06
    HDFS数据写入流程 ① client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否 存在,返回是否可以上传; ② client请求第一个block该传输到哪些DataNode服务器上; ③ ...
  • HDFS 读写流程简述

    万次阅读 2018-06-06 20:37:27
    参考:https://blog.csdn.net/litianxiang_kaola/article/details/70984777 ...跟namenode通信查询元数据,找到文件块所在的datanode服务器,HDFS客户端首先调用Distri...
  • HDFS读写流程>>图解+描述

    千次阅读 2019-06-24 18:05:49
    读流程
  • HDFS文件读写原理

    2021-06-02 17:30:27
    Client(客户端)对HDFS中的数据进行读写操作,分别是Client从HDFS中查找数据,即为Read(读)数据;Client从HDFS中存储数据,即为Write(写)数据。下面我们对HDFS读写流程进行详细的介绍。假设有一个文件1.txt...
  • HDFS读写工作流程

    千次阅读 2019-11-07 21:07:32
    一、HDFS数据写入流程 1、 client发起文件上传请求,通过RPC与NameNode建立通讯,;NameNode查找是否满足写入要求(该用户是否有写入权限、目标文件是否已存在、集群是否处于安全模式)返回是否可以写入 2、 ...
  • 文章目录一、HDFS数据流程1、文件写入流程2、网络拓扑 - 节点距离计算3、机架感知(副本存储节点选择)二、HDFS数据流程 一、HDFS数据流程 1、文件写入流程 下图为文件写入流程剖析图: 想要上传一个200M的...
  • hadoop hdfs 读写流程

    万次阅读 2018-08-31 21:55:39
    流式数据访问,而不是随机读写 面向大规模数据集,能够进行批处理、能够横向扩展 简单一致性模型,假定文件是一次写入、多次读取 缺点: 不支持低延迟数据访问 不适合大量小文件存储(因为每条元数据占...
  • HDFS 读写容错与调优!
  • 1、HDFS的写数据流程 具体:1)、客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件,NameNode 检查目标文件是否已存在,父目录是否存在。 2)、NameNode 返回是否可以上传。 3)、客户端请求第...
  • 1、HDFS写流程   (1)客户端通过对FileSystem.create() 对象创建建文件,DistributedFileSystem会创建输出流FSDataOutputStream。   (2)DistributedFileSystem 通过RPC远程调用名称节点,在文件系统的命名...
  • 文章目录一、HDFS中的数据写入读出原理1.1、HDFS数据流程1.2、HDFS数据流程二、HDFS文件系统的一致性2.1、从客户端解读文件系统一致性2.2、从服务端解读文件系统一致性2.3、文件系统的一致性模型 一、HDFS中的...
  • 简单搞定hdfs读写流程

    千次阅读 2017-09-04 18:37:10
    1.HDFS数据流程  1)客户端向namenode请求上传文件,namenode检查目标文件是否已存在,父目录是否存在。 2)namenode返回是否可以上传。 3)客户端请求第一个 block上传到哪几个datanode服务器上...
  • Hadoop之HDFS文件读写过程

    千次阅读 2018-08-23 00:15:56
    HDFS过程 HDFS API 读文件  Configuration conf = new Configuration();  FileSystem fs = FileSystem.get(conf);  Path file = new Path("demo.txt");  FSDataInputStream inStream = fs.open...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,996
精华内容 12,398
关键字:

hdfs读写数据过程