使用客户端操作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节点,挑选距离本地机架最近的一个节点!
	在其他机架选择一个节点,保存第三个副本!
	
                    
                
                
            
        
浙公网安备 33010602011771号