![](https://i-blog.csdnimg.cn/blog_migrate/98bfdb4803f23bab42d21cd45fe9368f.png)
HDFS基本概念
首先是一个文件系统,就是用来存储文件、存储数据。是大数据最底层一个服务。
其次是一个分布式的文件系统。分布式意味着多台机器存储。
![](https://i-blog.csdnimg.cn/blog_migrate/1f297d5658388c8bbce941821d6f28fa.png)
Hadoop HDFS--起源发展和设计目标
具备故障检测和快速恢复的能力(容错)
1、HDFS上存储数据都是先进行切片存储,每一个切片都有副本,不怕丢失
面对海量数据的存储,注重吞吐能力,而不是交互式。(延迟高)
1、由于HDFS存储的过程很复杂,所以当我向HDFS存储文件时,存储过程时间比较长
2、HDFS最擅长的就是存海量数据
支持大文件存储(越大越开心)
1、由于不管多大的文件存入之后,都是进行切片,所以HDFS对文件的大小是无感的
2、NemeNode中每一个文件的元数据大概是150字节, 1K---》150字节 1T--->150字节
一次写入多次读取模型 (不支持修改操作)
1、HDFS上的文件一旦写入,不支持对文件的随机修改,只支持对文件尾部的内容追加
异构存储、可移植性
HDFS分布式存储系统可以在多个不同的平台运行(Windows、Linux、Mac)
HDFS的架构
HDFS 是一个主/从(Mater/Slave)体系结构,由三部分组成: NameNode 和
DataNode 以及 SecondaryNamenode。
NameNode
NameNode是HDFS的核心。
NameNode也称为Master。
NameNode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件。
NameNode不存储实际数据或数据集。数据本身实际存储在DataNodes中。
NameNode知道HDFS中任何给定文件的块列表及其位置。使用此信息NameNode知道如何从块中构建文件。
NameNode并不持久化存储每个文件中各个块所在的DataNode的位置信息,这些信息会在系统启动时从数据节点重建。
NameNode对于HDFS至关重要,当NameNode关闭时,HDFS / Hadoop集群无法访问。
NameNode是Hadoop集群中的单点故障。
NameNode所在机器通常会配置有大量内存(RAM)。
DataNode
DataNode负责将实际数据存储在HDFS中。
DataNode也称为Slave。
NameNode和DataNode会保持不断通信。
DataNode启动时,它将自己发布到NameNode并汇报自己负责持有的块列表。
当某个DataNode关闭时,它不会影响数据或群集的可用性。NameNode将安排由其他DataNode管理的块进行副本复制。
DataNode所在机器通常配置有大量的硬盘空间。因为实际数据存储在DataNode中。
DataNode会定期(dfs.heartbeat.interval配置项配置,默认是3秒)向NameNode发送心跳,如果NameNode长时间没有接受到DataNode发送的心跳, NameNode就会认为该DataNode失效。
block汇报时间间隔取参数dfs.blockreport.intervalMsec,参数未配置的话默认为6小时
SecondaryNamenode
Secondary NameNode 用来监控 HDFS 状态的辅助后台程序,每隔一段时间获取 HDFS 元数据的快照。最主要作用是辅助 NameNode 管理元数据信息。
HDFS的核心重要特性
master/slave架构
HDFS采用master/slave架构。一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。
Namenode是HDFS集群主节点,Datanode是HDFS集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
分块存储
HDFS中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定,默认大小在hadoop2.x版本中是128M
副本机制
为了容错,文件的所有block都会有副本。每个文件的block大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。
副本数量也可以通过参数设置dfs.replication,默认是3。
名字空间(NameSpace)
HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。
HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
全路径(绝对路径): hadoop fs -get hdfs://node1:8020/a.txt ./
简写路径(相对路径): hadoop fs -get /a.txt ./
如果你的客户端就是集群内部的某台主机,也就是说你本身就在集群内部,则直接使用简写路径
如果你的客户端是在集群外部的某台主机,也就是说你不在集群中,则必须要使用全路径
Namenode元数据管理
我们把目录结构及文件分块位置信息叫做元数据。Namenode负责维护整个hdfs文件系统的目录树结构,以及每一个文件所对应的block块信息(block的id,及所在的datanode服务器)。
一次写入,多次读出
1、HDFS一般用于离线分析,一般存储的都是历史数据
2、历史数据最大的特点是已经发生了,成为了既定事实
3、对于历史数据我们只能遵循既定事实,不能进行任何修改(篡改历史)
4、hdfs的模式是一次写入多次读取,hdfs没有随机修改编辑的操作,只能对已有的数据进行追加。
设计目标是这么决定的。
5、侧重于数据吞吐量 不注重实时交互性 意味着hdfs操作延迟很高。
HDFS的基本操作
Shell 命令选项
选项名称 | 使用格式 | 含义 |
-ls | -ls <路径> | 查看指定路径的当前目录结构 |
-lsr | -lsr <路径> | 递归查看指定路径的目录结构 |
-du | -du <路径> | 统计目录下个文件大小 |
-dus | -dus <路径> | 汇总统计目录下文件(夹)大小 |
-count | -count [-q] <路径> | 统计文件(夹)数量 |
-mv | -mv <源路径> <目的路径> | 移动 |
-cp | -cp <源路径> <目的路径> | 复制 |
-rm | -rm [-skipTrash] <路径> | 删除文件/空白文件夹 |
-rmr | -rmr [-skipTrash] <路径> | 递归删除 |
-put | -put <多个linux上的文件> <hdfs路径> | 上传文件 |
-copyFromLocal | -copyFromLocal <多个linux上的文件> <hdfs路径> | 从本地复制 |
-moveFromLocal | -moveFromLocal <多个linux上的文件> <hdfs路径> | 从本地移动 |
-getmerge | -getmerge <源路径> <linux路径> | 合并到本地 |
-cat | -cat <hdfs路径> | 查看文件内容 |
-text | -text <hdfs路径> | 查看文件内容 |
-copyToLocal | -copyToLocal [-ignoreCrc] [-crc] [hdfs源路径] [linux目的路径] | 从本地复制 |
-moveToLocal | -moveToLocal [-crc] <hdfs源路径> <linux目的路径> | 从本地移动 |
-mkdir | -mkdir <hdfs路径> | 创建空白文件夹 |
-setrep | -setrep [-R] [-w] <副本数> <路径> | 修改副本数量 |
-touchz | -touchz <文件路径> | 创建空白文件 |
-stat | -stat [format] <路径> | 显示文件统计信息 |
-tail | -tail [-f] <文件> | 查看文件尾部信息 |
-chmod | -chmod [-R] <权限模式> [路径] | 修改权限 |
-chown | -chown [-R] [属主][:[属组]] 路径 | 修改属主 |
-chgrp | -chgrp [-R] 属组名称 路径 | 修改属组 |
-help | -help [命令选项] | 帮助 |
Shell常用命令介绍
-ls
使用方法:hadoop fs -ls [-h] [-R] <args>
功能:显示文件、目录信息。
示例:hadoop fs -ls /user/hadoop/file1
-mkdir
使用方法:hadoop fs -mkdir [-p] <paths>
功能:在hdfs上创建目录,-p表示会创建路径中的各级父目录。
示例:hadoop fs -mkdir –p /user/hadoop/dir1
-put
使用方法:hadoop fs -put [-f] [-p] [ -|<localsrc1> .. ]. <dst>
功能:将单个src或多个srcs从本地文件系统复制到目标文件系统。
-p:保留访问和修改时间,所有权和权限。
-f:覆盖目的地(如果已经存在)
示例:hadoop fs -put -f localfile1 localfile2 /user/hadoop/hadoopdir
-get
使用方法:hadoop fs -get [-ignorecrc] [-crc] [-p] [-f] <src> <localdst>
-ignorecrc:跳过对下载文件的CRC检查。
-crc:为下载的文件写CRC校验和。
功能:将文件复制到本地文件系统。
示例:hadoop fs -get hdfs://host:port/user/hadoop/file localfile
-appendToFile
使用方法:hadoop fs -appendToFile <localsrc> ... <dst>
功能:追加一个文件到已经存在的文件末尾
示例:hadoop fs -appendToFile localfile /hadoop/hadoopfile
-cat
使用方法:hadoop fs -cat [-ignoreCrc] URI [URI ...]
功能:显示文件内容到stdout
示例:hadoop fs -cat /hadoop/hadoopfile
-tail
使用方法:hadoop fs -tail [-f] URI
功能:将文件的最后一千字节内容显示到stdout。
-f选项将在文件增长时输出附加数据。
示例:hadoop fs -tail /hadoop/hadoopfile
-chgrp
使用方法:hadoop fs -chgrp [-R] GROUP URI [URI ...]
功能:更改文件组的关联。用户必须是文件的所有者,否则是超级用户。
-R将使改变在目录结构下递归进行。
示例:hadoop fs -chgrp othergroup /hadoop/hadoopfile
-chmod
功能:改变文件的权限。使用-R将使改变在目录结构下递归进行。
示例:hadoop fs -chmod 666 /hadoop/hadoopfile
-chown
功能:改变文件的拥有者。使用-R将使改变在目录结构下递归进行。
示例:hadoop fs -chown someuser:somegrp /hadoop/hadoopfile
-cp
功能:从hdfs的一个路径拷贝hdfs的另一个路径
示例:hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-mv
功能:在hdfs目录中移动文件
示例:hadoop fs -mv /aaa/jdk.tar.gz /
-getmerge
功能:合并下载多个文件
示例:比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...
hadoop fs -getmerge /aaa/log.* ./log.sum
-rm
功能:删除指定的文件。只删除非空目录和文件。-r 递归删除。
示例:hadoop fs -rm -r /aaa/bbb/
-df
功能:统计文件系统的可用空间信息
示例:hadoop fs -df -h /
-du
功能:显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小。
示例:hadoop fs -du /user/hadoop/dir1
-setrep
功能:改变一个文件的副本系数。-R选项用于递归改变目录下所有文件的副本系数。
示例:hadoop fs -setrep -w 3 -R /user/hadoop/dir1
HDFS的工作机制
HDFS上传文件流程(写文件流程)
![](https://i-blog.csdnimg.cn/blog_migrate/99d3cb67af69127288b81832549de7e4.png)
HDFS下载文件流程(读文件流程)
![](https://i-blog.csdnimg.cn/blog_migrate/f500053ed3661c80dd2358961618ce87.png)
NN和DN之间的通信机制
dn启动时
#datanode向nameNode进行注册 并行汇报自己持有数据块信息
注册表示自己启动成功 汇报是高速namenode自己保存了哪些数据块
dn后续工作时
#心跳机制
datanode每隔3S向namenode进行心跳 目的:报活 dfs.heartbeat.interval
#数据块汇报机制 blockreport
datanode每隔6小时向nameNode进行数据块汇报自己数据块信息 dfs.blockreport.intervalMsec
NameNode 安全模式
安全模式(safe mode)是HDFS集群处于一种保护状态,文件系统只可以读,不可以写。
安全模式如何进入离开的?
自动进入离开
#在HDFS集群刚启动时候 会自动进入 为了演示方便 使用单个进程逐个启动方式
#step1:启动namenode
hadoop-daemon.sh start namenode
#step2: 执行事务性操作 报错
[root@node1 ~]# hadoop fs -mkdir /aaaa
mkdir: Cannot create directory /aaaa. Name node is in safe mode.
Safe mode is ON. The reported blocks 0 needs additional 52 blocks to reach the threshold 0.9990 of total blocks 52. The number of live datanodes 0 has reached the minimum number 0. Safe mode will be turned off automatically once the thresholds have been reached.
#1、条件1:已经汇报的block达到总数据块的 0.999
#2、条件2:存活的dn数量大于等于0 说明这个条件不严格
#step3:依次手动启动datanode
hadoop-daemon.sh start datanode
Safe mode is ON. The reported blocks 52 has reached the threshold 0.9990 of total blocks 52. The number of live datanodes 2 has reached the minimum number 0. In safe mode extension. Safe mode will be turned off automatically in25 seconds.
#3、条件3:满足12条件的情况下 持续30s 结束自动离开安全模式
Safemode is off.
#为什么集群刚启动的时候 要进入安全模式
文件系统元数据不完整 无法对外提供可高的文件服务 属于内部的元数据汇报、校验、构建的过程。
手动进入离开
hdfs dfsadmin -safemode enter #手动进入安全模式
hdfs dfsadmin -safemode leave #手动离开安全模式
hdfs dfsadmin -safemodeget #获取安全模式状态
Safe mode is ON. It was turned on manually. Use "hdfs dfsadmin -safemode leave" to turn safe mode off.
#运维人员可以手动进入安全模式 进行集群的维护升级等动作 避免了群起群停浪费时间。
安全模式的注意事项
刚启动完hdfs集群之后 等安全模式介绍才可以正常使用文件系统 文件系统服务才是正常可用。
后续如果某些软件依赖HDFS工作,必须先启动HDFS且等安全模式结束才可以使用你的软件。
启动-->启动成功-->可用(安全模式结束)
NameNode元数据管理机制
元数据
元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
#记录数据的数据 描述数据的数据
hdfs中元数据
文件系统的元数据(namespace、块的位置)
datanodes状态信息(健康、磁盘使用率)
hdfs文件系统元数据存储位置
内存中元数据
磁盘上元数据文件(fsimage edits log)