HDFS的文件写入和文件读取流程

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

一、文件写入流程

1.相关知识点介绍

Pipeline管道:

读取hdfs文件内容,hdfs,hadoop,大数据 Pipeline,即管道。这是 HDFS 在上传⽂件写数据过程时采⽤的⼀种数据传输⽅式。客户端将数据块写⼊第⼀个数据节点,第⼀个数据节点保存数据之后再将块复制到第⼆个数据节点,后者保存后将其复制到第三个数据节点。通俗描述 pipeline 的过程就是:Client——>DN1——>DN2—>DN3
为什么 datanode 之间采⽤ pipeline 线性传输,⽽不是⼀次给三个 datanode 拓扑式传输呢?因为数据以管道的⽅式,顺序的沿着⼀个⽅向传输,这样能够充分利⽤每个机器的带宽,避免⽹络瓶颈和⾼延迟时的连接,最⼩化推送所有数据的延时。在线性推送模式下,每台机器所有的出⼝宽带都⽤于以最快的速度传输数据,⽽不是在多个接受者之间分配宽带。

ACK应答:

读取hdfs文件内容,hdfs,hadoop,大数据

 ACK (Acknowledge character)即是确认字符,在数据通信中,接收⽅发给发送⽅的⼀种传输类控制字符。表示发来的数据已确认接收⽆误。在 pipeline 管道传输数据的过程中,传输的反⽅向会进⾏ ACK 校验,确保数据传输安全。

2.写入流程

(1)客户端调⽤ DistributedFileSystem 对象的 create() ⽅法创建⼀个⽂件输出流对象。
(2)DistributedFileSystem 对象向 NameNode 发起 RPC 调⽤,NameNode 检查该⽂件是否已经存在,以及客户端是否有权限新建⽂件。如果这些检查通过,NameNode 就会为创建新⽂件记录⼀条记录。否则,⽂件创建失败并向客户端抛出 IOException。
(3)DistributedFileSystem 向客户端返回 FSDataOutputStream 输出流对象。由此客户端可以开始写⼊数据。FSDataOutputStream 封装⼀个 DFSOutputStream 对象,负责处理 DataNode 和 NameNode 之间的通信。
(4)客户端调⽤ FSDataOutputStream 对象的 write() ⽅法写数据。DFSOutputStream 将数据分成⼀个个数据包(packet 默认 64KB),并写⼊⼀个称之为数据队列(Data queue)的内部队列。DFSOutputStream 有⼀个内部类DataStreamer,⽤于请求 NameNode 挑选出适合存储数据副本的⼀组 DataNode。这⼀组DataNode 采⽤ pipeline 机制做数据的发送。默认是 3 副本存储。
(5)Pipeline 传递数据给 DataNode。DataStreamer 将数据包流式传输到 pipeline 的第⼀个 datanode,该DataNode存储数据包并将它发送到 pipeline 的第⼆个 DataNode。同样,第⼆个 DataNode 存储数据包并且发送给第三个(也是最后⼀个)DataNode。
(6)DFSOutputStream 也维护着⼀个内部数据包队列来等待 DataNode 的收到确认回执,称之为确认队列(ackqueue),收到 pipeline 中所有 DataNode 确认信息后,该数据包才会从确认队列删除。管道上的数据节点按反向顺序返回确认信息,最终由管道中的第⼀个数据节点将整条管道的确认信息发送给客户端。
(7)客户端完成写⼊,调⽤ close() ⽅法关闭⽂件输出流。
(8)通知 NameNode ⽂件写⼊成功。
(9)在⼀个块被写⼊期间可能会出现多个 DataNode 同时发⽣故障。只要写⼊了指定的最⼩副本数(dfs.namenode.replication.min 的默认值为 1),写操作就会判定成功。数据块其他副本可以在集群中异步复制,直到达到其⽬标副本数(dfs.replication 的默认值为 3)。

3.代码实现

// ⽂件写⼊
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.FileInputStream;
import java.io.IOException;
public class HDFSWriteDemo {
  public static void main(String[] args) throws IOException {
    // 设置客户端⽤户身份:root 具备在 hdfs 的读写权限
    System.setProperty("HADOOP_USER_NAEM", "root");
    // 创建 conf 对象
    Configuration conf = new Configuration();
    // 设置分布⽂件系统,默认为本地⽂件系统file:///
    conf.set("fs.defaultFS", "hdfs://node01:9000");
    // 创建 FileSystem 对象
    FileSystem fs = FileSystem.get(conf);
    // 设置⽂件输出路径
    Path path = new Path("/mydir/data.txt");
    // 调⽤ create ⽅法创建⽂件
    FSDataOutputStream out = fs.create(path);
    // 创建本地输⼊流
    FileInputStream in = new FileInputStream("D:\\data.txt");
    // IO ⼯具类实现流对拷⻉
    IOUtils.copy(in, out);
    // 关闭连接
    fs.close();
 }
}

二、文件读取流程

1.读取流程

读取hdfs文件内容,hdfs,hadoop,大数据

 (1)HDFS Client 调⽤抽象类 FileSystem.get() 获取⼀个 DistributedFileSystem 对象,然后调⽤
DistributedFileSystem.open() 打开要读取的⽂件。
(2)DistributedFileSystem 向 NameNode 发起 RPC 调⽤,获得⽂件的数据块信息。NameNode 返回数据块 ID 及 存储数据块的 DataNode 地址列表,该列表按照数据块 DataNode 与客户端的⽹络拓扑距离进⾏排序。

