写文件(上传文件)
示例:使用IO流实现文件上传
@Test
public void uploadFile2() throws IllegalArgumentException, IOException {
FileInputStream fis = new FileInputStream(new File("E:/test/core-site.xml")); //输入流
FSDataOutputStream fos = fs.create(new Path("/b.xml")); //输出流
IOUtils.copyBytes(fis, fos, cfg); //从本地写入文件到HDFS 复制流
IOUtils.closeStream(fis); //关闭流
IOUtils.closeStream(fos); //关闭流
}
流程:
- client端发送写文件请求,NameNode 检查文件是否存在,如果已存在,直接返回错误信息,否则,发送给client一些可用DataNode 节点
- client将文件分块,并行存储到不同节点上的DataNode中,发送完成后,client同时发送信息给NameNode 和DataNode
- NameNode 收到的client信息后,发送确信信息给DataNode
- DataNode 同时收到NameNode 和DataNode 的确认信息后,提交写操作。
@Test
public void downloadFile() throws IOException {
FSDataInputStream fis = fs.open(new Path("/a.xml"));
FileOutputStream fos = new FileOutputStream(new File("E:/xqj.txt"));
IOUtils.copyBytes(fis, fos, cfg);//从HDFS中读取文件到本地
IOUtils.closeStream(fos);
IOUtils.closeStream(fis);
}
流程:
- client端发送读文件请求给NameNode ,如果文件不存在,返回错误信息,否则,将该文件对应的block及其所在DataNode 位置发送给client
- client收到文件位置信息后,与不同DataNode 建立socket连接并行获取数据。