欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HDFS 详 【总结篇】

程序员文章站 2024-03-22 15:56:58
...

1.HDFS是什么?

Hadoop四大模块:
common、 HDFS、 Yarn、 MapReduce。

HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上。它所具有的高容错、高可靠性、高可扩展性、高获得性、高吞吐率等特征为海量数据提供了不怕故障的存储,为超大数据集(Large Data Set)的应用处理带来了很多便利。

2.HDFS 从何而来

HDFS 源于 Google 在2003年10月份发表的GFS(Google File System) 论文。 它其实就是 GFS 的一个克隆版本

3.为什么选择 HDFS 存储数据

之所以选择 HDFS 存储数据,因为 HDFS 具有以下优点:

1、高容错性

数据自动保存多个副本。它通过增加副本的形式,提高容错性。
某一个副本丢失以后,它可以自动恢复,这是由 HDFS 内部机制实现的,我们不必关心。
2、适合批处理

它是通过移动计算而不是移动数据。
它会把数据位置暴露给计算框架。
3、适合大数据处理

处理数据达到 GB、TB、甚至PB级别的数据。
能够处理百万规模以上的文件数量,数量相当之大。
能够处理10K节点的规模。10240
4、流式文件访问

一次写入,多次读取。文件一旦写入不能修改,只能追加。
它能保证数据的一致性。
5、可构建在廉价机器上

它通过多副本机制,提高可靠性。
它提供了容错和恢复机制。比如某一个副本丢失,可以通过其它副本来恢复。

当然 HDFS 也有它的劣势,并不适合所有的场合:

1、低延时数据访问

比如毫秒级的来存储数据,这是不行的,它做不到。
它适合高吞吐率的场景,就是在某一时间内写入大量的数据。但是它在低延时的情况下是不行的,比如毫秒级以内读取数据,这样它是很难做到的。
2、小文件存储

存储大量小文件(这里的小文件是指小于HDFS系统的Block大小的文件(默认64M))的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存总是有限的。
小文件存储的寻道时间会超过读取时间,它违反了HDFS的设计目标。
3、并发写入、文件随机修改

一个文件只能有一个写,不允许多个线程同时写。
仅支持数据 append(追加),不支持文件的随机修改。

4.HDFS三个服务

1.namenode     metadata 元数据     
2.secondary namenode
3.datanode

数据:数据内容

元数据:文件名称 大小 所属人 地址 128k
HDFS 详 【总结篇】

4.1Client

说白了就是 客户端

文件切分。文件上传 HDFS 的时候,Client 将文件切分成一个一个的Block然后进行存储
与 NameNode 交互,获取文件的位置信息。
与 DataNode 交互,读取或者写入数据。
Client 提供一些命令来管理 HDFS,比如启动或者关闭HDFS。
Client 可以通过一些命令来访问 HDFS。

4.2NameNode

就是 master,它是一个主管、管理者。

管理 HDFS 的名称空间

管理数据块(Block)映射信息

配置副本策略

处理客户端读写请求。

4.3DataNode

就是Slave。NameNode 下达命令,DataNode 执行实际的操作。存储实际的数据块。
执行数据块的读/写操作。

4.4Secondary NameNode

并非 NameNode 的热备。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务.辅助 NameNode,分担其工作量。定期合并 fsimage和fsedits,并推送给NameNode。
在紧急情况下,可辅助恢复 NameNode。

4.5具体描述:

