HDFS:分布式文件系统

HDFS在整个Hadoop生态圈中的作用:
在这里插入图片描述
1、HDFS分布式文件系统,位于整个Hadoop的最底层,也是大数据的核心。
2、Hbase是在HDfs基础之上的框架,是列式存储,支持NOSQL语句。在这里可以把HDFS看做计算机一块大硬盘,HBASE是不是很像Redis。
3、Yarn可以和HBASE进行集成,也可以与HDFS进行集成,本质就是一个“发动机”,进行数据的处理计算。
4、Hive与pig数据分析引擎,与Yarn进行集成,底层处理数据采用的是MapReduce。
5、sqoop与flume 数据采集引擎。
6、HUE把所有的组件尽心网页集成
7、zookeeper实现高可用

一、操作HDFS

(1)WebConsole(图形工具):端口9870

(2)命令行

(第一类)管理命令 hdfs dfsadmin ****
(第二类)操作命令 hdfs dfs *****

1、操作命令

-mkdir	创建目录
		可选的参数 -p 如果父目录不存在,先创建父目录
		hdfs dfs -mkdir -p /a1/b1/c1
				
-ls		查看目录
-ls -R  查看目录,包括子目录
		简写: -lsr
		hdfs dfs -lsr /
				
-put				上传数据
-copyFromLocal		上传数据
-moveFromLocal		上传数据,并且删除本地文件(Ctrl+X)
			
-copyToLocal	下载数据
-get			下载
				
-rm		删除一个空目录
-rmr	删除目录,包括子目录和文件
	hdfs dfs -rmr /a1
			
-getmerge 先把目录下的文件合并,再下载
	[root@bigdata111 ~]# vi student01.txt
	[root@bigdata111 ~]# vi student02.txt 
	[root@bigdata111 ~]# hdfs dfs -mkdir /students
	[root@bigdata111 ~]# hdfs dfs -put student0* /students
	[root@bigdata111 ~]# hdfs dfs -ls /students
	Found 2 items
	-rw-r--r--   1 root supergroup         19 2020-08-17 21:30 /students/student01.txt
	-rw-r--r--   1 root supergroup         10 2020-08-17 21:30 /students/student02.txt
	[root@bigdata111 ~]# hdfs dfs -getmerge /students ./allstudent.txt
	[root@bigdata111 ~]# ls allstudent.txt 
	allstudent.txt
	[root@bigdata111 ~]# more allstudent.txt 
	1,Tom,23
	2,Mary,24
	3,Mike,24
	[root@bigdata111 ~]# 
				
-cp  拷贝
	hdfs dfs -cp /input/data.txt /input/a1.txt
						
-mv 移动(重命名)
    hdfs dfs -mv /input/data.txt /input/b.txt
							
-count 统计个数
	hdfs dfs -count /students
	[root@bigdata111 ~]# hdfs dfs -count /students
			   1            2                 29 		/students
			              文件的个数		总的字节大小
		
-du 类似count,但更详细
	hdfs dfs -du /students
	
-text、-cat  查看文件的内容
		
balancer	平衡操作
	hdfs balancer

(3)Java 程序

依赖的jar包:


