hdfs 读写文件 java_HDFS文件写入

上一篇 博客中介绍了 HDFS 读取文件的流程,这篇文章趁热打铁,介绍一下 HDFS 文件写入的流程,整个流程如下:

通过 FileSystem.get 方法获取文件系统 FileSystem,HDFS 文件系统实例为 DistributedFileSystem。

通过 DistributedFileSystem.create 调用 namenode 的服务,请求在 namenode 的命名空间中创建一个新的文件条目。namenode 会先检查该文件是否存在,客户端是否有权限创建,通过这些检查之后 namenode 才会生成文件条目,并返回 DFSoutputStream,负责处理数据节点和名称节点之间的通信。如果失败则返回一个 IOException。

DFSoutputStream 在将文件写入到 datanode 前,会先将文件分为一个个 packet,排成队列 data queue。

DFSoutputStream 在处理 data queue 时,会先请求 namenode,询问这个文件存储在哪几个 datanode 比较合适(为了保证数据的安全性,需要将文件备份到不同的 datanode 上,默认为 3 个)。然后将这几个 datanode 排成一个 pipeline,DFSoutputStream 把 packet 按 data queue 队列顺序发送到第一个 datanode 中,第一个 datanode 又把这个 packet 发送到第二个 datanode 中,以此类推。

当 pipeline 中所有节点将这个 packet 传输完成之后,会发送一个确认码给客户端,这时 DFSoutputStream 才会将这个 packet 从 data queue 中去掉。

文件传输完成之后,SDFoutputStream 调用 close 方法结束文件的传输

DistributedFileSystem 调用 complete 通知 namenode 把这个文件标示为已完成。

用一张图片概括就是这个样子:

b816f0d30aa01075d68acd40eab2a72c.png

这里在补充说明一个问题,namenode 如何选择哪个数据节点来保存副本呢?Hadoop 的策略是在与客户端相同的节点上放置第一个副本(若客户端运行在集群之外,就可以随机选择节点,不过系统会避免挑选那些太满或太忙的节点)。

第二个副本被放置在与第一个节点不同的随机选择的机架上。第三个副本被放置在与第二个副本相同的机架,但放在不同的节点。整个数据中心如下图:

09af7d02f78afe890ad6f3a07c4ddff9.png

以上就是我对 HDFS 写入文件的总结,如果有错欢迎指出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值