HDFS笔记

HDFS(分布式文件系统)

1 HDFS架构

HDFS (Hadoop Distributed File System) Hadoop分布式文件系统。
作用:

解决海量数据存储问题—分布式文件系统(多台计算机存储)
突破单体服务器的存储能力。

在学习HDFS的使用前,我们先来了解下HDFS的架构和相关的概念。无论使用何种技术,大规模数据存储都要解决以下几个核心问题:

  • 数据存储容量的问题 :大数据要解决的是数以PB计的数据计算问题,而一般的服务器磁盘容量通常以TB为单位,那么如何存储这么大规模的数据/li>
  • 数据读写速度的问题:一般磁盘的连续读写速度为几十MB,以这样的速度,几十PB的数据恐怕要读写到天荒地老。
  • 数据可靠性的问题:磁盘大约是计算机设备中最易损坏的硬件了,通常情况一块磁盘使用寿命大概是一年,如果磁盘损坏了,怎么保证数据不丢失/li>

HDFS的架构是围绕这几方面问题的解决展开设计。

1.1 数据块和副本

1.1.1 数据块

HDFS上存储的大文件通常无法在一个节点上完整存储,就需要将文件拆分成多个数据块(block)分散存储,默认是128MB。其实单一磁盘上的文件系统,也是将文件划分成块大小的多个分块,但是和HDFS的块相比要小的多(4KB)。与面向单一磁盘的文件系统不同的是,HDFS的块会被存放到大数据机器集群上不同的机器。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ed00imYR-1630554804591)(HDFS笔记.assets/image-20210216103319198.png)]

HDFS的块为什么这么大/p>

HDFS的块默认为128MB是为了匹配现有的硬件的传输速度。现有的服务器机房局域网网络千兆带宽=125MB/s,磁盘读写速度100~300MB/s

block过小:块的数量变多,增加了文件的寻址次数,也就增加了文件整体的寻址开销。
block过大:会导致单个block读取时间过长,影响该部分数据的处理速度。且增加了单个块传输的失败几率,重试成本过高。

以后随着新一代硬件传输速度的提升,块的大小会被设置的更大。

说明:和单一磁盘文件系统对于块的处理有一点不同,单一磁盘文件系统中小于1个块大小的文件也会占用1个块的磁盘空间,而HDFS中小于1个块大小的文件不会占据整个块的空间(例如1MB的文件存储在128MB的块中,只会占用1MB的磁盘空间)。

1.1.2 副本

由于 Hadoop 被设计运行在廉价的机器上,这意味着硬件是不可靠的,为了保证容错性,HDFS 提供了数据复制机制。HDFS 将每一个文件存储为一系列的同时,每个块由多个副本来保证容错,块的大小和复制因子可以自行配置(默认情况下,块大小是 128M,默认复制因子是 3)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tDZVngy6-1630554804594)(HDFS笔记.assets/image-20210216103807178.png)]

作用:防止因为机器的单点故障,导致数据丢失。
实战参数:一般block的replication就是3个。

1.2 NameNode和DataNode

文件在文件系统中存储有2部分信息:

  • 元数据:保存文件的描述信息(类型、权限、所有者、大小等等)
  • 数据:文件中真正的数据部分(对应着数据块)

在HDFS集群中有专门管理元数据的NameNode节点和保存数据块的DataNode节点。HDFS 遵循主/从架构,HDFS集群节点由单个 NameNode(NN) 和多个 DataNode(DN) 组成:

  • NameNode :

    1. 基于内存管理文件的元数据(文件路径、权限信息、大小、副本数、数据块、数据块DN列表)

      张3.avi -rwxrwxrwx root root 500M 3 [blk1,blk2,…]

    2. 管理着集群中所有DataNode节点信息,是集群的管理者(master)

      datanode12 ip地址 磁盘容量 磁盘使用情况
      datanode13 ip地址 磁盘容量 磁盘使用情况

      目的:掌握datanode健康状况,了解磁盘容量,数据分布的负载均衡。
      均衡使用datanode的磁盘空间。 集合多个datanode服务器的网络带宽,提高数据传输速度。

  • DataNode

    1. 保存实际的文件数据(文件切分后的数据块),并负责处理client发起的数据读写请求
    2. 是HDFS集群的从节点(Slave)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uzhIXdUz-1630554804595)(HDFS笔记.assets/image-20210216112649479.png)]

1.3 心跳和块状态报告

在集群环境下,因为网络割裂或者DataNode宕机会导致一部分Datanode跟Namenode失去联系。NameNode如何获取最新在线的DataNode节点信息br> 解决方案:心跳机制(heartBeat)

每个Datanode节点周期性(3s)地向Namenode发送心跳信号。Namenode通过心跳信号的缺失来检测这一情况,并将这些近期(10min)不再发送心跳信号的Datanode标记为宕机,不会再将新的IO请求发给它们。

因为HDFS运行在廉价的机器上,DataNode上的数据块在长时间使用后很可能会损坏。NameNode如何获取到最新的数据块状态呢br> 解决方案:块状态报告(blockreport)

