HDFS

一、HDFS的体系结构

1、NameNode:主节点

  •        职责:管理维护HDFS 
     维护了两个非常重要的文件:
      edits文件  -----> 记录操作日志(事务日志)
      fsimage文件 ----> HDFS的元信息(映像文件) 
  •        HDFS操作日志:edits文件
      位置:find . -name edits*
     最新的操作日志:edits_inprogress****
     都是二进制
     HDFS提供一个工具:edits viewer 日志查看器 ----> XML
     Demo:
           hdfs dfs -mkdir /mydemo
           hdfs oev -i edits_inprogress_0000000000000000106 -o ~/a.xml
  • HDFS的元信息:fsimage文件

    就跟edits文件在一起
    记录:数据块的位置、冗余信息
    也是一个二进制
    HDFS提供一个 image viewer ----> 文本或者xml
    hdfs oiv -i fsimage_0000000000000000005 -o ~/b.xml -p XML

    问题:edits文件和fsimage文件,哪个文件提现了HDFS最新的状态?  edits文件

2、DataNode:保存数据块

  1. 1.x  64M    2.x  128M
  2. 位置:find . -name blk*
  3. Demo:上传一个大于128M的文件 hdfs dfs -put hadoop-2.7.3.tar.gz /tools   查看数据块的文件
  4. 一般原则:数据块的冗余度一般跟数据节点个数一致,最大不要超过3   在生产环境下,至少两个数据节点

3、SecondaryNameNode:第二名称节点

  1. 作用:把edits中最新的状态信息合并到fsimage文件中,以减少namenode日志文件大小
  2. 合并过程: SecondaryNameNode从nameNOdef复制日志与映像文件,将日志合并到映像文件上,并将最新映像文件回传给namenode,这个过程发生在HDFS发出检查点的时候
  3. Web Console:http://192.168.157.111:50090
  4. 检查点:checkpoint

              1默认每60分钟        fs.check.period    配置可修改时间
              2当edits文件到达64M  fs.check.size      配置修改大小

二、HDFS的操作

  • 1、通过Web Console: 50070、50090
  • 2、命令行
    1 操作命令  hdfs dfs *****
    	-mkdir  创建目录
                举例:hdfs dfs -mkdir /aaa
    			  hdfs dfs -mkdir -p /bbb/ccc
    			  -p 表示如果父目录不存在 先创建父目录
    	-ls      查看某个目录
    	-ls -R   查看某个目录,包含子目录
    			 简写: -lsr
    	-put             上传数据  hdfs dfs -put data.txt /input
    	-copyFromLocal   上传数据  hdfs dfs -copyFromLocal data.txt /input
    	-moveFromLocal   上传数据(相当于 ctrl+x 剪切)
    	
    	-copyToLocal     下载数据
    	-get             下载数据
    			
    	-rm    删除目录
    	-rmr   删除目录(包含子目录)
    	hdfs dfs -rmr /tools
    		rmr: DEPRECATED: Please use 'rm -r' instead.
    		
    		日志:
    		18/04/09 21:35:40 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
    		Deleted /tools ---> 成功删除(对比:回收站)
    
    	-getmerge: 把某个目录下的文件先合并,再下载(提高效率)
    				[root@bigdata111 temp]# vi student01.txt
    				[root@bigdata111 temp]# vi student02.txt
    				[root@bigdata111 temp]# hdfs dfs -mkdir /students
    				[root@bigdata111 temp]# hdfs dfs -put student0*.txt /students
    				[root@bigdata111 temp]# hdfs dfs -ls /students
    				[root@bigdata111 temp]# hdfs dfs -getmerge /students 
        ~/temp/allstudent.txt			
    	
    	-cp:  hdfs dfs -cp /input/data.txt /input/data2.txt
    	-mv:  hdfs dfs -cp /input/data.txt /students
    	
    	-count: hdfs dfs -count /students
    					hdfs dfs -count /students
    				   1            2                 29       /students			
    				  目录个数,  文件个数,   文件总计大小	  输入路径
    				  
    	-du 每个文件的大小
    		[root@bigdata111 temp]# hdfs dfs -du /students
    		19  /students/student01.txt
    		10  /students/student02.txt
    			
    	-text、-cat  查看文件的内容
    		   hdfs dfs -cat /students/student01.txt
    			
    	balancer: 平衡操作	
    
    (2)管理命令  hdfs dfsadmin *****
    		-report: 输出HDFS的报告(Summary)
    		-safemode: 安全模式
    			[root@bigdata111 temp]# hdfs dfsadmin -safemode
    			Usage: hdfs dfsadmin [-safemode enter | leave | get | wait]
    			[root@bigdata111 temp]# hdfs dfsadmin -safemode get
    			Safe mode is OFF
    			[root@bigdata111 temp]# hdfs dfsadmin -safemode enter
    			Safe mode is ON
    			[root@bigdata111 temp]# hdfs dfs -mkdir /aaaa
    			mkdir: Cannot create directory /aaaa. Name node is in safe mode.
    			[root@bigdata111 temp]# hdfs dfsadmin -safemode leave
    			Safe mode is OFF
  • 3、Java程序 
/**
 *  注意:1.需要配置hadoop环境变量
 * 	2.需要编译好的winutil包导入hadoop安装目录下的bin
 *  类似代码设置System.setProperty("HADOOP_USER_NAME", "root");
 */
