一、HDFS简介
1.HDFS(Hadoop Distributed File System)是 Apache Hadoop 项目的一个子项目,它的设计初衷是为了能够支持高吞吐和超大文件读写操作
2.HDFS是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据集的应用程序,它非常适于存储大型数据 (比如 TB 和 PB)
3.HDFS使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统
二、HDFS优缺点
优点:
1.存储非常大的文件:这里非常大指的是几百M、G、或者TB级别,需要高吞吐量,对延时没有要求。
2.基于流的数据访问方式: 即一次写入、多次读取,数据集经常从数据源生成或者拷贝一次,然后在其上做很多分析工作 ,且不支持文件的随机修改。
3.HDFS适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高。
4.运行于商业硬件上: Hadoop不需要特别贵的机器,可运行于普通廉价机器,可以节约成本。
5.高容错性和拓展性
缺点:
1.低延时访问,不适用于低延时要求的应用。
2.不适合存储大量小文件,因为元数据文件保存在NameNode的内存中,文件数量受限于NN内存大小。
3.不适合多方读写,需要任意的文件修改 HDFS采用追加(append-only)的方式写入数据。不支持文件任意offset的修改,文件修改麻烦,HDFS适合用来做大数据分析的底层存储服务。
三、HDFS的重要特性
1.主从架构
HDFS采用master/slave架构。一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
2.分块机制
HDFS中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定,参数位于hdfs-default.xml中:dfs.blocksize。默认大小是128M(134217728)。
3.副本机制
为了容错,文件的所有block都会有副本。每个文件的block大小(dfs.blocksize)和副本系数(dfs.replication)都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变。
默认dfs.replication的值是3,也就是会额外再复制2份,连同本身总共3份副本。
4.Namespace
HDFS支持传统的层次型文件组织结构。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode负责维护文件系统的namespace名称空间,任何对文件系统名称空间或属性的修改都将被Namenode记录下来。
HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
5.元数据管理
在HDFS中,Namenode管理的元数据具有两种类型:
文件自身属性信息:
文件名称、权限,修改时间,文件大小,复制因子,数据块大小。
文件块位置映射信息:
记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上。
6.数据块存储
文件的各个block的具体存储管理由DataNode节点承担。每一个block都可以在多个DataNode上存储。
四、HDFS常用shell命令
格式: hdfs [SHELL_OPTIONS] COMMAND [GENERIC_OPTIONS] [COMMAND_OPTIONS]
COMMAND_OPTIONS | Description |
SHELL_OPTIONS | 常见的shell选项,例如:操作文件系统、管理hdfs集群.. |
GENERIC_OPTIONS | 多个命令支持的公共选项 |
COMMAND COMMAND_OPTIONS |
1.创建目录
hdfs dfs [-p] -mkdir <paths>
以<paths>中的URI作为参数,创建目录。使用-p参数可以递归创建目录
2.查看目录
hdfs dfs -ls URI
类似于Linux的ls命令,显示文件列表
3.上传文件
hdfs dfs -put <localsrc > ... <dst>
-put参数可以将单个的源文件src或者多个源文件src从本地文件系统拷贝到目标文件系统中(<dst>对应的路径)。也可以从标准输入中读取输入,写入目标文件系统中。
4.删除文件
hdfs dfs -rm [-r] [-skipTrash] URI [URI…]
删除参数指定的文件和目录,参数可以有多个,删除目录需要加-r参数如果指定-skipTrash选项,那么在回收站可用的情况下,该选项将跳过回收站而直接删除文件;否则,在回收站可用时,在HDFS Shell 中执行此命令,会将文件暂时放到回收站中。
5.剪切文件/移动文件
hdfs dfs -moveFromLocal <localsrc> <dst>
和put参数类似,但是源文件localsrc拷贝之后自身被删除
6.下载文件
hdfs dfs -get [-ignorecrc ] [-crc] <src> <localdst>
将文件拷贝到本地文件系统,可以通过指定-ignorecrc选项拷贝CRC校验失败的文件。-crc选项表示获取文件以及CRC校验文件。
7.查看HDFS上文件的内容
hdfs dfs -cat URI [uri ...] --->全部查看
hdfs dfs -head URI --->查看文件开头1kb数据
hdfs dfs -tail [-f] URI --->动态查看文件结尾1kb数据
8.拷贝文件
hdfs dfs -cp URI [URI ...] <dest>
将文件拷贝到目标路径中。如果<dest> 为目录的话,可以将多个文件拷贝到该目录下。
-f 选项将覆盖目标,如果它已经存在
-p 选项将保留文件属性(时间戳、所有权、许可、ACL、XAttr)
9.追加数据到文件内
hdfs dfs -appendToFile <localsrc> ... <dst>
追加一个或者多个文件到hdfs指定文件中.也可以从命令行读取输入。
10.查看磁盘情况
hdfs dfs -df [-h] URI [URI ...]
11.查看文件情况
hdfs dfs -du [-s] [-h] [-v] [-x] URI [URI ...]
-s:表示显示文件长度的汇总摘要,而不是单个文件的摘要。
-h:选项将以“人类可读”的方式格式化文件大小
-v:选项将列名显示为标题行。
-x:选项将从结果计算中排除快照。
12.系统内文件移动
hdfs dfs -mv URL <dest>
将hdfs上的文件从原路径移动到目标路径(移动之后文件删除),该命令不能跨文件系统。
13.设置副本数
hdfs dfs -setrep [-R] [-w] <numReplicas> <path>
更改文件的副本因子。 如果path是目录,则该命令以递归方式更改以path为根的目录树下所有文件的复制因子。
-w:标志请求命令等待复制完成。 这可能会花费很长时间。
-R:标志是为了向后兼容。 没有作用。
14.更多
命令 | 说明 |
checksum | 返回文件的校验和信息。 |
hdfs dfs -checksum | |
copyFromLocal | 与put命令类似,将本地文件拷贝到HDFS。但put命令可以传多个文件、或者是标准输入(-) |
hdfs dfs -copyFromLocal <localsrc> <dst> | |
copyToLocal | 与get命令类似,但只拷贝到一个本地文件 |
hdfs dfs -copyToLocal <dst> | |
count | 计算与指定文件模式匹配的路径下的目录,文件和字节数。 获取配额和使用情况。 具有-count的输出列是:DIR_COUNT,FILE_COUNT,CONTENT_SIZE,PATHNAME |
hdfs dfs -count -q -v -h <path> | |
find | 查找与指定表达式匹配的所有文件,并对它们应用选定的操作。 如果未指定路径,则默认为当前工作目录。 如果未指定表达式,则默认为-print。 |
hdfs dfs -find / -name <regex> -print | |
getfattr | 显示文件或目录的扩展属性名称和值。 |
setfattr | 设置文件或目录的扩展属性名称和值。 |
getmerge | 下载多个HDFS上的文件并合并为1个文件 |
stat | 以指定格式打印有关<path>上文件/目录的统计信息。 hdfs dfs -stat "type:%F perm:%a %u:%g size:%b mtime:%y atime:%x name:%n" / |
test | 测试,判断是否存在、是否是文件夹、是否是文件、是有有读权限、写权限等 |
text | 获取源文件并以文本格式输出文件。 允许的格式是zip和TextRecordInputStream。 |
touch | 在HDFS上创建一个新的文件,并可以指定访问时间、修改时间、 |
touchz | 创建一个空文件。 如果文件存在,则返回错误。 |
truncate | 将与指定文件截断为指定长度。 hdfs dfs -truncate -w <length> <path.file> |
usage | 返回某个命令的帮助 hdfs dfs -usage rm |