设为首页 收藏本站
查看: 1273|回复: 0

[经验分享] HDFS读写数据流

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-6-6 11:33:42 | 显示全部楼层 |阅读模式

一, 文件读取剖析

2012060814470328.png

Configuration conf = newConfiguration();

FileSystem fs = FileSystem.get(conf);

FSDataInputStream in = fs.open(new Path(uri));

客户端调用FileSystem的get()方法得到一个实例fs(即分布式文件系统DistributedFileSystem),然后fs调用open()打开希望读取的文件(步骤1)

DistributedFileSystem(fs)通过使用RPC调用NameNode以确定文件起始block的位置(步骤2)。(Block位置信息存储在namenode的内存中)。对于每一个bolck,NameNode返回block所有复本的DataNode地址(并根据与client的距离排序)。

DistributedFileSystem(fs).open()返回一个FSDataInputStream对象给client用来读数据。FSDataInputStream封装了分布式文件输入流(DFSInputStream)用于管理NameNode和DataNode的I/O. client调用对这个输入流调用read()方法(步骤3)。

此输入流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(步骤4).

对一个block读完时DFSInputStream会关闭与datanode的连接,然后寻找下一个block的最佳datanode(步骤5).当一批blocks读完时,DFSInputStream会询问namenode下一批所需blocks的datanode地址。读取blocks的切换对于client是透明的。

当client完成读取,调用FSDataInputStream的close()方法(步骤6)。

在读的过程中,如果DFSInputStream和datanode通信时出错,它会尝试连接下一个最近的datanode。DFSInputStream也会通过校验和确认从datanode读取的数据是否完整,如果发现某个block有损坏,就回报告给namenode,然后从其它复本读取此block。


二, 文件读取剖析

2012060814483459.png

Configuration conf = newConfiguration();

FileSystem fs = FileSystem.get(conf);

FSDataOutputStream out = fs.create(new Path(uri));

客户端调用FileSystem的get()方法得到一个实例fs(即分布式文件系统DistributedFileSystem),然后fs调用create()创建文件(步骤1),

DistributedFileSystem(fs)通过RPC调用NameNode在命名空间中创建一个新文件,此时该文件还没有相应的数据块(步骤2)。namenode会检查此文件是否已存在及client是否有权限新建文件,如果检查不通过,则创建失败并向client抛出IOException异常,否则namenode就会创建一条记录。

然后DistributedFileSystem(fs)向client返回一个FSDataOutputStream(封装了DFSOutputStream)对象来写数据。在client写数据时(步骤3),DFSOutputStream将它分成一个个的数据包并写入内部队列,称作数据队列(data queue).

DFSOutputStream会请求namenode在合适的datanodes(默认3个)上分配blocks来存储数据队列。3个datanodes形成一个管线DataStreamer将数据包流式的传输到管线中第一个datanode,第一个datanode存储数据包并发送的第二个datanode, 第二个datanode存储数据包并发送的第三个datanode(步骤4).

DFSOutputStream也维护了一个确认队列(ack queue),当收到管道中所有datanodes的确认信息后对应数据包才会从确认队列中删除(步骤5)。

Client完成数据的写入后便对FSDataOutputStream调用close()方法(步骤6)。

该操作将所有剩余的数据包写入管线,并等待确认,最后向namenode报告写完成(步骤7)。


注:DistributedFileSystem, DFSInputStream, DFSOutputStream这几个是逻辑概念,并没用实际的类



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-20278-1-1.html 上篇帖子: hadoop视频教程下载链接 下篇帖子: Hadoop读写过程详细代码 数据流
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表