文字连贯版
1)想要进行【本地文件写入hdfs】的操作,首先需要将服务器与HDFS进行连接,从而获取HDFS的客户端连接对象,然后用客户端连接对象来调用API完成具体功能:比如写入文件的功能(写入数据的过程,重点研究的点也是在这。研究往HDFS写入数据时的内在工作机制)
- 将服务器与HDFS进行连接的代码
//hdfs的访问路径:hdfs://hadoop132:9820 ( //将Hadoop集群的服务器路径,传递给uri,便于实现hdfs与Hadoop集群之间的连接) URI uri = URI.create("hdfs://hadoop132:9820"); //conf 配置对象 Configuration conf = new Configuration(); conf.set("dfs.replication","6"); //操作的用户(用哪个用户操作HDFS) String user = "zhangwuji";
- 获取HDFS的客户端连接对象的代码
//获取HDFS的客户端连接对象(文件系统对象) FileSystem fs = FileSystem.get(uri, conf, user);
- 用客户端连接对象来调用API完成具体功能:比如写入文件的功能,的代码
//用文件系统对象fs来调用API从而完成功能 fs.copyFromLocalFile(false,true, new Path("E:\\Documents\\01_大数据开发\\3.Hadoop\\02.资料\\07_测试数据\\wcinput\\hello.txt"), new Path("/client_test"));
2)完成了第一步的准备工作之后,则准备上传文件了(也就是所谓的【往HDFS写数据】),那如何往HDFS写入数据呢?只需要通过第一步的【文件系统对象】调用【上传文件的API】即可将本地文件写入HDFS中
- 写入文件的具体代码
//用文件系统对象fs来调用API从而完成功能 fs.copyFromLocalFile(false,true, new Path("E:\\Documents\\01_大数据开发\\3.Hadoop\\02.资料\\07_测试数据\\wcinput\\hello.txt"), new Path("/client_test"));
3)剖析文件写入的内在工作机制(HDFS的写数据流程):将本地文件传入HDFS的这个过程中发生了什么?
- 客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。NameNode根据目标文件是否存在、父目录是否存在,来判断是否可以上传。
- 若经过判断可以上传文件,NameNode则会向客户端返回响应:表示可以上传文件
- 于是客户端则会先向NameNode请求上传第一个Block的数据(0-128M),并询问NameNode应该将文件上传到哪几个DataNode上。
- NameNode则会向客户端返回三个节点dn1、dn2、dn3,表示存储数据用这三个节点(问:NameNode如何确定应该返回哪几个节点给客户端--机架感知的知识点)
- 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。(为什么请求dn1上传数据,因为:本地文件的数据放在了dn1、dn2、dn3中存储,现在需要请求三个节点中的数据开始上传到HDFS)
-
然后dn1、dn2、dn3逐级应答客户端,三个节点均应答成功则可以开始传输数据了
-
客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答
-
当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)
推荐阅读: