HDFS原理详细解读

1.HDFS简介

  1. HDFS(Hadoop Distributed File System )Hadoop分布式文件系统。是根据google发表的论文翻版的。论文为GFS(Google File System)Google 文件系统(中文,英文)。
  2. Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件上的分布式文件系统。HDFS体系结构中有三类节点,一类是NameNode,又叫”名称节点/元数据节点”;另一类是DataNode,又叫”数据节点”;还有一个是Secondary NameNode,称为“第二名称节点”。

2.HDFS架构设计

这里写图片描述

  • 角色分配:

这里写图片描述

1. Client:客户端,系统使用者,调用HDFS API操作文件;与NN交互获取文件元数据;与DN交互进行数据读写。
2. Namenode

存储:

  • 文件系统的命名空间,文件名称,文件目录结构,文件的属性[权限,创建时间,副本数];
  • 文件对应哪些数据块–>数据块对应哪些datanode节点
  • 当然namenode节点不会持久的存储这种映射关系,是通过集群在启动和运时,datanode定期发送blockReport给namenode,以此namenode在内存中来动态维护的这种映射关系

作用:管理文件系统的命名空间。它维护着文件系统树及整棵树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件fsimage和编辑日志文件editlog。

3.Datanode

存储:

  • 数据块和数据块校验和
  • 与Namenode通信:
  • 每隔3秒发送一个心跳包
  • 每十次心跳发送一次blockReport.

作用(主要):读写文件的数据块

4.Scondarynode

存储:fsimage+editlog

作用:定期合并fsimage+editlog文件为新的fsimage推送给namenode.俗称检查点动作,checkpoint.

参数:fs.checkpoint.period–>1h fs.checkpoint.size–>64M

下图为原理图:
这里写图片描述

3.副本放置策略

  1. 第一副本:放置在上传文件的DataNode上;如果是集群外提交,则随机挑选一台磁盘不太慢、CPU不太忙的节点上;
  2. 第二副本:放置在于第一个副本不同的机架的节点上;
  3. 第三副本:与第二个副本相同机架的不同节点上;
  4. 如果还有更多的副本:随机放在节点中;
    这里写图片描述

4.文件写流程

1.写流程的整个过程

这里写图片描述
1. Client调用FileSystem.creat(filePath)方法,创建文件;
2. FileSystem与元数据节点进行RPC通信,在文件系统的命名空间中创建一个新的文件,元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件,但是并不关联任何block。(假如不成功,就返回错误信息,所以写代码要try-catch);
3. FileSystem返回FSDataOutputStream对象,客户端进行写数据;在client写入数据时,FSDataOutputStream对象将它分成一个个的包,写入内部队列,称为数据队列(data queue)。数据流(Data Streamer)处理数据队列,数据流的责任是根据适合的datanode的列表要求namenode分配适合的新块来存储数据副本。这一组datanode列表形成一个管线(pipeline)————默认副本数是3,所以有3个节点在管线中;
4. 数据流将包分流给管线中第一个的datanode,这个节点会存储包并且发送给管线中的第二个datanode。同样地,第二个datanode存储包并且传给管线中的第三个数据节点;
5. DFSOutputStream也有一个内部的数据包队列来等待数据节点(datanode)收到确认,称为确认队列。一个包只有在被管线中所有的节点确认后才会被移除出确认队列,此时数据写入成功;
6. 当客户端结束写入数据,则调用stream的close函数。
7. 最后再调用FileSystem.complete()方法,告诉元数据节点写入成功。
注意:如果数据节点(datanode)在写入的过程中失败,关闭管线(pipeline),确认队列中的任何包都会被添加回数据队列的前面,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从管线(pipeline)中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。

总结:这一方法不仅提供了很好的稳定性(数据块存储在两个机架中)并实现很好的负载均衡,包括写入带宽(写入操作只需要遍历一个交换机)、读取性能(可以从两个机架中选择读取)和集群中块的均匀分布(客户端只在本地机架上写入一个块)。

2分部解析
1.角色定位

这里写图片描述

  • 客户端:负责文件切割
  • NN:为数据块分配DN地址
  • DN:存储数据,并将数据冗余备份多个DN中
2.用户向客户端发送请求

这里写图片描述
HDFS中的存储单元是block。文件通常被分成64或128M一块的数据块进行存储。与普通文件系统不同的是,在HDFS中,如果一个文件大小小于一个数据块的大小,它是不需要占用整个数据块的存储空间的。

3.文件切分

这里写图片描述

4.文件分配

这里写图片描述

5.数据写入

这里写图片描述

6.写入成功

这里写图片描述

5.文件读流程

HDFS采用的是“一次写入多次读取”的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。

