说明
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节点信息



