本文通过学习尚硅谷视频(https://www.bilibili.com/video/BV1F5411e79W?p=48)整理学习笔记所得。
HDFS概述
- 产生背景:随着数据量越来越大,一个操作系统存不下所有数据,因此分配到更多的操作系统中,由于数据分开存放,因此不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。
- 定义:HDFS(Hadoop Distributed File System)是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
- 使用场景:**适合一次写入,多次读出的场景,且不支持文件的修改。**适合用来做数据分析,并不适合用来做网盘应用。
- 优点:
高容错性:数据自动保存多个副本。通过增加多个副本的形式,可以提高容错性;某一个副本丢失后,可以自动恢复,保持设定的副本数量。
适合处理大数据:数据规模,处理的数据规模能够达到GB、TB、甚至PB。文件规模,能够处理百万规模以上的文件数量,数量相当之大。
可以构建在廉价机器上,通过多副本机制,提高可靠性。 - 缺点:
不适合低延时数据访问,比如毫秒级别的存储数据,无法做到。
无法高效的对大量小文件进行存储:存储大量小文件会占用NameNode大量的内存来存储文件目录和块信息;小文件存储的寻址时间超过读取时间,违反了HDFS的设计目标。
不支持并发写入:一个文件只能有一个写,不允许多个线程同时写。
不支持文件随机修改:仅支持数据的追加(append),不支持文件的随机修改。
HDFS组成架构
- NameNode:就是Master,是一个主管、管理者。
a. 管理HDFS的名称空间
b. 配置副本策略:每个文件设置多少个副本
c. 管理数据块(Block)映射信息
d. 处理客户端读写请求 - DateNode:就是Slave,执行NameNode下达的命令。
a. 存储实际的数据块
b. 执行数据块的读/写操作 - Client:客户端
a. 文件切分:在文件上传到HDFS的时候,Client将文件切分成一个个的Block,然后上传。
b. 与NameNode交互,获取文件的位置信息。
c. 与DataNode交互,读取或者写入数据。
d. Client提供一些命令来管理HDFS,例如NameNode格式化。
e. Client可以通过一些命令来访问HDFS,比如对HDFS增删改查。 - Secondary NameNode:并非NameNode的热备。当NameNode不能工作时,并不能马上替换NameNode并提供服务。
a. 辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode。
b. 在紧急情况下,可以辅助恢复NameNode数据(部分)。
HDFS文件块大小*
- HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)规定的,默认大小在Hadoop2.x版本中是128M(134217728),旧版本是64M。
- 寻址时间即查找到目标Block的时间,寻址时间为传输时间的1%时,为最佳状态。
- 目前磁盘的传输速率普遍为100MB/s
HDFS文件块大小的设置:主要取决于磁盘的传输速率。
如果设置太小,会增加寻址时间。如果设置太大,从磁盘传输数据的时间会明显大于定位这个块所需的时间,导致程序在处理这块数据时,会非常慢。
HDFS的Shell操作
基本语法:$ bin/hadoop fs 具体命令
或者 $ bin/hdfs dfs 具体命令
(dfs是fs的实现类)
进行操作前,需保证hdfs和yarn已经启动:$ jps
(启动命令:$ sbin/start-yarn.sh
和$ sbin/start-dfs.sh
)
命令全部选项
查询hdfs可以使用的选项:$ hdfs dfs
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] <path> ...]
[-cp [-f] [-p | -p[topax]] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] <path> ...]
[-expunge]
[-find <path> ... <expression> ...]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] [-l] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touchz <path> ...]
[-truncate [-w] <length> <path> ...]
[-usage [cmd ...]]
查询hadoop可以使用的选项:$ hadoop fs
(由于dfs是fs的实现类,因此我们发现这两个命令可选选项差不多)
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] <path> ...]
[-cp [-f] [-p | -p[topax]] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] <path> ...]
[-expunge]
[-find <path> ... <expression> ...]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] [-l] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touchz <path> ...]
[-truncate [-w] <length> <path> ...]
[-usage [cmd ...]]
常用命令
访问监控页面查看HDFS文件变化:服务器名:50070/explorer.html#/
- 启动Hadoop集群:分开启动hdfs和yarn,
$ sbin/start-dfs.sh
和$ sbin/start-yarn.sh
- 查询命令有哪些参数 -help:
$ hadoop fs -help 命令
,例如:$ hadoop fs -help rm
- 显示目录信息 -ls:查询根目录下
$ hadoop fs -ls /
,递归查询根目录下所有信息$ hadoop fs -lsr /
(一级一级显示) - 在HDFS上创建目录 -mkdir:创建多及目录需要带参数-p
$ hadoop fs -mkdir -p /a/a
- 将本地文件剪切到HDFS上 -moveFromLocal:
$ hadoop fs -moveFromLocal 文件本地路径 HDFS目的路径
注意:剪切操作即上传后文件存在HDFS上,本地已经不存在该文件了。 - 追加一个文件到已经存在的文件末尾 -appendToFile :
$ hadoop fs -appendToFile 要追加的内容文件 要追加到哪个文件
- 显示文件内容 -cat:
$ hadoop fs -cat 要查询的文件路径(HDFS的路径)
- 修改文件所属权限 -chgrp、-chmod、-chown
修改文件Group:$ hadoop fs -chgrp group_name 文件
修改文件操作权限:$ hadoop fs -chmod 666 文件路径
修改文件所有者和组:$ hadoop fs -chown user_name:group_name 文件路径