hadoop3.x client下载文件时,namenode一次性将block信息发送给客户端 作者:马育民 • 2021-11-13 20:56 • 阅读:10146 # 说明 client下载文件时,namenode一次性将block信息发送给客户端 # 证明 ### 上传文件 上传 200MB 的文件,3个副本,block大小是 128mb ,如下: [![](https://www.malaoshi.top/upload/pic/hadoop/Snipaste_2021-11-14_11-19-39.png)](https://www.malaoshi.top/upload/pic/hadoop/Snipaste_2021-11-14_11-19-39.png) 该文件分成 2个block,如下: [![](https://www.malaoshi.top/upload/pic/hadoop/Snipaste_2021-11-14_11-20-07.png)](https://www.malaoshi.top/upload/pic/hadoop/Snipaste_2021-11-14_11-20-07.png) ### 跟踪代码 通过下面代码下载一个超过 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(); } } ``` [![](/upload/0/0/1IX4Mw8qNejM.png)](/upload/0/0/1IX4Mw8qNejM.png) [![](https://www.malaoshi.top/upload/pic/hadoop/Snipaste_2021-11-13_20-39-53.png)](https://www.malaoshi.top/upload/pic/hadoop/Snipaste_2021-11-13_20-39-53.png) 返回 所有 block 的信息,包括:所在目录,datanode节点信息 原文出处:http://malaoshi.top/show_1IX2DmMGrpgk.html