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()方法,关闭输入流。

hadoop大量文件corrupt hadoop load data_hdfs

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节点写入成功。

hadoop大量文件corrupt hadoop load data_java_02


3思考题

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


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


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

生产总结:

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