Hadoop之HDFS读写文件过程(流程图+代码)

一、HDFS文件读取过程

当客户端需要读取文件时,首先向NameNode发起读请求, NameNode收到请求后,会将请求文件的数据块在DataNode中的具体位置(元数据信息)返回给客户端,客户端根据文件数据块的位置,直接找到相应的DataNode发起读请求。

HDFS文件读取的流程图:

在这里插入图片描述

流程图的说明:

  • HDFS客户端通过DistributedFileSystem对象的open(方法打开要读取的文件。
  • DistributedFileSystem负责向远程的名称节点( NameNode)发起RPC调用,得到文件的数据块信息,返回数据块列表。对于每个数据块,NameNode返回该数据块的DataNode地址。
  • DistributedFileSystem返回-一个FSDatalnputStream对象给客户端,客户端调用FSData-InputSream 对象的read0方法开始读取数据。
  • 通过对数据流反复调用read()方法,把数据从数据节点传输到客户端。
  • 当一个节点的数据读取完毕时,DFSInputStream 对象会关闭与此数据节点的连接,连接此文件下一个数据块的最近数据节点。
  • 当客户端读取完数据时,调用FSDataInputStream 对象的close()方法关闭输入流。

代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class TestHDFSClient {
    public static void main(String[] args)  throws Exception{
        Configuration conf = new Configuration();
        //这里指定使用的是HDFS文件系统
        conf.set("fs.defaultFS","192.168.100.101:9000");
        //通过如下的方式进行客户端身份的设置
        System.setProperty("HADOOP_USER_NAME","root");
        //通过FileSystem的静态方法获取文件系统客户端对象
        FileSystem fs = FileSystem.get(conf);
        //打开一个输出流
        FSDataInputStream in = fs.open(new Path("/newfile"));
        String str = null;
        while((str=in.readLine()) != null){
        	System.out.println(str)
        }
        in.close()	
        //关闭我们的文件系统
        fs.close();
        System.out.println("读取文件成功");
    }
}

二、HDFS文件写入过程

当客户端需要写文件时,首先向NameNode发起写请求,将需要写入的文件名、文件大小等信息告诉NameNode。NameNode会将文件信息记录到本地,同时会验证客户端的写入权限,若验证通过,会向客户端返回文件数据块能够存放在DataNode上的存储位置信息,然后客户端直接向DateNode的相应位置写入数据块的DATa Node也会将数据块备份到其他DataNode上.

HDFS文件写入的流程图

在这里插入图片描述

流程图的说明:

  • 客户端调用 DistributedFileSystem对象的create()方法创建一个文件输出流对象。
  • DistributedFileSystem对象向远程的Name Node 节点发起一次RPC调用,Name Node检查该文件是否已经存在,以及客户端是否有权限新建文件。
  • 客户端调用FSDataOutputStream对象的wite()方法写数据,数据先被写人缓冲区、再被切分为一个个数据包。
  • 每个数据包被发送到由NameNode节点分配的一 组数据节点的一-个节点上,在这组数据节点组成的管道上依次传输数据包。
  • 管道上的数据节点按反向顺序返回确认信息,最终由管道中的第-一个数据节点将整条管道的确认信息发送给客户端。
  • 客户端完成写人,调用close()方法关闭文件输出流。
  • 通知NameNode文件写入成功。

代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class TestHDFSClient {
    public static void main(String[] args)  throws Exception{
        Configuration conf = new Configuration();
        //这里指定使用的是HDFS文件系统
        conf.set("fs.defaultFS","192.168.100.101:9000");
        //通过如下的方式进行客户端身份的设置
        System.setProperty("HADOOP_USER_NAME","root");
        //通过FileSystem的静态方法获取文件系统客户端对象
        FileSystem fs = FileSystem.get(conf);
        //打开一个输出流
        FSDataOutputStream outputStream = fs.create(new Path("/newfile"));
        //写入文件内容
        outputStream.write("hello I am hdfs \n".getBytes());
        //调用close()方法关闭文件输出流
        outputStream.close();
        //关闭我们的文件系统
        fs.close();
        System.out.println("文件创建并写入内容成功");
    }
}

代码的具体实现可以看:HDFS的JAVA API操作

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值