hadoop3.x client下载文件时,namenode一次性将block信息发送给客户端

说明

client下载文件时,namenode一次性将block信息发送给客户端

证明

上传文件

上传 200MB 的文件,3个副本,block大小是 128mb ,如下:

该文件分成 2个block,如下:

跟踪代码

通过下面代码下载一个超过 128MB 的文件,根据如下图:

package test;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;   
//import org.junit.Test;

public class T3下载文件_底层实现 {
    public static void main(String[] args) throws Exception {
        //配置
        Configuration config = new Configuration();
        // 1 获取文件系统。设置集群url、操作用户
        // namenode的 ip、port
        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop1:8020"), config, "root");
        Configuration localConfig = new Configuration();
        //调用 getRawFileSystem() ,在windows不报错
        FileSystem localFS=FileSystem.getLocal(localConfig).getRawFileSystem();
        // 2 从hdfs下载到本地
        InputStream in=null;
        OutputStream out = null;
        try {
            // =========== 在此处debug ===========
            in = fs.open(new Path("/hadoop-2.7.3.tar.gz"));
            //需要调用create() 方法
            out = localFS.create(new Path("C:\\Users\\mym\\Desktop\\下载文件\\4_下载文件2.txt"), true);
            IOUtils.copyBytes(in, out, config, true);
        } catch (IOException e) {
            IOUtils.closeStream(out);
            IOUtils.closeStream(in);
            throw e;
        }
        // 3 关闭
        fs.close();
        localFS.close();
    }
}

返回 所有 block 的信息,包括:所在目录,datanode节点信息