API实现HDFS的读写数据流JAVA代码及流程详解
来源:互联网 发布:上海行知小学 编辑:程序博客网 时间:2024/05/29 18:06
前言
针对Java代码中实现对HDFS文件的读取(FSDataInputStream)与写入(FSDataOutputStream)在工作项目中经常使用;下边就读写流程做一下详细介绍。
环境准备
1.集群配置文件
如图,一般对文件的读取,会将core-site.xml,hdfs-site.xml,slaves文件拷贝到项目的根目录下;
如果项目中涉及到MapReduce的,需要将mapred-site.xml,yarn-site.xml拷贝过来;
2.pom.xml文件
可根据自己的hadoop版本及需求自行添加。github中查询地址请点击
<repositories> <repository> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository> </repositories> <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.5.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.5.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.5.1</version> </dependency> </dependencies>
读文件剖析
Configuration conf = new Configuration();FileSystem fs = FileSystem.get(conf);FSDataInputStream in = fs.open(new Path(uri)); //读取之后 输出IOUtils.copyBytes(in, out, 4096, true);
步骤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。
写文件剖析
Configuration conf = new Configuration();FileSystem fs = FileSystem.get(conf);FSDataOutputStream out = fs.create(new Path(pathStr));//写出out.write(resultStr.getBytes("UTF-8"));
步骤1:客户端调用FileSystem的get()方法得到一个实例fs(即分布式文件系统DistributedFileSystem),然后fs调用create()创建文件。
步骤2:DistributedFileSystem(fs)通过RPC调用NameNode在命名空间中创建一个新文件,此时该文件还没有相应的数据块。namenode会检查此文件是否已存在及client是否有权限新建文件,如果检查不通过,则创建失败并向client抛出IOException异常,否则namenode就会创建一条记录。
步骤3:然后DistributedFileSystem(fs)向client返回一个FSDataOutputStream(封装了DFSOutputStream)对象来写数据。在client写数据时,DFSOutputStream将它分成一个个的数据包并写入内部队列,称作数据队列(data queue)。
步骤4:DFSOutputStream会请求namenode在合适的datanodes(默认3个)上分配blocks来存储数据队列。3个datanodes形成一个管线DataStreamer将数据包流式的传输到管线中第一个datanode,第一个datanode存储数据包并发送到第二个datanode, 第二个datanode存储数据包并发送到第三个datanode。
步骤5:DFSOutputStream也维护了一个确认队列(ack queue),当收到管道中所有datanodes的确认信息后对应数据包才会从确认队列中删除。
步骤6:Client完成数据的写入后便对FSDataOutputStream调用close()方法。
步骤7:该操作将所有剩余的数据包写入管线,并等待确认,最后向namenode报告写完成。
总结
更多API操作,请参考文章:调用JAVA API对HDFS文件进行文件的读写、上传下载、删除等操作代码详解
- API实现HDFS的读写数据流JAVA代码及流程详解
- 调用JAVA API对HDFS文件进行文件的读写、上传下载、删除等操作代码详解
- Java API读写HDFS。
- HDFS的读写流程
- HDFS读写流程详解/剖析
- HDFS体系结构及读写流程
- HDFS读写文件的java代码
- HDFS读写数据流
- JAVA数据流概念及标准数据流的实现
- HDFS的Java API操作代码
- HDFS常用的Java Api详解
- HDFS架构和读写流程详解
- HDFS API 文件读写代码演示
- 如何使用Java API读写HDFS
- HDFS的Java API
- HDFS上读写数据的流程解释
- HDFS上读写数据的流程解释
- HDFS中文件读写的流程
- hadoop集群搭建详解读
- Spring @Transactional (一) 加强版 标签: springexception数据库jdbcjavahibernate 2010-10-21 17:54 38545人阅读 评论(
- Selenium之元素进阶操作--鼠标左击,右击,双击,悬停(Action)的应用
- 第十二节:上传文件
- 让云朵飘,微信小程序animation循环动画
- API实现HDFS的读写数据流JAVA代码及流程详解
- Linux Shell脚本编程--curl命令详解
- Android PopupWindow使用方法小结
- GraphicsMagick+im4java 图片处理
- iOS ProtocolBuffer 最新操作记录以及“'GPBProtocolBuffers_RuntimeSupport.h' file not found”等问题解决
- OpenCV Shi-Tomasi角点检测以及goodFeatureToTrack()源码分析
- java常用排序之希尔排序
- 百度地图点击城市的出现下钻
- 三种插入排序及其C++实现