HDFS--功能及架构

1、功能

  • 文件系统 :分布式结构来存储数据,提供分布式读写实现大数据存储
  • 本质:分布式分而治之的思想
    • 写:将大的文件通过HDFS进行拆分,拆分成若干个小的块,将每个小块存储在多台机器上
    • 读:通过查询元数据,得到这个文件所有块的位置,将这个文件所有的块进行合并,返回给用户

2、应用场景

  • 适合场景
    • 大数据离线存储
    • 适合于一次写入,多次读取的场景
    • 适合于对读写速度要求不高的场景:将数据直接落地存储在硬盘的,随机读写硬盘:比较慢
      • 保存历史归档数据:我们公司永远保存近3年的数据
      • 存储采集的大数据,作为原始数据的存储
  • HDFS不适合的场景
    • 需要频繁修改的场景
    • 需要快速读写大数据
  • tips:对于小数据,则使用分布式文件系统Zookeeper:用于存储小数据,关键性的数据,重要的配置、索引信息等等

3、特点

分块机制将大文件进行拆分

  • 解决问题:单台机器无法存储、存储性能比较差
  • 默认规则:128M一个块,不足128M,按照实际大小存储
  • 能不能改?
    • 可以,修改配置文件hdfs-site.xml,修改必须重新格式化
<property>
        <name>dfs.blocksize</name>
        <value>134217728</value>
</property>
  • 问题1:300M文件,存储在HDFS上,一共会被切分为几个块?
    • 3个块
    • Block1:128M可以存储到第一台机器【Linux文件系统】
    • Block2:128M可以存储到第二台机器【Linux文件系统】
    • Block3:44M可以存储到第三台机器【Linux文件系统】
  • 测试上传一个170M左右的JDK
    观察HDFS底层
    HDFS--功能及架构

副本机制HDFS的数据如何保证安全

  • 解决问题:任何一台机器宕机故障,都不会导致数据的丢失,保证数据的完整性
  • 问题2:300M文件,存储在HDFS上,一共会被切分为3个块,如果第一台机器宕机了,这份数据怎么保证能完整的读取到?会导致数据丢失,数据无法完成恢复
  • 解决:对每个块构建副本
  • 默认:HDFS会为每个数据块构建2个副本,每个块总共存3份
    一个300M的文件,存储在HDFS上总共占用了900M的空间
  • 能不能改?
    • 可以,修改配置文件:hdfs-site.xml
<property>
        <name>dfs.replication</name>
        <value>3</value>
</property>

HDFS--功能及架构

4、架构

分布式主从架构

主节点:NameNode:一个

功能

功能一之接客:接受所有客户端的请求

  • 因为NameNode就是HDFS入口,你希望NameNode在哪台机器,就配置哪台机器core-site.xml文件中fs.defaultFS配置,该配置【将机器从逻辑上合并】,配置HDFS的统一地址
  • 不论客户端在哪台机器提交的命令,都是请求给了你配置的机器的NameNode

功能二之管理

心跳机制:管理所有DataNode的死活

  • 所有的DataNode在启动以后都要向NameNode进行注册
  • 每一台DataNode定期向NameNode发送一个心跳【信号】,NameNode接受到信号,就代表这台DataNode没问题,如果长时间没有接收到某台DataNode的心跳,NameNode就认为这个DataNode有问题,就不会分配存储任务给这台DataNode
  • 向你报道之后,隔段时间就发你个信号,告诉你我还活着,可以给我分配任务

汇报机制:管理所有的数据安全的

  • 所有的DataNode都要定期的发送当前自己这台机器上存储了哪些数据汇报给NameNode,NameNode会根据汇报的信息来判断是否有数据丢失,如果有数据丢失,就通过副本恢复数据,保证每个块始终会有三份
  • 定期向你汇报我这存了什么,你做好账本(元数据),缺了就赶紧补上,保证我们的子弹充足
  • 例如:三台机器,每台机器都存储了数据
    • 如果其中一台机器宕机了或者数据丢失了【更换硬盘】,在汇报时,NameNode就会发现这台机器宕机,数据丢失了,就要将这台机器本来存储的所有块恢复到另外两台机器上,保证所有的数据永远有3份
  • 问题:NameNode只负责接客和管理,又不存储数据,它如何知道DataNode的数据是否丢失了?
    • 负责维护内存元数据【metadata】理解:账本【数据存储索引】
      元数据:每个文件被分成了哪些块,这些块被存储在了哪些机器上
file{
block1{node1,node2,node3},
block2{node2,node4,node5},
block3(node5,node2,node1)
}
  • 为什么要存储元数据?
    • 当用户进行读取时,要根据元数据获取当初这个文件的每个块存储的位置,然后读取每个块,合并返回给用户
    • 当DataNode汇报时,要对比元数据,看是否有数据丢失,保证数据安全

从节点:DataNode:多个

每一个DataNode就是一台存储的机器,主要负责实现数据的读写

功能

  • 与对应的机器的文件系统进行交互
  • 将文件块写入文件系统
  • 从文件系统中将文件块读取出来

客户端

功能

  • 写:拆分
  • 读:合并

问题:数据有没有经过NameNode?

功能

  • 数据是不经过NameNode的
  • 数据都是客户端直接于DataNode进行交互
上一篇:2020-11-24


下一篇:不新鲜的集群重新格式化namenode,用hdfs namenode -format报错