Namenode 是一个中心服务器,单一节点(简化系统的设计和实现),负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。
文件操作,NameNode 负责文件元数据的操作,DataNode负责处理文件内容的读写请求,跟文件内容相关的数据流不经过NameNode,只会询问它跟那个DataNode联系,否则NameNode会成为系统的瓶颈。
副本存放在哪些DataNode上由 NameNode来控制,根据全局情况做出块放置决定,读取文件时NameNode尽量让用户先读取最近的副本,降低带宽消耗和读取时延
Namenode 全权管理数据块的复制,它周期性地从集群中的每个Datanode接收心跳信号和块状态报告(Blockreport)。接收到心跳信号意味着该Datanode节点工作正常。块状态报告包含了一个该Datanode上所有数据块的列表。
文件切分成块(默认大小128M),以为单位,每个块有多个副本存储在不同的机器上,副本数可在文件生成时指定(默认3
NameNode 是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表以及块所在的DataNode等等
DataNode 在本地文件系统存储文件块数据,以及块数据的校验和。
可以创建、删除、移动或重命名文件当文件创建、写入和关闭之后不能修改文件内容

5.HDFS 如何读取文件

HDFS 详 【总结篇】
HDFS的文件读取原理,主要包括以下几个步骤:

首先调用FileSystem对象的open方法,其实获取的是一个DistributedFileSystem的实例
DistributedFileSystem通过RPC(远程过程调用)获得文件的第一批block的locations,同一block按照重复数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面。
前两步会返回一个FSDataInputStream对象,该对象会被封装成 DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream就会找出离客户端最近的datanode并连接datanode。
数据从datanode源源不断的流向客户端。
如果第一个block块的数据读完了,就会关闭指向第一个block块的datanode连接,接着读取下一个block块。这些操作对客户端来说是透明的,从客户端的角度来看只是读一个持续不断的流。
如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流。
HDFS 详 【总结篇】

6.HDFS 如何写入文件

HDFS 详 【总结篇】
HDFS的文件写入原理,主要包括以下几个步骤:

客户端通过调用 DistributedFileSystem 的create方法,创建一个新的文件。
DistributedFileSystem 通过 RPC(远程过程调用)调用 NameNode,去创建一个没有blocks关联的新文件。创建前,NameNode 会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,NameNode 就会记录下新文件,否则就会抛出IO异常。
前两步结束后会返回 FSDataOutputStream 的对象,和读文件的时候相似,FSDataOutputStream 被封装成 DFSOutputStream,DFSOutputStream 可以协调 NameNode和 DataNode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列 data queue。
DataStreamer 会去处理接受 data queue,它先问询 NameNode 这个新的 block 最适合存储的在哪几个DataNode里,比如重复数是3,那么就找到3个最适合的 DataNode,把它们排成一个 pipeline。DataStreamer 把 packet 按队列输出到管道的第一个 DataNode 中,第一个 DataNode又把 packet 输出到第二个 DataNode 中,以此类推。
DFSOutputStream 还有一个队列叫 ack queue,也是由== packet 组成==,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。
客户端完成写数据后,调用close方法关闭写入流
DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 DataNode 把文件标示为已完成。
HDFS 详 【总结篇】

7、HDFS 副本存放策略

namenode如何选择在哪个datanode 存储副本(replication)?这里需要对可靠性、写入带宽和读取带宽进行权衡。Hadoop对datanode存储副本有自己的副本策略,在其发展过程中一共有两个版本的副本策略,分别如下所示

HDFS 详 【总结篇】

8.HDFS SHELL 命令:

[-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 详 【总结篇】
HDFS 详 【总结篇】

HDFS常用命令:
注:以下执行命令均在spark安装目录的bin目录下。
path 为路径 src为文件路径 dist 为文件夹

1、-help[cmd] 显示命令的帮助信息

./hdfs dfs -help ls

2、-ls® 显示当前目录下的所有文件 -R层层循出文件夹

./hdfs dfs -ls /log/map
./hdfs dfs -lsr /log/ (递归的)

3、-du(s) 显示目录中所有文件大小,或者当只指定一个文件时,显示此文件的大小

./hdfs dfs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://host:port/user/hadoop/dir1

4、-count[-q] 显示当前目录下的所有文件大小

5、-mv 移动多个文件目录到目标目录

./hdfs dfs -mv /user/hadoop/file1 /user/hadoop/file2

6、-cp 复制多个文件到目标目录

./hdfs dfs -cp /user/hadoop/file1 /user/hadoop/file2 (将文件从源路径复制到目标路径。
这个命令允许有多个源路径,此时目标路径必须是一个目录。)

7、-rm® 删除文件(夹)

./hdfs dfs -rmr /log/map1 (递归删除)

8、-put 本地文件复制到hdfs

./hdfs dfs -put test.txt /log/map/

9、-copyFromLocal 本地文件复制到hdfs

./hdfs dfs -copyFromLOcal /usr/data/text.txt /log/map1/ (将本地的text.txt 复制到hdfs的/log/map1/下)

10、-moveFromLocal 本地文件移动到hdfs

./hdfs dfs -moveFromLocal /usr/data/text.txt /log/map1/ (将本地的text.txt移动到hdfs的/log/map1/下)

11、-get[-ignoreCrc] 复制文件到本地,可以忽略crc校验

./hdfs dfs -get /log/map1/* . (复制到本地当前目录下)
/hdfs dfs -get /log/map1/* /usr/data (将hdfs下的/log/map1/下的所有文件全部复制到本地的/usr/data/下 )

12、-getmerge[addnl] 将源目录中的所有文件排序合并到一个文件中,接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。addnl是可选的,用于指定在每个文件结尾添加一个换行符。

./hdfs dfs -getmerge /log/map1/* /usr/data(将hdfs上的/log/map1/下的所有文件合并下载到本地的/usr/data下)

13、-cat 在终端显示文件内容

./hdfs dfs -cat /log/map1/part-00000 | head (读取hdfs上的/log/map1下的part-00000文件 head参数,代表前十行。)

/hdfs dfs -tail /log/map1/part-00000 (查看文件的最后一千行)

14、-text 在终端显示文件内容,将源文件输出为文本格式。允许的格式是zip和TextRecordInputStream
15、-copyToLocal[-ignoreCrc] 复制文件到本地
16、-moveToLocal 移动文件到本地
17、-mkdir 创建文件夹 后跟-p 可以创建不存在的父路径

./hdfs dfs -mkdir -p /dir1/dir11/dir111

18、-touchz 创建一个空文件

19、-grep 从hdfs上过滤包含某个字符的行内容

./hdfs dfs -cat /log/testlog/* | grep 过滤字段

8.HDFS 中文API

<groupId> org.apache.hadoop </ groupId>
<artifactId> hadoop-client </ artifactId>
<version> 2.7.3 </ version>
<scope> runtime </ scope>