HDFS详解二之HDFS读写流程

1.HDFS写流程

写的过程对于我们操作者而言,是无感知的。

流程图如下:

比如现在执行一个命令:hdfs dfs -put  test.txt /

比如我们在Hadoop001这台机器(client node)上执行命令,我们用hdfs dfs ......这个命令的时候,dfs是一个客户端client。

我们用的是HDFS client,它基于JVM,它是一个JVM进程。

用HDFS client执行命令的时候,比如hdfs dfs,java代码,scala代码等,实际上它调用的是分布式文件系统(DistributedFileSystem)(它是一个api,是一个对象)。

HDFS client调用DistributedFileSystem的create方法,FileSystem.create(filePath),filepath是你要上传到哪个路径上面。去与NN进行【RPC】协议通信(面试题)。告诉老大NN,要上传test.txt文件了,向NN发送请求,告诉它要上传文件的大小,名称,拥有者等;

上传的时候,NN会去校验,比如你有没有权限上传,上传的文件是否已经存在等。假如OK,就创建一个新文件,但是不关联任何的block块。NN根据你上传的文件的大小以及块的大小以及副本数,去计算这个文件要切分多少个块,需要多少副本,这些块放在哪些datanode上面。

NN要把在这些信息返回给客户端,这个客户端就是FSDataOutputStream对象(面试题)。

然后HDFS client调用FSDataOutputStream对象的write写的方法,假如有A块和B块,A块有三个副本,B块也有三个副本,它先写A块的第一个副本,然后第二个副本,然后第三个副本,然后B块.....,根据NN返回的地址列表,向DataNode上去写。

写数据包(write packet)。先向DN1写,DN1写完写DN2,DN2写完写DN3;DN3写完,DN3会返回ack确认包给DN2,DN2收到ack确认包而且它自身写的没有问题,它会发ack确认包给DN1,DN1返回ack确认包给FSDataOutputStream对象。这个A块写完了之后,写B块。。。。。。

当所有的块都写完之后,HDFS client端要去调用FSDataOutputStream对象的close方法,(FSDataOutputStream.close()),把它的输出六给关闭掉,刷新缓存的数据包。

最后HDFS client端要去调用DistributedFileSystem对象的方法DistributedFileSystem.complete(),告诉老大NN,已经写完了。

如果在写的过程中,有一个节点挂了,如果节点不够,会抛出异常,如果节点有很多,会与NN通信,请求另外的节点去存储。

(以上流程对操作者来说是透明的无感知的)

2.HDFS读流程

流程如下图:

1.HDFS Client通过调用DistributedFileSystem.open(filePath),调用这个对象的open方法(传入一个路径,去打开),去与NN进行【RPC】通信(面试),然后NN去校验你给的这个文件存不存在,如果存在返回一个FSDataInputStream对象,如果不存在,抛一个错,告诉你不存在或者没有权限等。返回了什么?返回的是这个文件的部分或者全部的block块列表,这些块分布在哪些datanode列表上面(因为nn维护文件对应哪些块,这些块有哪些副本,分布在哪些datanode上)。

2.HDFS Client调用【FSDataInputStream】对象(面试)的read()方法,(已经拿到了这些块的地址列表),

      a. 去与第一个块的最近的DN进行read,读取完后,会check,假如success,会关闭与当前DN通信。假如fail 会记录失败的DataNode和block信息,下次就不会读取。那么会去该块的第二个DN的地址读取。
      b.然后去第二个块的最近的DN上读取,会check,success,会关闭与当前DN通信。
     c.假如当前block块的地址列表全部读取完成,文件还没结束(可能文件非常大),那么DistributedFileSystem会再与NN进行RPC通信,从NN获取下一批的block地址列表。

3.Client调用FSDataInputStream.close() 关闭输入流

(一个块如果有三个副本,只读一个就可以了,因为三个副本是一样的)
(以上流程对于操作者,是透明的,感觉就是连续的数据流)

以上读写过程,仅仅在面试的时候用,生产上不会用,面试前背一下。

真正的源代码里要更复杂一些。

使用HDFS的注意点: 
①流式数据访问,就是一次写入,多次读取。不可以修改数 据,只能删除。 
②保证数据块尽量大,这样NaeNode的压力会较小。 

③由于是磁盘读写,延迟必定会高,做好心理准备,如果你要求实时响应的要求较高,可以使用SPARK。毕竟内存中读取数据比从磁盘读取要快很多。(前提是你有个大内存)
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值