HDFS学习笔记(3)HDFS数据流读写
来源:互联网 发布:数据库快速开发平台 编辑:程序博客网 时间:2024/05/16 08:12
数据流读取
Configuration conf = newConfiguration();
FileSystem fs = FileSystem.get(conf);
FSDataInputStream in = fs.open(new Path(uri));
FileSystem fs = FileSystem.get(conf);
FSDataInputStream in = fs.open(new Path(uri));
步骤如下:
1、客户端调用FileSystem的get方法得到一个实例fs(即分布式文件系统DistributedFileSystem),然后fs调用open()打开要读取的文件
2、DistributedFileSystem(fs)通过使用RPC调用NameNode以确定文件起始block的位置。(Block位置信息存储在namenode的内存中)。对于每一个bolck,NameNode返回block所有复本的DataNode地址(并根据与client的距离排序)。
3、DistributedFileSystem(fs).open()返回一个FSDataInputStream对象给client用来读数据。FSDataInputStream封装了分布式文件输入流(DFSInputStream)用于管理NameNode和DataNode的I/O,client调用对这个输入流调用read()方法。
4、此输入流DFSInputStream has stored the datanode addresses for the first few blocks in the file, then connects to the first(closest) datanode for the first block in the file.通过对数据流反复的调用read()可以将数据从datanode传输到client
5、对一个block读完时DFSInputStream会关闭与datanode的连接,然后寻找下一个block的最佳datanode,当一批blocks读完时,DFSInputStream会询问namenode下一批所需blocks的datanode地址。读取blocks的切换对于client是透明的。
6、当client完成读取,调用FSDataInputStream的close()方法。
在读的过程中,如果DFSInputStream和datanode通信时出错,它会尝试连接下一个最近的datanode。DFSInputStream也会通过校验和确认从datanode读取的数据是否完整,如果发现某个block有损坏,就回报告给namenode,然后从其它复本读取此block。
2、DistributedFileSystem(fs)通过使用RPC调用NameNode以确定文件起始block的位置。(Block位置信息存储在namenode的内存中)。对于每一个bolck,NameNode返回block所有复本的DataNode地址(并根据与client的距离排序)。
3、DistributedFileSystem(fs).open()返回一个FSDataInputStream对象给client用来读数据。FSDataInputStream封装了分布式文件输入流(DFSInputStream)用于管理NameNode和DataNode的I/O,client调用对这个输入流调用read()方法。
4、此输入流DFSInputStream has stored the datanode addresses for the first few blocks in the file, then connects to the first(closest) datanode for the first block in the file.通过对数据流反复的调用read()可以将数据从datanode传输到client
5、对一个block读完时DFSInputStream会关闭与datanode的连接,然后寻找下一个block的最佳datanode,当一批blocks读完时,DFSInputStream会询问namenode下一批所需blocks的datanode地址。读取blocks的切换对于client是透明的。
6、当client完成读取,调用FSDataInputStream的close()方法。
在读的过程中,如果DFSInputStream和datanode通信时出错,它会尝试连接下一个最近的datanode。DFSInputStream也会通过校验和确认从datanode读取的数据是否完整,如果发现某个block有损坏,就回报告给namenode,然后从其它复本读取此block。
数据流写入
Configuration conf = newConfiguration();
FileSystem fs = FileSystem.get(conf);
FSDataOutputStream out = fs.create(new Path(uri));
步骤如下:
FileSystem fs = FileSystem.get(conf);
FSDataOutputStream out = fs.create(new Path(uri));
步骤如下:
1、客户端调用FileSystem的get方法得到一个实例fs(即分布式文件系统DistributedFileSystem),然后fs调用create()创建文件
2、DistributedFileSystem(fs)通过RPC调用NameNode,在命名空间中创建一个新文件,此时该文件还没有相应的数据块。
3、namenode会检查此文件是否已存在以及client是否有权限新建文件,如果检查不通过,则创建失败并向client抛出IOException异常,否则namenode就会创建一条记录。
4、然后DistributedFileSystem(fs)向client返回一个FSDataOutputStream(封装了DFSOutputStream)对象来写数据。在client写数据时DFSOutputStream将它分成一个个的数据包并写入内部队列,称作数据队列(data queue).
5、DFSOutputStream会请求namenode在合适的datanodes(默认3个)上分配blocks来存储数据队列。3个datanodes形成一个管线DataStreamer将数据包流式的传输到管线中第一个datanode,第一个datanode存储数据包并发送的第二个datanode, 第二datanode存储数据包并发送的第三个datanode
6、DFSOutputStream维护了一个确认队列(ack queue),当收到管道中所有datanodes的确认信息后对应数据包才会从确认队列中删除
7、Client完成数据的写入后便对FSDataOutputStream调用close()方法。
8、该操作将所有剩余的数据包写入管线,并等待确认,最后向namenode报告写完成。
4、然后DistributedFileSystem(fs)向client返回一个FSDataOutputStream(封装了DFSOutputStream)对象来写数据。在client写数据时DFSOutputStream将它分成一个个的数据包并写入内部队列,称作数据队列(data queue).
5、DFSOutputStream会请求namenode在合适的datanodes(默认3个)上分配blocks来存储数据队列。3个datanodes形成一个管线DataStreamer将数据包流式的传输到管线中第一个datanode,第一个datanode存储数据包并发送的第二个datanode, 第二datanode存储数据包并发送的第三个datanode
6、DFSOutputStream维护了一个确认队列(ack queue),当收到管道中所有datanodes的确认信息后对应数据包才会从确认队列中删除
7、Client完成数据的写入后便对FSDataOutputStream调用close()方法。
8、该操作将所有剩余的数据包写入管线,并等待确认,最后向namenode报告写完成。
注:DistributedFileSystem, DFSInputStream, DFSOutputStream这几个是逻辑概念,并没用实际的类
0 0
- HDFS学习笔记(3)HDFS数据流读写
- HDFS读写数据流
- HDFS学习笔记(1)初探HDFS
- HDFS学习笔记(2)HDFS运行机制
- HDFS学习笔记(1)认识HDFS
- HDFS学习笔记(4)IO读写操作之checksum
- HDFS学习笔记(5)IO读写操作之数据压缩
- Hadoop学习笔记(三)漫画解读HDFS读写原理
- HDFS数据流
- hadoop学习笔记(HDFS)
- 3-hdfs 读写过程
- 笔记:HDFS读取和写入数据流
- <hadoop学习历程>--笔记心得4-HDFS文件读写流程
- HDFS学习笔记
- HDFS学习笔记
- HDFS 学习笔记
- hadoop-hdfs学习笔记
- HDFS学习笔记
- 音视频编解码学习笔记——基本概念
- 笔试题:递归逆序栈
- Java NIO 系列教程
- XML
- TTS 配置
- HDFS学习笔记(3)HDFS数据流读写
- angularjs2 九
- 你从未见过如此详细的“闭包和作用域链”
- k-d tree树 近邻算法
- iOS开发使用iconfont图片字体
- BAT及各大互联网公司2014前端笔试面试题:HTML/CSS篇
- Qt for Android 程序启动闪一下黑屏的优化方法
- 【NOIP2016提高A组模拟9.7】千帆渡
- TOMCAT启动提示NB: JAVA_HOME should point to JDK not JRE