HDFS 分布式存储基石

HDFS 分布式存储基石

HDFS简介

HDFS是Hadoop 分布式文件系统。

所处角色

在这里插入图片描述

基本概念

  • 基于JAVA实现的一个分布式文件系统
  • 基于unix/linux
  • 是Hadoop最重要的核心组件
  • 支持顺序写入,而非随机定位读写

HDFS前提和设计目标

  • 存储超大文件
    HDFS 适合存储大文件,单个文件大小通常在百MB以上
    HDFS适合存储海量文件

  • 硬件容错
    基于普通机器搭建,硬件错误是常态而不是异常,因此错误检测和快速、自动的恢复是HDFS最核心的架构目标

  • 流式数据访问
    为数据批处理而设计,关注数据访问的高吞吐量

  • 简单的一致性模型
    一次写入,多次读取
    一个文件经过创建、写入、关闭之后就不需要改变

  • 本地计算
    将计算移动到数据附近

HDFS构成及工作原理解析

基本构成

  • 数据块
    • 文件以块为单位进行切分存储,块通常设置的比较大(最小6M,默认128M)
    • 块越大,寻址越快,读取效率越高,但同时由于MapReduce任务也是以块为最小单位来处理,所以太大的块不利于对数据的并行处理
    • 一个文件至少占用一个块(逻辑概念)
  • Namenode与Datanode
    • namenode负责维护整个文件系统的信息,包括:整个文件树,文件的块分布信息,文件系统的元数据,数据复制策略等
    • datanode存储文件内容存储文件内容,负责文件实际的读写操作,保持与namenode的通信,同步文件块信息

数据读写过程

集群结构

在这里插入图片描述

HDFS读取写入过程

在这里插入图片描述
通过网络拓扑图判断距离
在这里插入图片描述

namenode深入

作用

  • Namespace管理:负责管理文件系统的树状目录结构以及文件与数据块的映射关系
  • 块信息管理:负责管理文件系统中文件的物理块与实际存储位置的映射关系BlocksMap
  • 集群信息管理:机架信息,datanode信息
  • 集中式缓存管理:从Hadoop2.3开始,支持datanode将文件缓存到内存中,这部分缓存通过NN集中管理

存储结构

  • 内存:Namespace数据,BlocksMap数据,其他信息
  • 文件:
    • 已持久化的namespace数据:FsImage
    • 未持久化的namespace操作:Edits

启动过程
在这里插入图片描述

  1. 开启安全模式:不能执行数据修改操作
  2. 加载fsimage
  3. 逐个执行所有Edits文件中的每一条操作将操作合并到fsimage,完成后生成一个空的edits文件
  4. 接受datanode发送来的心跳消息和块信息
  5. 根据以上信息确定文件系统状态
  6. 退出安全模式
  • 安全模式:文件系统只接受读数据请求,而不接受删除、修改等变更请求
  • 什么情况下进入:NameNode主节点启动时,HDFS进入安全模式
  • 什么时候退出:系统达到安全标准时,HDFS退出安全模式
    • dfs.namenode.safemode.min.datanodes : 最小可用datanode数量
    • dfs.namenode.safemode.threshold-pct : 副本数达到最小要求后的block占系统总block数的百分比
    • dfs.namenode.safemode.extention : 稳定时间
  • 相关命令:
    • hdfs dfsadmin -safemode get : 查看当前状态
    • hdfs dfsadmin -safemode enter : 进入安全模式
    • hdfs dfsadmin -safemode leave : 强制离开安全模式
    • hdfs dfsadmin -safemode wait : 一直等待直到安全模式结束

HDFS HA

  • Datanode:通过数据冗余保证数据可用性
  • Namenode:在2.0之前存在SPOF风险,从2.0后:
    1.把name.dir指向NFS(Network File System)——冷备
    在这里插入图片描述
    2.QJM方案(公司常用)——热备
    在这里插入图片描述

HDFS文件格式

HDFS支持任意文件格式

HDFS文件类型

列式与行式存储
在这里插入图片描述

HDFS文件类型

常用文件类型
在这里插入图片描述
如何使用?

ALTER TABLE table_name SET FILEFORMAT PARQUET;
CREATE TABLE table_name (x INT, y STRING) STORED AS PARQUET;
SET hive.default.fileformat=Orc

HDFS常用设置及常见问题

常用配置

配置文件路径:$ HADOOP_HOME $/etc/hadoop
主要配置文件:

  • hdfs-site.xml
  • core-site.xml
    在这里插入图片描述

常见问题

  • 小文件问题
    • 定义: 大量大小小于块大小的文件
    • 实际场景: 网页, Hive动态分区插入数据等
    • 背景: 每个文件的元数据对象约占150byte, 所以如果有1千万个小文件,
    • 每个文件占用一个block, 则NameNode大约需要2G空间。 如果存储1亿个文件, 则NameNode需要20G空间; 数据以块为单位进行处理。
    • 影响: 占用资源, 降低处理效率
    • 解决方案:
      • 从源头减少小文件
      • 使用archive打包
      • 使用其他存储方式, 如Hbase, ES等

Namenode管理

大数据量下的namenode问题:

  1. 启动时间边长
  2. 性能开始下降
  3. NameNode JVM FGC风险较高

解决方案:

  1. 根据数据增长情况,预估namenode内存需求,提前做好预案
  2. 使用HDFS Federation,扩展NameNode分散单点负载
  3. 引入外部系统支持NameNode内存数据
  4. 合并小文件
  5. 调整合适的BlockSize

反思问题

  • 数据块的复制策略?
  • 调整块的大小会造成哪些影响?
  • namenode 启动过程?
  • namenode HA方案?
  • secondary namenode 的作用?
  • hdfs常用文件格式有哪些? 各有什么优缺点?
  • 如何扩展HDFS的存储容量?

猜你喜欢

转载自blog.csdn.net/JeremyJiaming/article/details/87991195
今日推荐