调用DistributedFileSystem对象的create()方法,通过 RPC 请求 NameNode 创建文件。 ① NameNode执行各种检查判断: 目标文件是否存在、父目录是否存在、客户端是否具有创建文件的权限。 ② 检查通过后返回 FSDataOutputStream 输出流对象给客户端用于写数据
客户端通过 FSDataOutputStream 输出流开始写入数据 ① NameNode根据网络拓扑挑选出一组DataNode用于存放数据,默认是3副本存储。 ② DataStreamer将数据包流式传输到管道(pipeline)的第一个 DataNode,该DataNode存储数据包并将它发送到 pipeline 的第二个DataNode。同样的,第二个DataNode存储数据包并发送给第三个(也是最后一个)DataNode】
① 客户端要向DataNode写数据时,是以一种管道(pipeline)的方式。将文件块拆分成多个64KB的数据包(packet),多个数据包流水式并发的对同一个DataNode进行写入。 ② 传输单元为64KB,每个单元由若干个分组组成,每个分组为512B的数据 + 4B的校验位 = 516B
调用DistributedFileSystem对象的read()方法,通过 RPC 请求 NameNode 读取文件。 ① NameNode执行各种检查判断: 目标文件是否存在、父目录是否存在、客户端是否具有读取文件的权限。 ② 检查通过后返回 FSDataInputStream 输出流对象给客户端用于读数据
客户端通过 FSDataInputStream 输出流开始写入数据 ① 首先选择哪个DataNode结点?两个因素 {距离最近, DataNode所在服务器负载均衡低},然后从中读取第一个文件快blk_1。 ② 请求第二个文件块blk_2时,是在已经读取完成了blk_1之后才会发出该请求,是串行读,不是多线程并行。最后将读到的blk_2数据追加到blk_1末尾,就可以拼接成一个完整的文件。