阅读目录
- 一、HDFS文件读取过程
- HDFS文件读取的流程图:
- 流程图的说明:
- 代码:
- 二、HDFS文件写入过程
- 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操作