使用客户端操作hdfs

一、HDFS
1. HDFS的本质是一个文件系统,特点是分布式,需要在多台机器启动多个NN,DN进程组成一个分布式系统

2. HDFS不支持对一个文件的并发写入,也不支持对文件的随机修改,不适合存储小文件(存储小文件时会降低NN的服务能力)

3. HDFS的块大小
块大小可以通过hdfs-site.xml中的dfs.blocksize进行配置!
如果不配置,那么在hadoop1.x时,dfs.blocksize=64M,在hadoop2.xdfs.blocksize=128M

默认值为128M的原因:
hadoop默认使用hadoop的集群的机器都采用普通的机器磁盘!

基于最佳传输消耗理论,一次传输中寻址时间为总传输时间的1%为最佳状态!

目前机器磁盘的寻址时间普遍为10ms, 10ms / 1% * 磁盘的写入速度(100M/S)=100M

如果公司的磁盘写入速度为300M/S,可以将dfs.blocksize=256M,
如果公司的磁盘写入速度为500M/S,可以将dfs.blocksize=512M。

块大小不能太小:
如果块太小,会造成降低NN的服务能力!在读取和上传一个大的文件时带来额外的寻址时间消耗

块大小不能太大:
如果块太大,在一次上传时,如果发生异常,需要重新传输,造成网络IO资源的浪费!
在随机读取某部分内容时,不够灵活!

4. 两个概念
块大小指的是块的极限值!
副本数指的也是副本的最大值!

这两个参数都是在客户端上传文件时指定!

5. 块的属性
length: 块的实际大小
offset: 块的便宜量,这个块从文件的哪部分开始保存数据

二、使用客户端操作hdfs

1.使用shell客户端
hadoop fs 命令 参数: 既可以操作本地模式的HDFS也可以操作分布式的HDFS
hdfs dfs 命令 参数: 只操作分布式的HDFS

2.使用javaapi
FileSystem: 客户端的基类
LocalFileSystem: 本地文件系统
DistributedFileSystem: 分布式文件系统

具体的实现取决于配置文件的fs.defaultFS参数的配置!

Configuration: 负责读取配置文件中的参数,保存到一个map中!
默认Configuration会读取类路径下8个配置文件!

Configuration.set(name,value): 手动添加属性

Path : 一个文件的路径
Path.toString() : 输出文件的完整的URI(协议+路径)
Path.getName() : 输出文件名

FileStatus: 文件的状态(文件的属性信息)
LocatedFileStatus: 除了包含文件的属性信息,还包含文件所有的块的位置信息(length,offset,hosts)

FileSystem.listStatus(Path p) | FileSystem.getFileStatus(Path p)

2.自定义上传和下载

上传: 获取本地文件系统对文件文件的一个输入流,读取文件,将读到的数据通过HDFS上对目标路径的输出流,进行写出!
下载: 获取HDFS文件系统对文件的一个输入流,读取文件,将读到的数据通过本地文件系统上对目标路径的输出流,进行写出!

①获取文件系统上对某个路径的输入流 : DFSFileInputStream is=FileSystem.open(Path p);
②获取文件系统上对某个路径的输出流 : FileSystem.create(Path p);
③数据的拷贝 : IOUtils.copyBytes(in,out,4096,true);
④定位读取: DFSFileInputStream.seek(int offset);

三、文件的读写流程
1.写流程
①启动服务端NN,DN进程,提供一个分布式文件系统客户端
②由客户端向NN发送请求,请求上传一个文件,NN对请求进行合法性检查(权限,路径是否合法,路径是否已经存在)
③如果合法,NN响应客户端允许上传
④客户端根据自己设置的块大小,读取文件中第一块的内容,请求NN分配DN列表
⑤NN参考客户端上传的文件的副本数,根据机架感知,返回对应的DN列表
⑥客户端会请求举例最近的DN节点,再由DN列表中的每个DN节点都请求举例最近的DN节点,建立数据传输通道
⑦通道建立完成,客户端将第一块的数据,封装为一个个packet,发送到通道的下一个节点
通道的每一个DN节点在收到packet后,进行校验,检验合法,罗盘存储,将packet发送到下一个DN节点,回复客户端ack确认消息!
⑧第一个块传输完成后,DN向NN上报块的消息,只要有一个DN节点上报块信息,NN就认为这个块已经传输完成,通道关闭,
开始下一个块的传输
⑨下一个块依次按照④-⑧流程传输
⑩所有的块传输完成后,NN响应客户端传输完成,客户端关闭输出流

2.异常写流程
在写流程的⑦,客户端每封装一个packet(64K),将packet存储到dataQuene队列中,在发送时,将dataQuene队列中的
每个packet依次发送到通道,packet在发送到通道后,会从dataQuene中移动到ackQuene队列!

一旦一个packet收到了所有dn节点回复的ack确认消息,ackQuene中的这个packet会被删除!
如果在收到确认消息时,超时,此时中断传输,所有外部的packet,会立刻回滚到dataQuene,重新建立传输通道,
剔除坏的节点,继续传输,只要有传输完成后,DN向NN上报块的消息,
只要有一个DN节点上报块信息,NN就认为这个块已经传输完成,通道关闭。

副本数如果暂时不满足条件,之后NN会自动检查,维护副本数!

3.读流程
①启动服务端NN,DN进程,提供一个分布式文件系统客户端
②由客户端向NN发送请求,请求下载一个文件,NN对请求进行合法性检查(权限,路径是否合法)
③如果合法,NN响应客户端允许下载,同时返回当前下载文件的所有元数据信息(块的映射信息)
④客户端根据返回的元数据信息,去每个对应的DN节点按照顺序依次下载每个块

4.拓扑距离
拓扑距离指网络中各个节点之间抽象的一种距离!通常指两个节点到达共同祖先节点的和!
一般为2n

5.机架感知
2.7.2的默认的机架感知策略:
在本地机架挑选一个节点,保存第一个副本!如果本地机架没有DN节点,挑选距离本地机架最近的一个节点!
在本机机架挑选另一个节点,保存第二个副本!如果本地机架没有DN节点,挑选距离本地机架最近的一个节点!
在其他机架选择一个节点,保存第三个副本!

 

posted @ 2020-09-29 20:50  程序那点事  阅读(271)  评论(0编辑  收藏  举报