文件名
DOS操作系统中文件名由文件主名和扩展名组成,之间以一个小圆点隔开
文件名可用于用于定位存储位置、区分不同文件,计算机实行按名存取的操作方式
某些符号因其有特殊含义,一般不允许出现在文件名中
元数据
元素据(metadata)又称为解释性数据,记录数据的数据
文件系统元数据一般指文件大小、最后修改时间、底层存储位置、属性、所属用户、权限等信息
文件系统分类
是在非易失介质上(磁盘、光盘)存储文档的经典方式。用以在多次会话之间保持文件的内容。包括ext2/3/4、xfs、ntfs、iso9660等众所周知的文件系统。Linux系统可以使用df -Th查看
在内核中生成的文件系统,比如proc
proc文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在Linux内核空间和用户间之间进行通信
网络文件系统(NFS,network file system)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制
允许本地计算机访问另一台计算机上的数据,对此类文件系统中文件的操作都通过网络连接进行
适用场景
大文件
数据流式访问
一次写入多次读取
低成本部署,廉价pc
高容错
不适用场景
小文件
数据交互式访问
频繁任意修改
低延迟处理
HDFS采用master/slave架构。一般一个HDFS集群是有一个NameNode和一定数目的DataNode组成。
NameNode是HDFS主节点,DataNode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务
HDFS中的文件在**物理上分块存储(block)**的,块的大小通过配置参数来规则,参数位于hdfs-default.xml中dfs.blocksize
。默认大小是128M(134217728)
文件的所有block都会有副本。每个文件的block大小(dfs.blocksize)和副本系数(dfs.replication)都是可配置的。副本系数可以在文件创建时指定,也可以在之后通过命令改变。
默认 dfs.replication 的值是3,也就是额外再复制两份,连同本身共3副本。
HDFS支持传统的层次型文件组织结构。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、、移动或重命名文件。
NameNode负责维护文件系统的namespace名称空间,任何对文件系统名称空间或属性的修改都将被NameNode记录下来
HDFS会给客户端提供一个统一的抽象目录树,客户端提供路径来访问文件。
形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
在HDFS中,NameNode管理的元数据具有两种类型:
文件名称、权限、修改时间、文件大小、复制因子、数据块大小
记录块和DataNode之间的映射信息,即哪个块位于哪个节点上
文件的各个block的具体存储管理由DataNode节点承担。每一个block都可以在多个DataNode上存储。
HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来设置,默认大小在Hadoop2.x/3.x版本是128M,3.x版本是64M
例如:
如果寻址时间为10ms,传输时间=10ms/0.01=1s(寻址时间为传输时间的1%为最佳),若目前磁盘传输速率为100MB/s,则block块大小 = 1s * 100MB/s = 100MB,所有块大小设置为128M比较合适
Hadoop提供了文件系统的shell命令行客户端,使用方法如下:
hdfs [options] subcommand [subcommand options]
subcommand: admin commands / client command / daemon commands
跟文件系统读写相关的命令是 hdfs dfs [generic options]
hdfs dfs -ls file:/// # 操作本地文件系统(客户端所在的机器)
hdfs dfs -ls hdfs://node1:8020/ # 操作HDFS分布式文件系统
hdfs dfs -ls / # 直接跟目录,没有指定协议,将加载读取fs.defaultFS属性默认值
hadoop dfs、hdfs dfs、hadoop fs 三者区别
目前版本官方推荐使用hadoop fs
hadoop fs -mkdir [-p] <path>
# path 为待创建目录
# -p 表示沿着路径创建父目录
hadoop fs -ls [-h] [-R] [<path> ... ]
# path 指定目录路径
# -h 人性化显示文件size
# -R 递归查看指定目录及其子目录
hadoop fs -put [-f] [-p] <localsrc>... <dst>
# -f 覆盖目录文件(如果目标文件存在,则覆盖)
# -p 保留访问和修改时间,所有权和权限
# localsrc 本地文件系统(客户端所在机器)
# dst 目标文件系统(HDFS)
(等同于put,习惯上使用put)
hadoop fs -copyFromLocal <localsrc>... <dst>
(即从本地剪切文件至HDFS)
hadoop fs -moveFromLocal <localsrc>... <dst>
# 和-put功能相似,只不过上传结束会删除源数据
hadoop fs -appendToFile <localsrc> ... <dst>
hadoop fs -cat <src> ...
# 对于大文件内容读取,慎重
hadoop fs -head <file>
# 查看文件前1kB的内容
hadoop fs -tail [-f] <file>
# 查看文件最后1kB的内容
# -f 选择可以动态显示文件中追加的内容
(从HDFS拷贝文件至本地)
hadoop fs -get [-f] [-p] <src>... <localdst>
# 下载文件至本地文件系统指定目录,localdst必须是目录
# -f 覆盖目标文件(如果本地文件系统存在该文件,则覆盖)
# -p 保留访问和修改时间,所有权和权限
hadoop fs -copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>
# 等同于get,习惯上使用get
hadoop fs -getmerge [-n1] [-skip-empty-file] <src> <localdst>
# 下载多个文件合并到本地文件系统的一个文件中
# -n1 表示在每个文件的末尾添加换行符
hadoop fs -cp [-f] <src> ... <dst>
# -f 覆盖目标文件(若目标文件存在,则覆盖)
hadoop fs -appendToFile <localsrc>... <dst>
# 将所给给定的本地文件的内容追加到给定的dst文件
# 若dst文件不存在,将创建文件
# 如果为-,则输入为从标准输入中读取
hadoop fs -df [-h] [<path>...]
# 显示文件系统的容量,可以空间和已用空间
hadoop fs -du [-s] [-h] <path>...
# -s 表示显示指定路径文件长度的汇总摘要,而部署单个文件的摘要
# -h 表示人性化显示
hadoop fs -mv <src> ... <dst>
# 移动文件至指定文件夹
# 可以使用该命令移动数据、重命名文件
hadoop fs -rm -r 路径
# -r 表示递归
hadoop fs -setrep [-R] [-w] <rep> <path>...
# 修改指定文件的副本个数
# -R 表示递归,修改文件夹及其下所有
# -w 客户端是否等待副本修改完毕
说明:
这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。
-chgrp、-chmod、-chown:Linux文件系统中的用法一样
hadoop fs -chmod 666 文件所在路径
hadoop fs -chown nhk:nhk 文件所在路径