HDFS原理详细解读

来源:互联网 发布:淘宝开店卖虚拟物品 编辑:程序博客网 时间:2024/06/05 14:56

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.写流程的整个过程

这里写图片描述

  • Client调用FileSystem.create(filePath)方法,去与Namenode进行rpc通信,check该路径的文件是否存在以及有没有权限创建该文件,假如ok,就创建一个新文件,但是并不关联任何block,返回一个FSDataOutputStream对象;(假如not ok,就返回错误信息,所以写代码要try-catch)
  • Client调用FSDataOutputStream对象的write()方法,会将第一个块写入第一个Datanode,第一个Datanode写完传给第二个节点,第二个写完传给第三节点,当第三个节点写完返回一个ackpacket给第二个节点,第二个返回一个ackpacket给第一个节点,第一个节点返回ackpacket给FSDataOutputStream对象,意思标识第一个块写完,副本数为3;然后剩余的块依次这样写;
    (当然写操作对于Client端也是透明的)
  • 当向文件写入数据完成后,Client调用FSDataOutputStream.close()方法,关闭输出流,flush缓存区的数据包;
  • 再调用FileSystem.complete()方法,告诉Namenode节点写入成功。

2分部解析

1.角色定位

这里写图片描述

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

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

3.文件切分

这里写图片描述

4.文件分配

这里写图片描述

5.数据写入

这里写图片描述

6.写入成功

这里写图片描述

5.文件读流程

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

这里写图片描述

  1. Client通过FileSystem.open(filePath)方法,去与Namenode进行rpc通信,返回该文件的部分或全部的block列表(也包含该列表各block的分布在Datanode地址的列表),也就是返回FSDataInputStream对象;
  2. Client调用FSDataInputStream对象的read()方法,
    a. 去与第一个块的最近的datanode进行read,读取完后,会check,假如successful,会关闭与当前Datanode通信;(假如check fail,会记录失败的块+Datanode信息,下次就不会读取;那么会去该块的第二个Datanode地址读取)
    b. 然后去第二个块的最近的Datanode上的进行读取,check后,会关闭与此datanode的通信。
    c. 假如block列表读取完了,文件还未结束,那么FileSystem会从Namenode获取下一批的block的列表。(当然读操作对于Client端是透明的,感觉就是连续的数据流)。
  3. Client调用FSDataInputStream.close()方法,关闭输入流.

过程详解

1.用户需求

这里写图片描述

2.客户端向NN发送要求

这里写图片描述

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

这里写图片描述

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

这里写图片描述

(参考地址:36dsj.com)

6.常用命令

1.hadoop fs == hdfs dfs (等价)

2.查询命令

[hadoop@zydatahadoop001 ~]$ hdfs dfs -ls /Found 2 itemsdrwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmpdrwxr-xr-x   - hadoop supergroup          0 2017-12-19 00:36 /user逆序查询[hadoop@zydatahadoop001 ~]$ hdfs dfs -ls -r /  Found 2 itemsdrwxr-xr-x   - hadoop supergroup          0 2017-12-19 00:36 /userdrwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmp显示所有目录结构[hadoop@zydatahadoop001 ~]$ hdfs dfs -ls -R /  drwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmpdrwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmp/hadoop-yarndrwx------   - hadoop supergroup          0 2017-12-19 00:40 /tmp/hadoop-yarn/stagingdrwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmp/hadoop-yarn/staging/hadoopdrwx------   - hadoop supergroup          0 2017-12-19 00:49 /tmp/hadoop-yarn/staging/hadoop/.stagingdrwxr-xr-x   - hadoop supergroup          0 2017-12-19 00:40 /tmp/hadoop-yarn/staging/historydrwxrwxrwt   - hadoop supergroup          0 2017-12-19 00:40 /tmp/hadoop-yarn/staging/history/done_intermediatedrwxrwx---   - 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.xmldrwxr-xr-x   - hadoop supergroup          0 2017-12-19 00:36 /userdrwxr-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 itemsdrwxr-xr-x   - hadoop supergroup          0 2017-12-19 10:15 /demo1drwx------   - hadoop supergroup          0 2017-12-19 00:37 /tmpdrwxr-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.txtaaaaaa