public class HdfsClientDemo01 {
	public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException {
		//1.加载配置
		Configuration conf = new Configuration();
		//2.设置副本数
		conf.set("dfs.replication", "2");
		//3.设置块大小
		conf.set("dfs.blocksize", "64m");
		//4.构造客户端
		FileSystem fs = FileSystem.get(new URI("hdfs://192.168.50.183:9000/"), conf, "root");
		//5.hdfs数据下载到windows本地
		fs.copyToLocalFile(new Path("/hdfs-site.xml"), new Path("c:/"));
		//上传文件
		//fs.copyFromLocalFile(new Path("c:/words.txt"), new Path("/words222111.txt"));
		//6.关闭资源
		fs.close();
	}
}

public class HdfsIo {

	Configuration conf = null;
	FileSystem fs = null;
	
	@Before
	public void init() throws IOException, InterruptedException, URISyntaxException {
		
		conf = new Configuration();
		
		fs = FileSystem.get(new URI("hdfs://192.168.50.183:9000/"), conf, "root");
	}

	/*
	 * 文件上传HDFS
	 * 
	 */
	@Test
	public void putFileToHDFS() throws IllegalArgumentException, IOException {
		//1.获取输入流
		FileInputStream fis = new FileInputStream(new File("c:/2017级个人详细信息表.txt"));
		
		//2.获取输出流
		FSDataOutputStream fos = fs.create(new Path("/2017级个人详细信息表.txt"));
		
		//3.流的拷贝
		IOUtils.copyBytes(fis, fos, conf);
		
		//4.关闭资源
		IOUtils.closeStream(fis);
		IOUtils.closeStream(fos);
		
	}
	
	/*
	 * 文件下载HDFS
	 */
	@Test
	public void getFileFromHDFS() throws IllegalArgumentException, IOException {
		//1.获取输入流
		FSDataInputStream fis = fs.open(new Path("/hunterhenshuai"));
		
		//2.获取输出流
		FileOutputStream fos = new FileOutputStream(new File("c:/hunterhenshuai"));
		
		//3.流的对拷
		IOUtils.copyBytes(fis, fos, conf);
		
		//4.关闭资源
		IOUtils.closeStream(fis);
		IOUtils.closeStream(fos);
	}
}
  •  

三、HDFS上传下载原理解析

NameNode缓存元信息,默认:1000M

 

四、HDFS的高级功能

回收站

HDFS的回收站:默认禁用

参数配置: core-site.xml 
 单位:分钟 

<property>
  <name>fs.trash.interval</name>
  <value>1440</value>
</property>

删除文件时日志对比:

没有回收站
    18/04/09 21:35:40 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
    Deleted /tools ---> 成功删除(对比:回收站)            

回收站
    Moved: 'hdfs://bigdata111:9000/tools/a.zip' to trash at: hdfs://bigdata111:9000/user/root/.Trash/Current

HDFS回收站的本质:ctrl +x 移动到一个隐藏目录
查看回收站
       hdfs dfs -lsr /user/root/.Trash/Current

从回收站中恢复
       hdfs dfs -cp /user/root/.Trash/Current/tools/a.zip /tools
[-expunge] 清空回收站

快照:snapshot(是一种备份)

本质:cp命令  默认禁用

管理命令
[-allowSnapshot <snapshotDir>]
[-disallowSnapshot <snapshotDir>]
操作命令
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
针对目录开启快照:hdfs dfsadmin -allowSnapshot /students
创建一个备份 :hdfs dfs -createSnapshot /students backup_student_0411_01 
              hdfs dfs -put student03.txt /students
              hdfs dfs -createSnapshot /students backup_student_0411_02
对比快照 :hdfs snapshotDiff /students backup_student_0411_01 backup_student_0411_02
恢复快照: hdfs dfs -cp /input/.snapshot/backup_input_01/data.txt /input

配额(quota)

  • 名称配额: 限制某个目录下,文件的个数
[-setQuota <quota> <dirname>...<dirname>]
[-clrQuota <dirname>...<dirname>]	

hdfs dfs -mkdir /folder1
hdfs dfsadmin -setQuota 3 /folder1
实际是:N-1
  • 空间配额: 限制某个目录下,文件的大小

注意:如果hdfs文件系统中的文件个数或者大小超过了配额限制,会出现错误。

[-setSpaceQuota <quota> [-storageType <storagetype>] <dirname>...<dirname>]
[-clrSpaceQuota [-storageType <storagetype>] <dirname>...<dirname>]		

hdfs dfs -mkdir /folder2

设置空间配额:1M
hdfs dfsadmin -setSpaceQuota 1M /folder2

错误:
The DiskSpace quota of /folder2 is exceeded: quota = 1048576 B = 1 MB but diskspace consumed = 134217728 B = 128 MB

注意:设置的值一定不能小于128M

安全模式:safemode

安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。如果HDFS处于安全模式,则表示HDFS是只读状态。

  1. 当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。假设我们设置的副本数(即参数dfs.replication)是5,那么在datanode上就应该有5个副本存在,假设只存在3个副本,那么比例就是3/5=0.6。在配置文件hdfs-default.xml(dfs.namenode.threshold-pct)中定义了一个最小的副本的副本率0.999。我们的副本率0.6明显小于0.99,因此系统会自动的复制副本到其他的dataNode,使得副本率不小于0.999.如果系统中有8个副本,超过我们设定的5个副本,那么系统也会删除多余的3个副本。
  2. 在命令行下是可以控制安全模式的进入、退出和查看的。
命令 hdfs dfsadmin -safemode get 查看安全模式状态
命令 hdfs dfsadmin -safemode enter  进入安全模式状态
命令 hdfs dfsadmin -safemode leave 离开安全模式

HDFS的集群

HDFS的HA

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值