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