(3)DistributedFileSystem 在底层调⽤ ClientProtocol.open(),返回⼀个 FSDataInputStream 对象⽤于读取数据。FSDataInputStream 底层封装了 DFSInputStream 对象,负责管理 DataNode 和 NameNode 之间的 I/O。
(4)客户端对 DFSInputStream 调⽤ read() ⽅法。随即 DFSInputStream 连接与客户端距离最近的 NameNode,通过对数据流反复调⽤read()⽅法,把数据从 DataNode 传输到客户端。
(5)当数据块读取完毕时,DFSInputStream 将关闭与该 DataNode 的连接,然后寻找下⼀个块的最佳DataNode。这些操作对⽤户来说是透明的。所以⽤户感觉起来它⼀直在读取⼀个连续的流。
(6)当客户端读取完数据时,调⽤ FSDataInputStream.close() ⽅法关闭输⼊流。
(7)如果 DFSInputStream 与 DataNode 通信时遇到错误,它将尝试该块的下⼀个最接近的 DataNode 读取数据,并记住发⽣故障的 DataNode,保证以后不会反复读取该 DataNode 后续的块。此外,DFSInputStream也会通过校验和(checksum)确认从 DataNode 发来的数据是否完整。如果发现有损坏的块,DFSInputStream 会尝试从其他DataNode 读取该块的副本,也会将被损坏的块报告给 NameNode。文章来源地址https://www.toymoban.com/news/detail-735150.html

2.相关代码

// ⽂件读取
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.FileOutputStream;
import java.io.IOException;
public class HDFSReadDemo {
  public static void main(String[] args) throws IOException {
    // 设置客户端⽤户身份:root 具备在 hdfs 的读写权限
    System.setProperty("HADOOP_USER_NAEM", "root");
    // 创建 conf 对象
    Configuration conf = new Configuration();
    // 设置分布⽂件系统,默认为本地⽂件系统file:///
    conf.set("fs.defaultFS", "hdfs://node01:9000");
    // 创建 FileSystem 对象
    FileSystem fs = FileSystem.get(conf);
    // 调⽤ open ⽅法读取⽂件
    FSDataInputStream in = fs.open(new Path("/data.txt"));
    // 创建本地输出流
    FileOutputStream out = new FileOutputStream("D:\\data.txt");
    // IO ⼯具类实现流对拷⻉
    IOUtils.copy(in, out);
    // 关闭连接
    fs.close();
 }
}

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

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

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

相关文章

  • HDFS常用操作以及使用Spark读取文件系统数据

    掌握在Linux虚拟机中安装Hadoop和Spark的方法; 熟悉HDFS的基本使用方法; 掌握使用Spark访问本地文件和HDFS文件的方法。 启动Hadoop,在HDFS中创建用户目录“/user/hadoop” 在Linux系统的本地文件系统的“/home/hadoop”目录下新建一个文本文件test.txt,并在该文件中随便输入一些内容,

    2024年04月22日
    浏览(29)
  • xslx表格文件采集到hdfs流程&hdfs数据 load到hive表

    咱们就是说,别的话不多说,直接开始实操 xslx在win系统上,打开后另存为csv文件格式,上传到linux系统中。(注意下编码格式,不然后面就是中文乱码)。 file -i csv文件 可以查看文件现在的编码格式(编码格式不匹配会导致文件内中文乱码)。 修改文件的编码格式: iconv

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

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

    2024年02月07日
    浏览(41)
  • 大数据 - Hadoop系列《五》- HDFS文件块大小及小文件问题

    系列文章: 大数据- Hadoop入门-CSDN博客 大数据 - Hadoop系列《二》- Hadoop组成-CSDN博客 大数据 - Hadoop系列《三》- HDFS(分布式文件系统)概述_大量小文件的存储使用什么分布式文件系统-CSDN博客 大数据 - Hadoop系列《三》- MapReduce(分布式计算引擎)概述-CSDN博客 大数据 - Hadoop系

    2024年04月24日
    浏览(39)
  • 【Hadoop面试】HDFS读写流程

    HDFS(Hadoop Distributed File System)是GFS的开源实现。 HDFS是一个典型的主/备(Master/Slave)架构的分布式系统,由一个名字节点Namenode(Master) +多个数据节点Datanode(Slave)组成。其中Namenode提供元数据服务,Datanode提供数据流服务,用户通过HDFS客户端与Namenode和Datanode交互访问文件系统。

    2024年02月04日
    浏览(29)
  • 大数据:HDFS存储原理,fsck命令查看文件副本状态,namenode元数据,edits流水账,fsimage合并,hdfs读取数据

    2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学,当然,像很多金融企业、安全机构啥的,他们必须要用oracle数据库 这oracle比sql安全,强大多了,所以你需要学

    2024年02月05日
    浏览(48)
  • 大数据编程实验一:HDFS常用操作和Spark读取文件系统数据

    这是我们大数据专业开设的第二门课程——大数据编程,使用的参考书是《Spark编程基础》,这门课跟大数据技术基础是分开学习的,但这门课是用的我们自己在电脑上搭建的虚拟环境进行实验的,不是在那个平台上,而且搭建的还是伪分布式,这门课主要偏向于有关大数据

    2024年04月10日
    浏览(38)
  • HDFS文件创建与写入

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

    2024年02月02日
    浏览(28)
  • Hadoop大数据从入门到实战(二)分布式文件系统HDFS

    头歌实践教学平台 教学课堂 大数据从入门到实战 - 第2章 分布式文件系统HDFS 任务描述 本关任务:使用 Hadoop 命令来操作分布式文件系统。 编程要求 在右侧命令行中启动 Hadoop ,进行如下操作。 在 HDFS 中创建 /usr/output/ 文件夹; 在本地创建 hello.txt 文件并添加内容:“ HDFS的

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

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

    2024年01月23日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包