$HADOOP_HOME/share/hadoop/common/*.jar
$HADOOP_HOME/share/hadoop/common/lib/*.jar
$HADOOP_HOME/share/hadoop/hdfs/*.jar
$HADOOP_HOME/share/hadoop/hdfs/lib/*.jar
				

将上面的jar包全部拷贝到自己建立的lib包下面

1、创建目录

public class TestMkdir {

    @Test
    public void test1() throws  Exception{
    	//更改权限,假装是root用户进行穿件
        System.setProperty("HADOOP_USER_NAME","root");
        //指定NameNode的地址
        Configuration conf= new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.92.111:9000");
        //创建客户端
        FileSystem client = FileSystem.get(conf);
        client.mkdirs(new Path("/folder3"));

        client.close();


    }
}

2、上传数据

public  void test() throws  Exception{
        System.setProperty("HADOOP_USER_NAME","root");

        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://192.168.92.111:9000");
        //获取代理对象,穿件客户端
        FileSystem client = FileSystem.get(conf);
        //将数据读入内存
        InputStream input = new FileInputStream("C:\\Users\\HP\\Desktop\\test.txt");
        //提交上传数据请求,并获得将要存储节点的原信息
        OutputStream ouput = client.create(new Path("/input/test.txt"));
        //写数据
        byte[] buffer = new byte[1024];
        int len =0;
        while((len = input.read(buffer)) > 0){ //len的是buffer的长度
            ouput.write(buffer,0,len);//0表示buffer数组的偏移量
        }
        ouput.flush();//冲水
        ouput.close();
        input.close();
        client.close();

    }

简写:

@Test
	public void test2() throws Exception{
		//指定NameNode的地址
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://bigdata111:9000");
		
		//创建一个HDFS的客户端
		FileSystem client = FileSystem.get(conf);
		
		//构造一个输入流,代表上传的数据
		InputStream input = new FileInputStream("d:\\download\\hadoop-2.7.3.tar.gz");
		
		//创建一个输出流指向HDFS
		OutputStream output = client.create(new Path("/tools/b.tar.gz"));
		
		//使用工具类简化代码
		IOUtils.copyBytes(input, output, 1024);
		
		client.close();
	}

3、下载数据

@Test
	public void test1() throws Exception{
		//指定NameNode的地址
		Configuration conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://bigdata111:9000");
		
		//创建一个HDFS的客户端
		FileSystem client = FileSystem.get(conf);
		
		//得到一个输入流,代表HDFS要下载的数据
		InputStream input = client.open(new Path("/tools/a.tar.gz"));
		
		//输出流指向本地
		OutputStream output = new FileOutputStream("d:\\download\\xyz.tar.gz");

//		byte[] buffer = new byte[1024];
//		int len = 0;
//		while((len=input.read(buffer)) > 0  ) {
//			//有数据
//			output.write(buffer, 0, len);
//		}
//		
//		output.flush();
//		output.close();
//		input.close();

		//使用工具类简化代码
		IOUtils.copyBytes(input, output, 1024);
				
		client.close();
	}

问题一
在这里插入图片描述
可以不用管,或者在Windows本地安装Hadoop,并且配置其环境变量。

二、HDFS的原理

(1)HDFS数据上传的过程

在这里插入图片描述
关键在过程3,建立RPC通信,并获得代理对象。
其过程可以参照代码进行理解。

(2)HDFS数据下载的过程

在这里插入图片描述

三、高级特性:

(1)回收站

默认情况下,HDFS回收站功能是关闭的。需要我们进行开启。
配置core-site.xml

<!--以分钟为单位的垃圾回收时间,垃圾站中数据超过此时间,会被删除。-->
<!--一天为1440,三天未4320-->
<property>
	<name>fs.trash.interval</name>
	<value>1440</value> 
</property>			
		

没有回收站:

日志:Deleted /folder1

开启回收站:

日志Moved: 'hdfs://bigdata111:9000/tools/a.tar.gz' to trash at: hdfs://bigdata111:9000/user/root/.Trash/Current/tools/a.tar.gz

从上可以看出回收站的本质就是一个剪切操作!

恢复操作:

hdfs dfs -mv /user/root/.Trash/Current/tools/a.tar.gz /tools

清空回收站:

hdfs dfs -expunge

(2)快照Snapshot

针对HDFS的目录
注意:一般不建议使用HDFS的快照

使用管理员命令开启某个目录快照:

-allowSnapshot
-disallowSnapshot

Demo开启input目录:

hdfs dfsadmin -allowSnapshot /input   

使用操作命令来创建快照

[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]

Demo例子:

hdfs dfs -createSnapshot /input bk_input_20200819_01
日志:Created snapshot /input/.snapshot/bk_input_20200819_01

注意命名要规范

HDFS快照本质:把要备份的数据拷贝一份

(3)配额Quota

Quota表示对某种资源的限制,用的是管理命令

1、名称配额

规定某个HDFS目录下最多能存储文件/目录个数(N-1个)。

[-setQuota <quota> <dirname>...<dirname>]
[-clrQuota <dirname>...<dirname>]

Demo例子:

hdfs dfs -mkdir /test1
hdfs dfsadmin -setQuota 3 /test1

2、空间配额

规定某个HDFS的目录最大能够存储都大的文件
注意:空间配额的大小不能小于数据块的大小,必须大于128M

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

Demo例子:

hdfs dfs -mkdir /test2
hdfs dfsadmin -setSpaceQuota 2M /test2

(4)权限(类似Linux)

(5)安全模式:HDFS是只读

HDFS的一种保护机制,保证数据块的完整性。
在安全模式下,数据是只读的,不能写入。
为什么启动HDFS的时候,最后会进入安全模式?
当启动HDFS的时候,最后,hdfs会检查每个数据块的冗余度是否完整,假如不完整,hdfs会自动的进行水平的复制。在这个时间段,数据是只读的。

四、HDFS的联盟:Federation:解决水平扩展问题

解决问题:NameNode接受客户端的大量的请求的时候,一台NameNode可能承受不住
集群的两大功能:
1、负载均衡load balance:HDFS的联盟
2、失败迁移fail over:HDFS的HA
在这里插入图片描述
其实质就是在NameNode架构之上加一个路由规则(viewFS),访问不同的目录,让其在不同的NameNode上进行处理,并且,每个NameNode维护各自的信息。

部署如下:

1、部署HDFS的联盟:

准备工作:JDK、主机名、防火墙、免密码登录、环境变量
上传jar包并解压,并在bigdata112进行配置

2、hadoop-env.sh

第54行

export JAVA_HOME=/usr/local/java/jdk1.8.0_251

3、core-site.xml

<property>
	<name>hadoop.tmp.dir</name>
	<value>/usr/local/hadoop/hadoop-3.1.2/tmp</value>
</property>

4、hdfs-site.xml

<property>
	<name>dfs.nameservices</name>
	<value>ns1,ns2</value>
</property>

<property>
	<name>dfs.namenode.rpc-address.ns1</name>
	<value>192.168.92.112:9000</value>
</property>

<property>
	<name>dfs.namenode.http-address.ns1</name>
	<value>192.168.92.112:50070</value>
</property>

<property>
	<name>dfs.namenode.secondaryhttp-address.ns1</name>
	<value>192.168.92.112:50090</value>
</property>				

<property>
	<name>dfs.namenode.rpc-address.ns2</name>
	<value>192.168.92.113:9000</value>
</property>

<property>
	<name>dfs.namenode.http-address.ns2</name>
	<value>192.168.92.113:50070</value>
</property>

<property>
	<name>dfs.namenode.secondaryhttp-address.ns2</name>
	<value>192.168.92.113:50090</value>
</property>	
	
<property>
	<name>dfs.replication</name>
	<value>2</value>
</property>	

<property>
	<name>dfs.permissions</name>
	<value>false</value>
</property>	

5、mapred-site.xml

<property>
	<name>mapreduce.framework.name</name>
	<value>yarn</value>
</property>

6、yarn-site.xml

<property>
	<name>yarn.resourcemanager.hostname</name>
	<value>192.168.92.112</value>
</property>	
	
<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>	

7、workers

192.168.92.115
192.168.92.114

8、配置viewFS,修改core-site.xml文件,直接加入以下内容:

注意:如果以后的路由规则太多了,可以单独写一个XML文件
下面的xdl1是名字,可以任意

<property>
	<name>fs.viewfs.mounttable.xdl1.homedir</name>
	<value>/home</value>
</property>

<property>
	<name>fs.viewfs.mounttable.xdl1.link./movie</name>
	<value>hdfs://192.168.92.112:9000/movie</value>
</property>

<property>
	<name>fs.viewfs.mounttable.xdl1.link./mp3</name>
	<value>hdfs://192.168.92.113:9000/mp3</value>
</property>

<property>
	<name>fs.default.name</name>
	<value>viewfs://xdl1</value>
</property>

9、把配置好的目录复制到其他节点

scp -r hadoop-3.1.2/ root@bigdata333:/usr/local/hadoop
scp -r hadoop-3.1.2/ root@bigdata444:/usr/local/hadoop
scp -r hadoop-3.1.2/ root@bigdata555:/usr/local/hadoop

10、在每个NameNode(112和113)上格式化:

hdfs namenode -format -clusterId xdl1

11、创建对应的目录:

hadoop fs -mkdir hdfs://192.168.92.112:9000/movie
hadoop fs -mkdir hdfs://192.168.92.113:9000/mp3

总结:直接hdfs dfs -ls /
日志打印出来的是viewFs 路由目录
从每个NameNode的网页信息可以看出,每个NameNode维护的信息不同。

五、HDFS的底层通信原理

(1)Java的代理对象:代理设计模式
https://blog.csdn.net/qq_45335413/article/details/108300191
(2)协议RPC:remote proceducer call 远程过程调用
https://blog.csdn.net/qq_45335413/article/details/108308445

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值