cindysz110 / blog

8 stars 1 forks source link

[Hadoop] HDFS 基本概念 #3

Open cindygl opened 6 years ago

cindygl commented 6 years ago

HDFS 架构设计

官方文档:http://hadoop.apache.org/docs/r2.8.4/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

HDFS具有主从架构,一个HDFS集群包含一个NameNode、一个Master Server,用于管理文件系统namespace和客户端对文件的访问。另外还有N个DataNode,通常集群中每个节点一个DataNode,用于管理连接到它们所允许的节点的存储(伪分布式环境中,DataNode跟NameNode位于同一个节点)。HDFS公开文件系统的namespace并允许用户数据存储。存储到HDFS的文件被分成一个或多个块,这些块存储在一组DataNode中。NameNode执行文件系统namespace操作,如打开、关闭和重命名文件和目录。它还确定块到DataNode的映射。DataNode负责提供来自文件系统客户端的读取和写入请求。DataNode还执行块创建,删除和复制。

image

HDFS进程

NN: 名称节点 DN:数据节点 SNN:第二名称节点

Block块

大小:128M 参数:hdfs-site.xml dfs.blocksize

副本数

生产环境:3 参数:hdfs-site.xml dfs.replication

NameNode

NameNode:文件系统的命名空间

  1. 文件名称
  2. 文件目录结构
  3. 文件的属性(权限、创建时间以及副本数)
  4. 文件对应哪些数据块 --> 数据块对应哪些分布在哪些DN上
  5. 存储在内存上

DataNode

DataNode:存储数据库 + 数据块的校验和 与NameNode通信:

  1. 每隔3秒发送一次心跳
  2. 每隔10次心跳发送一次Blockreport
  3. 存储在磁盘上

Secondary NameNode

  1. 存储:命名空间镜像文件fsimage + 编辑日志editlog
  2. 作用:定期合并fsimage + editlog 为新的fsimage,推送给NN,称为检查点,checkpoint
  3. 参数:dfs.namenode.checkpoint.period 3600s
  4. 备注:当配置HA时,SNN进程就不存在了。

读写的操作记录在EditLog,不会在fsimage NN: EditLog:实时记录 fsimage:1小时 SNN:定期合并fsimage + EditLog为新的fsimage,推送给NN

Namespace

  1. NameNode维护文件系统namespace
  2. NameNode记录对文件系统namespace的名称/属性的修改
  3. NameNode存储复制因子(复制因子=文件副本数,可以由应用程序指定)

数据复制

  1. HDFS将每个文件存储为一系列的块(block),文件的块被复制以实现容错。块的大小和复制因子均可配置;
  2. 文件中除最后一个block之外,其他所有的block都具有相同的大小;
  3. 复制因子可以由应用程序指定,可以在文件创建时指定副本因子,创建完了也可以修改;
  4. HDFS文件是一次性写入的;
  5. NameNode管理所有block复制动作,它定期从集群中的每个DataNode接受Heartbeat(每3秒)和Blockreport(每隔10次heartbeat);

副本放置策略

如果复制因子为3, 第一副本:放置在上传文件的DataNode上。如果是集群外提交,则随机挑选一台磁盘不太慢、CPU不太忙的节点上; 第二副本:放置在与第一个副本不同的机架的节点上; 第三副本:与第二个副本不同机架的不同节点上; 如果还有更多的副本:随机放在节点中; 如果副本数m>DataNode节点数n,最终数据在集群上会保存n个副本。这是因为NameNode不允许DataNode具有一个块的多个副本,文件创建时副本数是当时的DataNode总数。

安全模式

  1. 安全模式启动时,NameNode进入一个称为safemode的特殊状态,当NameNode处于安全模式状态时,不会发生数据块的复制;
    1. 安全模式数据只能读不能写;

文件大系统元数据的持久性

  1. HDFS namespace由NameNode存储,NameNode使用EditLog(事物日志)来持久记录文件系统元数据发生的所有更改; 例如: 在HDFS中创建一个新文件 -> NameNode向EditLog插入一条记录 更改文件的复制因子 -> NameNode向EditLog插入新记录
  2. NameNode使用本地主机OS文件系统中的文件来存储EditLog;
  3. 整个文件系统namespace(包括block和文件系统属性的映射关系)存储在FsImage文件中;
  4. FsImage也作为文件存储在NameNode的本地文件系统中;
  5. DataNode将HDFS数据文件存储在本地文件系统的文件中;
  6. DataNode启动时,扫描本地文件系统,生成与本地文件相对应的HDFS数据块的列表并发送报告(Blockreport)给NameNode;

通信协议

  1. 所有HDFS通信协议都在TCP/IP协议之上进行分层;
  2. 客户端 -> NameNode机器,TCP端口连接;
  3. DataNode -> NameNode,使用NataNode协议通信;
  4. 远程过程调用(RPC)抽象包装了客户端协议和数据节点协议。NameNode永远不会启动任何RPC,它只响应DataNode或客户端发出的RPC请求;

空间回收

文件删除和取消删除

  1. 如果启用了垃圾箱配置,FS Shell删除的文件不会立即从HDFS删除,将会进入垃圾目录(/user//.Trash/Current),过期会被自动清空;
  2. 删除文件时使用参数skipTrash,彻底删除,不会进入垃圾箱。彻底删除test2:
    hadoop fs -rm -r -skipTrash delete / test2

降低复制因子

复制因子减少时,NameNode选择可以删除的多余副本。下一个Heartbeat将此信息传输到DataNode。DataNode删除相应的block,释放可用空间。

文件读流程

读操作是对于client端是透明操作,感觉是连续的数据流,不care它是不是经过NN。

[hadoop@hadoop01 ~]$ hdfs dfs -cat /test.txt

画图表示HDFS文件的读流程(TO BE UPDATED LATER ON)。 InputStream

文件写流程

[hadoop@hadoop01 ~]$ hdfs dfs -put test.txt /

OutputStream

常用命令: 查看hdfs文件有多少个副本数:hdfs fsck /rz.log -files -blocks ...