Hadoop分布式文件系统
简介
HDFS(Hadoop distribute file system) 是Hadoop核心组成,是分布式存储服务
分布式文件系统能够横跨多态计算机。在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的扩展能力。
HDFS是分布式文件系统的一种
概念
HDFS通过统一的命名空间目录树来定位文件
通过多态服务器联合实现其功能,集群中的服务器有各自的角色(分布式的本质是拆分,各司其职)
典型的 Master/Slave 【主从】架构
HDFS 集群往往是一个NameNode + 多个 DataNode 组成
NameNode是集群的主节点,DataNode是集群的从节点
HA架构有两个NameNode,联邦机制
分快存储(block机制)
HDFS中的文件在物理上是分块存储的,块的大小可以通过配置参数来确定
Hadoop 2.X 版本中默认的block是:128M
命名空间
HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,将文件保存在这些目录中。
文件系统名字空间的层次结构和大多数文件系统类似:可以创建、删除、移动、重命名文件等
NameNode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被NameNode记录
HDFS提供一个抽象目录树,访问形式hdfs://namenode主机名:port文件路径
如:hdfs://linux121:9000/test/inpu
NameNode 元数据管理
将目录结构及文件分块位置信息称为元数据
NameNode的元数据记录每一个文件所对应的block信息(block id、所在DataNode节点的信息)
DataNode 数据存储
文件的各个block的具体存储管理由DataNode节点承担;一个block会有多个DataNode来存储
DataNode会定时向NameNode来汇报自己持有的block信息
副本机制
出于容错考虑,文件的所有block均会有副本。每个文件的block大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数量。
副本数可以在文件创建的时候指定,也可以在之后改变。
副本数默认为:3
副本的数量超过 DataNode 节点数量时,以 DataNode 数量为上限
一次写入,多次读出
HDFS 设计时按照一次写入,多次读出的场景 进行设计的。
不支持文件的随机修改(更新),支持追加写入
HDFS适合用来做大数据分析的底层存储服务,但不适合用做网盘等应用。主要原因有:修改不方便、延迟大、网络开销大、成本高
架构
NameNode(nn):HDFS集群的管理者,Master 维护并且管理HDFS的名称空间维护副本策略记录文件块信息的映射信息负责客户端读写请求 DataNode(dn):执行实际操作,Slave 保存实际的数据块负责数据的读写 Client:客户端 上传文件时负责进行文件的切分(block),然后进行上传与 NameNode 交互,获取文件的位置信息读取或者写入的时候,与DataNode交互进行读写使用一些命令来管理、访问HDFSshell命令操作HDFS
基本语法
方式一:bin/hadoop fs 具体命令
方式二:bin/hadoop dfs 具体命令
查看全部命令
bin/hdfs dfs
HDFS的操作命令大多数等同于Linux下的操作,只不过需要在命令前添加-
查看命令参数
-help
:输出这个命令的参数hadoop fs -help 命令
如:hadoop fs -help rm
1. 显示目录信息-ls
[root@linux121 testfile]# hadoop fs -ls /Found 4 itemsdrwxr-xr-x - root supergroup0 -08-02 16:15 /testdrwx------ - root supergroup0 -08-01 23:24 /tmp-rw-r--r-- 3 root supergroup 77 -08-01 23:23 /wcinputdrwxr-xr-x - root supergroup0 -08-01 23:24 /wcoutput
可添加的参数如下图:
通过web进行查看 url:http://linux:50070/explorer.html#/ly/test
主机名称要根据自己设置的主机ip地址
2. 在HDFS上创建目录-mkdir
[root@linux121 ~]# hadoop fs -mkdir -p /ly/test[root@linux121 ~]# hadoop fs -ls /Found 5 itemsdrwxr-xr-x - root supergroup0 -08-02 11:43 /lydrwxr-xr-x - root supergroup0 -08-01 23:18 /testdrwx------ - root supergroup0 -08-01 23:24 /tmp-rw-r--r-- 3 root supergroup 77 -08-01 23:23 /wcinputdrwxr-xr-x - root supergroup0 -08-01 23:24 /wcoutput
3.复制文件
从本地移动到HDFS:hadoop fs -moveFromLocal 移动的文件名 移动到HDFS中的目录
# 本地创建文件[root@linux121 testfile]# vim hadoop.txt# 移动到HDFS中[root@linux121 testfile]# hadoop fs -moveFromLocal hadoop.txt /ly/test
将本地文件复制到HDFS中-put
【推荐】-copyFromLocal
# 创建文件并添加内容[root@linux121 testfile]# vim copyfile.txt[root@linux121 testfile]# lscopyfile.txt hadoop.txt# 使用 -put 命令[root@linux121 testfile]# hadoop fs -put copyfile.txt /ly/test# 使用 -copyFromLocal[root@linux121 testfile]# hadoop fs -copyFromLocal copyfile.txt /ly/test
从HDFS中复制文件到本地-get
【推荐】-copyToLocal
# 删除本地文件[root@linux121 testfile]# rm -f copyfile.txt[root@linux121 testfile]# lshadoop.txt# 使用 -get[root@linux121 testfile]# hadoop fs -get /ly/test/copyfile.txt ./# 使用 -copyToLocal[root@linux121 testfile]# hadoop fs -copyToLocal /ly/test/copyfile.txt ./[root@linux121 testfile]# lscopyfile.txt hadoop.txt
从HDFS的一个路径拷贝到HDFS的另一个路径-cp
# 将 /ly/test/目录下的hadoop.txt 移动到根目录下[root@linux121 testfile]# hadoop fs -cp /ly/test/hadoop.txt /
4. 删除文件-rm
-rmdir
# 删除移动到根目录下的 hadoop.txt 文件[root@linux121 testfile]# hadoop fs -rm /hadoop.txtDeleted /hadoop.txt# 删除空的目录[root@linux121 testfile]# hadoop fs -mkdir /delete[root@linux121 testfile]# hadoop fs -rmdir /delete
5. 移动文件-mv
# 查看目录下文件信息[root@linux121 testfile]# hadoop fs -ls /testFound 1 itemsdrwxr-xr-x - root supergroup0 -08-01 23:19 /test/input[root@linux121 testfile]# hadoop fs -ls /ly/testFound 2 items-rw-r--r-- 3 root supergroup 22 -08-02 15:54 /ly/test/copyfile.txt-rw-rw-rw- 3 root root99 -08-02 15:25 /ly/test/hadoop.txt# 将 /ly/test 目录下的 hadoop.txt 文件移动到 /test目录下[root@linux121 testfile]# hadoop fs -mv /ly/test/hadoop.txt /test[root@linux121 testfile]# hadoop fs -ls /testFound 2 items-rw-rw-rw- 3 root root99 -08-02 15:25 /test/hadoop.txtdrwxr-xr-x - root supergroup0 -08-01 23:19 /test/input
6. 文件末尾追加内容
# 创建文件,并添加需要的追加的内容[root@linux121 testfile]# vim hadoopappend.txt[root@linux121 testfile]# hadoop fs -appendToFile hadoopappend.txt /ly/test/hadoop.txt
7. 查看内容-cat
-tail
# 显示文件的末尾[root@linux121 testfile]# hadoop fs -tail /test/hadoop.txthellohadoopmovefiletest这是想要追加的内容的开始这是想要追加内容的结尾
8. 修改文件的权限
# 文件权限 chmod[root@linux121 testfile]# hadoop fs -chmod 666 /ly/test/hadoop.txt# 文件用户 chown[root@linux121 testfile]# hadoop fs -chown root /ly/test/hadoop.txt# 文件用户组 chgrp[root@linux121 testfile]# hadoop fs -chgrp root /ly/test/hadoop.txt# 查看修改后的文件属性[root@linux121 testfile]# hadoop fs -ls -h /ly/test/Found 1 items-rw-rw-rw- 3 root root 99 -08-02 15:25 /ly/test/hadoop.txt
9. 统计文件信息-du
# 统计文件夹的总大小[root@linux121 testfile]# hadoop fs -du -s -h /test130 /test# 显示文件、文件夹的大小[root@linux121 testfile]# hadoop fs -du -h /test99 /test/hadoop.txt31 /test/input
10.设置副本数量-setrep
[root@linux121 testfile]# hadoop fs -setrep 5 /test/hadoop.txtReplication 5 set: /test/hadoop.txt
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iXRhG26P-1627894430116)(Hadoop分布式文件系统.assets/image-0802163708163.png)]
这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的
数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。
本数量-setrep
[root@linux121 testfile]# hadoop fs -setrep 5 /test/hadoop.txtReplication 5 set: /test/hadoop.txt
这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的
数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。