这里写图片描述
1. 初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件;
2. FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址;
3. FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据(当然读操作对于Client端是透明的);
4. 这些datanode根据他们与client的距离来排序(根据网络集群的拓扑)。如果该client本身就是一个datanode,便从本地datanode中读取;(体现了数据本地化)
5. 当此数据块读取完毕时,FSDataInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点;
6. 当客户端读取完毕数据的时候,调用FSDataInputStream的close函数,关闭输入流。
注意:在读取的时候,如果client与datanode通信时遇到一个错误,那么它就会去尝试对这个块来说下一个最近的块。它也会记住那个故障节点的datanode,以保证不会再对之后的块进行徒劳无益的尝试。client也会确认datanode发来的数据的校验和。如果发现一个损坏的块,它就会在client试图从别的datanode中读取一个块的副本之前报告给namenode。
总结:这个设计的一个重点是,client直接联系datanode去检索数据,并被namenode指引到块中最好的datanode。因为数据流在此集群中是在所有datanode分散进行的。所以这种设计能使HDFS可扩展到最大的并发client数量。同时,namenode只不过提供块的位置请求(存储在内存中,十分高效),不是提供数据。否则如果客户端数量增长,namenode就会快速成为一个“瓶颈”。

扩展:源码解析
过程详解

1.用户需求

这里写图片描述

2.客户端向NN发送要求

这里写图片描述

3.NN返回该文件的部分或全部的block列表

这里写图片描述

4.读取数据(就近原则)

这里写图片描述

(参考地址:36dsj.com)

6.常用命令

1.hadoop fs == hdfs dfs (等价)
2.查询命令
[hadoop@zydatahadoop001 ~]$ hdfs dfs -ls /
Found 2 items
drwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmp
drwxr-xr-x   - hadoop supergroup          0 2017-12-19 00:36 /user

逆序查询
[hadoop@zydatahadoop001 ~]$ hdfs dfs -ls -r /  
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2017-12-19 00:36 /user
drwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmp

显示所有目录结构
[hadoop@zydatahadoop001 ~]$ hdfs dfs -ls -R /  
drwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmp
drwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmp/hadoop-yarn
drwx------   - hadoop supergroup          0 2017-12-19 00:40 /tmp/hadoop-yarn/staging
drwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmp/hadoop-yarn/staging/hadoop
drwx------   - hadoop supergroup          0 2017-12-19 00:49 /tmp/hadoop-yarn/staging/hadoop/.staging
drwxr-xr-x   - hadoop supergroup          0 2017-12-19 00:40 /tmp/hadoop-yarn/staging/history
drwxrwxrwt   - hadoop supergroup          0 2017-12-19 00:40 /tmp/hadoop-yarn/staging/history/done_intermediate
drwxrwx---   - hadoop supergroup          0 2017-12-19 00:49 /tmp/hadoop-yarn/staging/history/done_intermediate/hadoop
-rwxrwx---   1 hadoop supergroup      59514 2017-12-19 00:49 /tmp/hadoop-yarn/staging/history/done_intermediate/hadoop/job_1513614870362_0001-1513615072017-hadoop-QuasiMonteCarlo-1513615771997-5-1-SUCCEEDED-default-1513615335075.jhist
-rwxrwx---   1 hadoop supergroup        358 2017-12-19 00:49 /tmp/hadoop-yarn/staging/history/done_intermediate/hadoop/job_1513614870362_0001.summary
-rwxrwx---   1 hadoop supergroup     135003 2017-12-19 00:49 /tmp/hadoop-yarn/staging/history/done_intermediate/hadoop/job_1513614870362_0001_conf.xml
drwxr-xr-x   - hadoop supergroup          0 2017-12-19 00:36 /user
drwxr-xr-x   - hadoop supergroup          0 2017-12-19 00:49 /user/hadoop
3.创建命令
创建文件夹
[hadoop@zydatahadoop001 ~]$ hdfs dfs -mkdir /demo1
[hadoop@zydatahadoop001 ~]$ hdfs dfs -ls /
Found 3 items
drwxr-xr-x   - hadoop supergroup          0 2017-12-19 10:15 /demo1
drwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmp
drwxr-xr-x   - hadoop supergroup          0 2017-12-19 00:36 /user

创建文件
[hadoop@zydatahadoop001 ~]$ hdfs dfs -touchz /demo1/test.txt

[hadoop@zydatahadoop001 ~]$ hdfs dfs -ls /demo1/
Found 1 items
-rw-r--r--   1 hadoop supergroup          0 2017-12-19 10:18 /demo1/test.txt
4.上传文件(写)
[hadoop@zydatahadoop001 ~]$ hdfs dfs -put demo1.txt /demo1

[hadoop@zydatahadoop001 ~]$ hdfs dfs -ls /demo1/
Found 2 items
-rw-r--r--   1 hadoop supergroup          7 2017-12-19 10:27 /demo1/demo1.txt
-rw-r--r--   1 hadoop supergroup          0 2017-12-19 10:18 /demo1/test.txt
5.查看文件(读)
[hadoop@zydatahadoop001 ~]$ hdfs dfs -cat /demo1/demo1.txt
aaaaaa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值