-大数据入门-2-Hadoop-HDFS=读写流程

1hdfs读流程 fsdatainpustream

[hadoop@hadoop001 hadoop]$ bin/hdfs dfs -cat /examples/output1/part-r-00000
19/07/13 16:18:28 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
11	2
22	2
33	2
44	2
5	2
www.ruozedata.com	2       读流程无感知的
[hadoop@hadoop001 hadoop]$ pwd
/home/hadoop/app/hadoop

1.1client通过filesystem.open(filepath)方法,与nn节点进行【rpc协议】通信,校验是否有权限,是否存在。假如都ok,就返回该文件的部分或全部的block块的列表(包含各个block块的分布在dn地址的列表),也就是返回【fsdatainputstream】对象;

1.2.clinet调用fsdatainputstream.读方法:
a与第一个块的最近的dn(机架感知)进行读取,读取完成后,会进行check,假如ok,会关闭与当前的dn的通信;假如失败会记录块的这个副本+dn信息,下次就不会从这读取。那么就去该块的第二个dn的地址读取。
b然后读取第二个块,如1.1
c。假如block列表读取完成后,文件还未结束,那么fidatainputstream会从nn获取下一批次的block的列表。
当然读操作对于client,就是透明的,感觉就是连续的数据流。

1.3 client调用fsdatainpustream.close()方法,关闭输入流。
在这里插入图片描述

2hdfs写流程 fsdataoutputstream

2.1 Client调用FileSystem.create(filePath)方法,与NN进行【rpc】通信,检验该路径是否有权限创建是否文件存在,假如ok,就创建一个新的文件,但不关联任何的block,返回一个【FSDataOutputStream】(假如不ok,直接返回错误,代码加try catch)

2.2 Client调用FSDataOutputStream.write方法
a.将第一个块的第一个副本写入DN1,第一个副本写完传输给第二个DN2,第二个副本写完就传输给第三个DN3,当第DN3写完,就返回一个ack packet给DN2,DN2就返回ack packet给DN1,DN1就返回ack packet的FSDataOutputStream对象,标识第一个块的三个副本都写完了。
b.余下的块依次这样

2.3 当向文件写入数据完成后,Client调用FSDataOutputStream.close()方法
关闭输出流

2.4 再调用FileSystem.complete()方法,
告诉NN节点写入成功。
在这里插入图片描述
3思考题

1DN,1副本,DN挂了,能不能读 写?
 读路径可以,读写文件内容不行。


3DN,3副本 ,1副本=1DN,其中一个DN挂了,能不能读内容+写?
能读内容,无法写。


10DN,3副本,其中一个DN挂了,能不能读内容+写?
可以读内容也可以写

生产总结:

只有3个dn,调整为2个副本。
建议副本数 n-1,与存储空间挂钩的
存储的DN满足副本数  就能写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值