DataNode会定期上报datanode中的存储的block的信息到Namenode,如果上报的信息中没有包含某个块的信息,则说明该块已经损坏。
示例:dn1中存储blk1、blk2一共2个块,上报块状态时如果发现blk2已经损坏,只会上报blk1的块信息,NameNode没有收到blk2的信息,则认为blk2已经损坏

说明:NameNode中并不会存储节点信息和块的存储信息,在HDFS启动后由DataNode通过心跳和块状态报告获取。

那么,还有一个问题:DataNode是如何判断一个块是否损坏br> 解决方案:校验和(CheckSum、数字指纹)

DataNode在存储数据块的时候会同时存储其checksum。datanode定期,计算本节点存储的block的checksum,判断是否和之前的checksum保持一致。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-voPzY9RN-1630554804597)(HDFS笔记.assets/image-20210216120702640.png)]

1.4 文件的写流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TiFOKKoj-1630554804598)(HDFS笔记.assets/image-20210216123201457.png)]

写流程:

  1. Client首先将要存储的数据切分成若干块,然后向NameNode发送存储请求
  2. NameNode检查权限、存储文件是否已存在等信息,确认无误后返回允许存储的响应,这个响应还包括第一个Block要存放的DataNode列表的信息(比如DN1、DN3、DN4)。
  3. Client得到NameNode的响应,打开文件输出流,向第一个DataNode请求打开管道,DN1接受的信息后继续通知DN3,DN3接受到DN1的信息后通知DN4,DN4接受到信息后确认没有更多副本了,向DN3返回响应信息,DN3获取到DN4的响应后向DN1返回响应,DN1得到响应后向Clinet返回响应
  4. Clinet获得响应后,确认pipeline(管线,管线上每个节点都能收到相同的数据流)已开通,开始写入数据。
  5. Client在确认block1完成传输后,向NameNode发送请求,确认block1已存入,NN更新自己的元数据,并返回block2的存储地址
  6. 重复,直到所有block都存入。

1.5 文件的读流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dWW35OXz-1630554804599)(HDFS笔记.assets/image-20210216125637278.png)]

读流程:

  1. Client访问NameNode,查询元数据信息,获得这个文件的数据块和每个数据块的DN列表
  2. 客户端Client会选取离客户端最近的DataNode来读取block;。
  3. 读取完当前block的数据后,关闭当前的DataNode链接,并为读取下一个block寻找最佳的DataNode;。
  4. 客户端接收数据后,先在本地缓存,然后写入目标文件。

2 安装(伪分布式)

软件下载地址:点击这里

  1. 集群规划(在1台机器上搭建伪分布式)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3cyuCOQ3-1630554804600)(HDFS笔记.assets/image-20210803220914711.png)]

  2. 服务器环境准备

  3. 安装HDFS(Hadoop中包含HDFS)

    hadoop目录结构

  4. 初始化配置文件(hadoop-2.9.2/etc/hadoop/)

    1. haddop-env.sh配置jdk环境变量

    2. core-site.xml 配置服务访问地址和数据保存位置

    3. hdfs-site.xml 配置副本个数

    4. slaves 配置slave(也就是DataNode的节点ip)

  5. 格式化HDFS(第1次安装HDFS格式化文件系统)

  6. 启动HDFS

  7. 验证

3 搭建知识补充

  1. 日志查看(查看hdfs运行异常)

  2. HDFS(配置错误修正)

  3. Web界面

  1. 查看DataNode信息

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ZbnlPQz-1630554804601)(HDFS笔记.assets/image-20210216152441650.png)]

  2. 管理文件元数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xE8y4wuH-1630554804602)(HDFS笔记.assets/image-20210216152609919.png)]

4 HDFS客户端

要使用HDFS管理文件,需要使用Client操作HDFS。而我们通过Client主要完成如下的操作:

  • 上传文件
  • 下载文件
  • 删除文件
  • 修改文件名(不能直接修改文件内容,可以通过2次覆盖完成修改)

4.1 HDFS命令

通过内置的hdfs命令使用Client。

  1. 命令所在的目录

  2. HDFS文件系统结构

  3. 命令格式

4.2 常用命令

命令 含义 示例代码
hdfs dfs -ls [-R] hdfs文件路径 查看文件元数据信息 hdfs dfs -ls /
hdfs dfs -mkdir -p /目录a/目录b 新建文件夹,如果父目录不存在则添加-p参数 hdfs dfs -mkdir -p /baizhi/file
hdfs dfs -put linux文件路径 hdfs文件路径 文件上传 hdfs dfs -put /opt/models/jdk /baizhi
hdfs dfs -get hdfs文件路径 linux文件路径 文件下载 hdfs dfs -get /baizhi/jdk1.8 /opt
hdfs dfs -cat hdfs文档路径 查看文件内容 hdfs dfs -cat /baizhi/Test.java
hdfs dfs -rm hdfs文件路径 删除文件 hdfs dfs -rm /baizhi/Test.java
hdfs dfs -rm -r hdfs文件夹 删除文件夹 hdfs dfs -rm -r /baizhi
hdfs dfs -chmod [-R] 权限运算值 hdfs文件
hdfs dfs -chmod [-R]

来源:程序员小许CL

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年8月1日
下一篇 2021年8月1日

相关推荐