HDFS简介
Hadoop Distributed File System(简称HDFS)是Apache Hadoop 生态系统中的一个分布式文件系统,它是设计用于储存大规模数据集的运算集群。HDFS 是Hadoop 中最核心的组件之一,能够管理和存储任意格式的数据,包括结构化、非结构化和半结构化的数据,具有高可用性,高可靠性,高扩展性等特点。
HDFS 的核心思想是将大文件分割成多个数据块,每个数据块默认大小为128MB(Hadoop-2.2版本之前为64MB),然后将数据块分布式地存储在不同的计算机节点上。这种数据存储方式既能够提供高可用性和容错性,也能够实现数据处理的并行计算,在数据读取和写入过程中,HDFS 会自动处理复制、故障检测和恢复等问题。同时,HDFS 还提供了类似于Linux中对文件的操作,包括创建、读取、写入、修改、删除等操作。HDFS体系结构中有两类节点,一类是NameNode,又叫"元数据节点";另一类是DataNode,又叫"数据节点"。这两类节点分别承担Master和Worker具体任务的执行节点。
HDFS是一个主/从(Mater/Slave)体系结构,从最终用户的角度来看,它就像传统的文件系统一样,可以通过目录路径对文件执行CRUD(Create、Read、Update和Delete)操作。但由于分布式存储的性质,HDFS集群拥有一个NameNode和一些DataNode。NameNode管理文件系统的元数据,DataNode存储实际的数据。客户端通过同NameNode和DataNodes的交互访问文件系统。客户端联系NameNode以获取文件的元数据,而真正的文件I/O操作是直接和DataNode进行交互的。
需要注意的是,由于 HDFS 设计时主要考虑了数据批处理的场景,所以其并不适合用于大量小文件的数据存储,因为这样会导致 NameNode 负载过大。同时HDFS 的数据一般都是只追加写,不能进行修改和删除,如果需要修改和删除数据,需要在原有数据基础上覆盖写入或者在删除数据时只是标记该数据已删除,再通过HDFS的定时机制进行清理。
HDFS基本原理
设计特点
1、大数据文件,非常适合上T级别的大文件或者一堆大数据文件的存储,如果文件只有几个G甚至更小就没啥意思了。
2、文件分块存储,HDFS会将一个完整的大文件平均分块存储到不同计算器上,它的意义在于读取文件时可以同时从多个主机取不同区块的文件,多主机读取比单主机读取效率要高得多得都。
3、流式数据访问,一次写入多次读写,这种模式跟传统文件不同,它不支持动态改变文件内容,而是要求让文件一次写入就不做变化,要变化也只能在文件末添加内容。
4、廉价硬件,HDFS可以应用在普通PC机上,这种机制能够让给一些公司用几十台廉价的计算机就可以撑起一个大数据集群。
5、硬件故障,HDFS认为所有计算机都可能会出问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,如果其中一台主机失效,可以迅速找另一块副本取文件。
关键元素
1、Block:将一个文件进行分块,通常是128MB (Hadoop-2.2版本之前为64MB)。
2、NameNode:保存整个文件系统的目录信息、文件信息及分块信息,这是由唯一 一台主机专门保存,当然这台主机如果出错,NameNode就失效了。在 Hadoop2.* 开始支持 activity-standy 模式----如果主 NameNode 失效,启动备用主机运行 NameNode。
3、DataNode:分布在廉价的计算机上,用于存储Block块文件。
HDFS运行原理
1、NameNode和DataNode节点初始化完成后,采用RPC进行信息交换,采用的机制是心跳机制,即DataNode节点定时向NameNode反馈状态信息,反馈信息如:是否正常、磁盘空间大小、资源消耗情况等信息,以确保NameNode知道DataNode的情况;
2、NameNode会将子节点的相关元数据信息缓存在内存中,对于文件与Block块的信息会通过fsImage和edits文件方式持久化在磁盘上,以确保NameNode知道文件各个块的相关信息;
3、NameNode负责存储fsImage和edits元数据信息,但fsImage和edits元数据文件需要定期进行合并,这时则由SecondNameNode进程对fsImage和edits文件进行定期合并,合并好的文件再交给NameNode存储。
HDFS数据合并原理
1、NameNode初始化时会产生一个edits文件和一个fsimage文件,edits文件用于记录操作日志,比如文件的删除或添加等操作信息,fsImage用于存储文件与目录对应的信息以及edits合并进来的信息,即相当于fsimage文件在这里是一个总的元数据文件,记录着所有的信息;
2、随着edits文件不断增大,当达到设定的一个阀值的时候,这时SecondaryNameNode会将edits文件和fsImage文件通过采用http的方式进行复制到SecondaryNameNode下(在这里考虑到网络传输,所以一般将NameNode和SecondaryNameNode放在相同的节点上,这样就无需走网络带宽了,以提高运行效率),同时NameNode会产生一个新的edits文件替换掉旧的edits文件,这样以保证数据不会出现冗余;
3、SecondaryNameNode拿到这两个文件后,会在内存中进行合并成一个fsImage.ckpt的文件,合并完成后,再通过http的方式将合并后的文件fsImage.ckpt复制到NameNode下,NameNode文件拿到fsImage.ckpt文件后,会将旧的fsimage文件替换掉,并且改名成fsimage文件。
通过以上几步则完成了edits和fsimage文件的合并,依此不断循环,从而到达保证元数据的正确性。
HDFS写原理
1、HDFS客户端提交写操作到NameNode上,NameNode收到客户端提交的请求后,会先判断此客户端在此目录下是否有写权限,如果有,然后进行查看,看哪几个DataNode适合存放,再给客户端返回存放数据块的节点信息,即告诉客户端可以把文件存放到相关的DataNode节点下;
2、客户端拿到数据存放节点位置信息后,会和对应的DataNode节点进行直接交互,进行数据写入,由于数据块具有副本replication,在数据写入时采用的方式是先写第一个副本,写完后再从第一个副本的节点将数据拷贝到其它节点,依次类推,直到所有副本都写完了,才算数据成功写入到HDFS上,副本写入采用的是串行,每个副本写的过程中都会逐级向上反馈写进度,以保证实时知道副本的写入情况;
3、随着所有副本写完后,客户端会收到数据节点反馈回来的一个成功状态,成功结束后,关闭与数据节点交互的通道,并反馈状态给NameNode,告诉NameNode文件已成功写入到对应的DataNode。
HDFS读原理
1、HDFS客户端提交读操作到NameNode上,NameNode收到客户端提交的请求后,会先判断此客户端在此目录下是否有读权限,如果有,则给客户端返回存放数据块的节点信息,即告诉客户端可以到相关的DataNode节点下去读取数据块;
2、客户端拿到块位置信息后,会去和相关的DataNode直接构建读取通道,读取数据块,当所有数据块都读取完成后关闭通道,并给NameNode返回状态信息,告诉NameNode已经读取完毕。
HDFS Shell常用命令
HDFS是一种分布式文件管理系统,对HDFS的操作就是文件系统的基本操作,如文件或目录的创建、修改、删除、修改权限等。对HDFS的操作命令类似于Linux的Shell对文件的操作。
HDFS的Shell操作命令一般格式是:hadoop fs [命令选项],所支持的[命令选项]可以通过使用命令“hadoop fs”来显示。常用命令如下:
1.以下命令查看HDFS根目录中的所有文件和子目录的信息:
ls命令: hadoop fs -ls [hdfs源路径] ,用于显示指定路径的目录结构。
hadoop fs -ls / 显示根目录中的所有文件和子目录的信息
2.以下命令显示HDFS的dev目录下所有文件的信息:
hadoop fs -ls /dev
3.以下命令显示HDFS的dev目录下所有文件的大小:
du命令:hadoop fs -du [hdfs源路径] ,显示指定路径下各目录中所有文件的大小。
hadoop fs -du /dev 显示HDFS根目录下所有文件的大小
4.以下命令在根目录下创建目录dir1和dir2:
mkdir命令:hadoop fs -mkdir [hdfs源路径] ,用于在HDFS上创建空目录。
hadoop fs -mkdir /dir1
hadoop fs -mkdir /dir2
hadoop fs -ls /
5.以下命令在本地建立file1.txt文件,然后上传到HDFS的目标路径/dir1中:
put命令:hadoop fs -put <本地源文件> …… [hdfs源路径],用于将本地源文件上传到HDFS,本地源文件可以有多个。
echo "This is a HDFS test">file1.txt
hadoop fs -put file1.txt /dir1
hadoop fs -ls /dir1
6.以下命令在本地建立file2.txt文件,然后复制到HDFS的目标路径/dir1中:
copyFromLocal命令:hadoop fs -copyFromLocal <本地源文件> …… [hdfs源路径],用于将本地文件上传到HDFS,用法与-put 相同
echo "This is a HDFS test">file2.txt
hadoop fs -copyFromLocal file2.txt /dir1
hadoop fs -ls /dir1
7.以下命令将/dir1中的文件file1.txt移动到目标路径/dir2中:
mv命令:hadoop fs -mv <源文件> [hdfs源路径],将文件从源路径移动到指定路径。
hadoop fs -mv /dir1/file1.txt /dir2
hadoop fs -ls /dir1
hadoop fs -ls /dir2
8.以下命令将目录/dir2中的文件file1.txt复制到目标目录/dir1中:
cp命令:hadoop fs -cp <源文件> [hdfs源路径],将文件从源路径复制到指定路径。
hadoop fs -cp /dir2/file1.txt /dir1
hadoop fs -ls /dir1
9.以下命令将HDFS的/dir2/file1.txt文件下载到本地,下载的文件命名为file_down.txt:
get命令:hadoop fs -get [hdfs源路径] <本地目的路径>,将HDFS文件下载到本地。
hadoop fs -get /dir2/file1.txt file_down.txt
ll
10.以下命令将HDFS的/dir2/file1.txt文件从HDFS中复制到本地,复制的文件命名为file_down.txt:
copyToLocal命令:hadoop fs -copyToLocal [hdfs源路径] <本地目的路径>,含义与-get命令相同
hadoop fs -copyToLocal /dir2/file1.txt file_down1.txt
ll
11.以下命令删除/dir2中的文件file1.txt:
rm命令:hadoop fs -rm [hdfs源路径],用于删除指定文件或空目录。
hadoop fs -rm /dir2/file1.txt
hadoop fs -ls /dir2
12.以下命令对HDFS文件系统的/dir1目录下的文件file1.txt增加写权限:
chomd命令:hadoop fs -chmod[-R] <权限模式> [hdfs源路径],修改文件的权限,类似于linux的chmod用法。使用选项-R将使修改权限在目录结构下递归进行,也就是对目录中的所有文件修改权限。
hadoop fs -ls /dir1
hadoop fs -chmod +w /dir1/file1.txt
hadoop fs -ls /dir1
13.以下命令查看/dir1/ file1.txt文件的内容:
cat命令:hadoop fs -cat < hdfs文件>,查看HDFS上指定文件的内容。
hadoop fs -cat /dir1/file1.txt
14.以下命令将/dir/file1.txt文件副本数设置为2:
setrep命令:修改文件副本数量。
hadoop fs -setrep 2 /dir1/file1.txt
hadoop fs -ls /dir1
15.下列命令把本地目录下的两个文件file1.txt和file_down.txt移到HDFS文件系统的/dir2:
moveFromLocal命令:hadoop fs -moveFromLocal<本地源路径〉……[hdfs源路径],把本地文件移动到HDFS的目标路径下,本地源文件可以有多个。
hadoop fs -moveFromLocal file1.txt file_down.txt /dir2
hadoop fs -ls /dir2
16.下列命令将/dir2目录下的两个文件的内容合并成本地文件file_merge:
getmerge命令:hadoop fs -getmerge [hdfs源路径] <本地目的路径>,把HDFS指定目录下的所有文件内容合并成本地的目标文件。
hadoop fs -getmerge /dir2 file_merge
cat file_merge
17.使用帮助:
help命令:查询指定HDFS 命令的帮助信息。例如,想查询mv命令的用法,可以使用下列命令:
hadoop fs -help mv
HDFS小文件归档操作
HDFS文件以块为单位存储,每个块的元数据存储在NameNode内存,大量的小文件占用NameNode内存,降低系统性能。HDFS提供高效的归档操作命令,可以把若干小文件归档成一个har文件。har文件对内是一个个独立的文件,对NameNode而言是一个整体,减少对NameNode内存的占用。小文件归档操作如下:
归档文件
把/dir2目录里的所有文件归档成一个归档文件input.har,归档文件存储到/dir1路径下。
hadoop archive -archiveName input.har -p /dir2 /dir1
其中:
"hadoop archive" 是 Hadoop 提供的一个命令行工具,用于将多个小文件归档并打包成一个 Hadoop 归档文件(HAR 文件)。
"-archiveName input.har" 参数指定了归档文件的名称为 "input.har"。
"p" 参数表示保留源目录结构。
"/dir2" 和 "/dir1" 是待归档的目录路径。
查看归档
hadoop fs -ls -r har:///dir1/input.har
解归档文件
hadoop fs -mkdir /file
hadoop fs -cp har:///dir1/input.har/* /file
hadoop fs -ls /file
快照管理操作
HDFS 快照是文件系统的只读时间点副本。可以在文件系统的子树或整个文件系统上拍摄快照。快照的一些常见用例是数据备份、防止用户错误和灾难恢复。
HDFS快照的实现是高效的:
快照创建是即时的:成本为 O(1),不包括索引节点查找时间。
仅当相对于快照进行修改时,才会使用额外的内存:内存使用量为 O(M),其中 M 是修改的文件/目录数。
不复制数据节点中的块:快照文件记录块列表和文件大小。没有数据复制。
快照不会对常规 HDFS 操作产生不利影响:修改按时间倒序记录,以便可以直接访问当前数据。快照数据是通过从当前数据中减去修改来计算的。
HDFS提供了目录的快照功能,相当于对目录做一个备份,以便在需要时可以恢复目录。快照管理操作如下:
开启\关闭指定目录的快照功能
hdfs dfsadmin -allowSnapshot /file //开启
hdfs dfsadmin -disallowSnapshot /file //关闭
其中:
"hdfs dfsadmin -allowSnapshot /file" 是一个HDFS管理命令。其中,"-allowSnapshot" 参数用于在指定的目录下启用快照功能。
具体来说,在执行该命令时,管理员需要提供一个HDFS 文件系统路径,这里假设为 "/file"。执行命令后,HDFS 会在指定的目录中启用快照功能。
快照是HDFS提供的一种文件系统保护机制。它允许用户对文件系统的某个目录架构进行快照,然后在其他时间点基于所创建的快照来恢复到先前的状态。也就是说,一旦启用了快照功能,HDFS 将允许管理员或用户创建、查看、删除和还原快照。
需要注意的是,启用快照功能会对HDFS负载造成一定压力,因此仅在必要情况下启用。另外,如果想禁用快照功能,可以使用 "-disallowSnapshot" 参数。
列出当前用户所有可以快照的目录
hdfs lsSnapshottableDir
对目录/file创建快照,指定快照名称为snp1
hdfs dfs -createSnapshot /file snp1 //创建
hdfs dfs -deleteSnapshot /file snp1 //删除
执行结果可以看到所生成的快照路径是/file/.snapshot/snp1
查看目录快照snp1的内容:
hadoop fs -ls /file/.snapshot/snp1
对源目录进行修改。
hadoop fs -ls /file
hadoop fs -mkdir /file/test
hadoop fs -rm /file/file1.txt
hadoop fs -ls /file
比较源目录和快照snp1的不同之处
hdfs snapshotDiff /file . .snapshot/snp1
恢复快照,把快照复制到目标目录。
hdfs dfs -cp /file/.snapshot/snp1 <目标目录>