热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HadoopHDFS分布式存储系统入门、配置、使用及架构原理分析

文章目录一、HDFS简介1.1、为什么需要HDFS1.2、核心数据和行为数据二、核心架构和读写流程2.1、核心架构组件NameNodeSecondaryNameNodeDataNo


文章目录

    • 一、HDFS简介
      • 1.1、为什么需要HDFS
      • 1.2、核心数据和行为数据
    • 二、核心架构和读写流程
      • 2.1、核心架构组件
        • NameNode
        • Secondary NameNode
        • DataNode
        • Block
      • 2.2、读数据逻辑
      • 2.3、写数据逻辑
    • 三、基本命令使用
    • 四、分布式可靠性保障
      • 3.1、副本冗余
      • 3.2、机架策略
      • 3.3、心跳机制
      • 3.4、安全校验
      • 3.5、数据恢复
    • 附:HDFS环境配置


HDFS是Hadoop的底层分布式存储系统,是Hadoop分布式计算的底层基石,要使用Hadoop就必须学习HDFS的使用。本文介绍了为什么要使用HDFS、HDFS的基本使用、核心架构组成以及分布式可靠性保障机制。



一、HDFS简介

HDFS全称为Hadoop Distributed File System,即为Hadoop提供的分布式文件系统,Hadoop底层的存储能力都是基于HDFS来提供,所以认为HDFS是整个Hadoop体系的底层核心基石。HDFS的特点是采用了低成本的硬件设计模式,具备很高的容错性,可以部署在价格低廉的普通服务器上,通过多台服务器组成HDFS集群从而提供分布式存储的能力。


1.1、为什么需要HDFS

为什么需要HDFS?一般来说普通的应用使用MySQL、Oracle甚至Redis这类数据库就可以满足数据的存储需求:
在这里插入图片描述

但是随着数据量越来越大,需要进行存储和分析的数据已经达到GB甚至TB级,那么如果仍然采用MySQL这类数据库进行存储,会十分占用存储资源,并且由于单表数据量过大, I/O的消耗也是巨大的,每次查询都需要很长时间,而且在复杂的数据分析时需要Join多个表,可能会引发系统的阻塞,所以在大数据量下(GB/TB级)不太建议使用MySQL这类数据库对数据进行存储。
那什么存储资源是廉价的、可拓展的呢?就是硬盘。硬盘作为计算机底层存储资源,由于其读写速度远不如内存的读写速度,所以十分廉价,假设一个廉价的服务器装上了500GB容量的硬盘,那么当我们要存储2TB容量的数据时,就可以采用4台500GB容量的服务器来对其分割后进行存储。如果采用这种方式存储数据,那么整体的数据存储成本就会比用MySQL这类数据库存储低得多,这就是HDFS的核心思想:数据切割+分布式存储。
在这里插入图片描述


1.2、核心数据和行为数据

关于什么数据需要存储在HDFS中,不仅是要求数据有大的数量级,一般还要求其为行为数据。这里引入两个概念,分别是核心数据和行为数据,核心数据指的是系统正常运转和服务所需要的数据,比如在交易过程中的订单数据、物流数据等,缺少了核心数据系统将无法运转,这些核心数据一般存储在数据库中;而行为数据指的是在产生核心数据的这个过程中,附带产生的操作行为带来的数据,比如操作日志数据、操作过程数据等等,缺少了行为数据也不阻碍系统正常运转。

对于HDFS来说,主要是存储大量的行为数据,以辅助对核心数据的分析、用户操作的分析等等,从而利用好这些大数据对商业变现做出价值。


二、核心架构和读写流程


2.1、核心架构组件

HDFS的核心架构组件图如下,主要分为Client、NameNode、SecondaryNameNode、DataNode这四个核心组件。
在这里插入图片描述


NameNode


  • 存储文件的描述元数据,运行时所有数据都保存到内存,整个HDFS可存储的文件数受限于NameNode的内存大小,当NameNode内存无法容纳下描述元数据时则无法继续在HDFS中新增数据
  • 一个Block在NameNode中对应一条记录(一般一个Block记录占用150字节),如果是大量的小文件,会消耗大量内存。因此Hadoop建议存储少数的大文件而不是多数的小文件。
  • 数据会定时保存到本地磁盘,但不保存block的位置信息,而是由DataNode注册时上报和运行时维护(NameNode中与DataNode相关的信息并不保存到NameNode的文件系统中,而是NameNode每次重启后,动态重建)
  • NameNode失效则整个HDFS都失效了,所以要保证NameNode的可用性,NameNode是HDFS系统的入口

Secondary NameNode

因为NameNode是HDFS的入口,当NameNode出现故障时整个HDFS都不可用,所以需要提供一个备份节点,当主NameNode故障时进行转移采用备份NameNode节点,这是一种常见的主从备份机制。而Secondar NameNode就是NameNode的备份,定时与NameNode进行同步,以保障HDFS的可用性。


DataNode


  • 保存具体的block数据
  • 负责数据的读写操作和复制操作
  • DataNode启动时会向NameNode报告当前存储的数据块信息,后续也会定时报告修改信息
  • DataNode之间会进行通信,复制数据块,保证数据的冗余性

Block

上文一直提到的Block块也就是HDFS中存储数据的基本单位,默认一个Block为64M,每个DataNode中会根据数据的大小将其切分为不同的Block,每个Block又默认含有两份副本。使用Block的原因是:


  • 大的块可以减少磁盘寻道时间
  • 减少数据块的数量,每个Block都需在NameNode中注册一个记录,所以块越大则记录越少

2.2、读数据逻辑

在这里插入图片描述

HDFS读数据的逻辑如上图所示,过程如下:


  1. 客户端Client向NameNode发送读取请求
  2. NameNode返回文件的所有Block和这些Block所在的DataNodes(包括复制节点)
  3. 客户端Client直接从DataNode中读取数据,如果该DataNode读取失败则从复制节点中读取(如果读取的数据就在本机,则直接读取,否则通过网络读取)

2.3、写数据逻辑

HDFS写数据的逻辑如上图所示,过程如下:
在这里插入图片描述


  1. 客户端Client将文件写入本地磁盘的 HDFS Client 文件中
  2. 当临时文件大小达到一个 Block 大小时,HDFS Client 通知 NameNode,申请写入文件
  3. NameNode 在 HDFS 的文件系统中创建一个文件,并把该 Block Id 和要写入的 DataNode 的列表返回给客户端
  4. 客户端收到这些信息后,将临时文件写入 DataNodes

  • 4.1 客户端将文件内容写入第一个 DataNode(一般以 4kb 为单位进行传输)
  • 4.2 第一个 DataNode 接收后,将数据写入本地磁盘,同时也传输给第二个 DataNode
  • 4.3 依此类推到最后一个 DataNode,数据在 DataNode 之间是通过 pipeline 的方式进行复制的
  • 4.4 后面的 DataNode 接收完数据后,都会发送一个确认给前一个 DataNode,最终第一个 DataNode 返回确认给客户端
  • 4.5 当客户端接收到整个 block 的确认后,会向 NameNode 发送一个最终的确认信息(ACK机制)
  • 4.6 如果写入某个 DataNode 失败,数据会继续写入其他的 DataNode。然后 NameNode 会找另外一个好的 DataNode 继续复制,以保证冗余性
  • 4.7 每个 block 都会有一个校验码,并存放到独立的文件中,以便读的时候来验证其完整性
    5.文件写完后(客户端关闭),NameNode 提交文件,文件才可见,如果提交前,NameNode 垮掉,那文件也就丢失了

三、基本命令使用

HDFS的使用很简单,熟悉Linux命令的使用者可以快速地上手,以下是HDFS常用的命令整理,注意其他文件和路径名是指HDFS内部的对象,在使用前需要先初始化生产HDFS文件系统并启动:

$ hadoop namenode -format;
$ start-dfs.sh;

在这里插入图片描述


四、分布式可靠性保障

HDFS是分布式的系统,所以务必会存在若干个服务器节点,各个节点间通过网络进行通信,那么就会存在分布式系统的可靠性问题(CAP或BASE理论),所以HDFS主要从以下几个方面来保障了系统的分布式可靠性。


3.1、副本冗余

HDFS的通过副本冗余机制来保障数据块Block的冗余,默认一个Block被保存为3份,可通过hdfs-site.xml配置文件进行配置。通过副本冗余机制,使得DataNode出现故障时也不会出现单点问题,只要其他DataNode中存在备份的Block即可继续完成数据操作,当Block恢复后会再继续同步备份。


3.2、机架策略

HDFS在进行副本冗余时,会通过机架策略来选择不同机架的DataNode节点来备份Block,这里的“机架”可以理解为一个局域网内的节点集合,可通过hadoop-site.xml配置文件进行配置,将不同的服务器规划到不同的机架中。机架策略可以避免副本都存在于同一网络之中,因为网络故障通常会在局域网范围内传播,很可能导致同一网络下的其他节点也不可使用,所以需要通过机架策略将副本放到其他局域网中,达到网络隔离的效果。


3.3、心跳机制

NameNode会周期性从DataNode接受心跳信息和Block信息,以检查各个DataNode是否可用,当某个DataNode不可用时则会将其标识为宕机节点,不会对其进行数据写入和读取等I/O操作,当其恢复后会继续连接到NameNode中执行后续的同步操作。


3.4、安全校验

在HDFS启动过程中会进行Block副本数目安全校验,如果Block的副本数目符合规定数目则启动,否则会先进行数据备份,直到Block副本数符合规定的数目才进行启动。


3.5、数据恢复

HDFS在删除文件时,数据其实是放入回收站路径/trash中,而回收站里的文件是可以快速恢复的,可以设置一个时间值,当回收站里文件的存放时间超过了这个值,就被彻底删除,并且释放占用的Block。


附:HDFS环境配置

HDFS环境配置也就是Hadoop的环境配置了,可以参考下面的文章进行配置,需要注意的是在启动hadoop时,需要使用指定好的用户登陆系统并进行启动,否则会提示权限问题。


  • Hadoop环境搭建详解_楚兴-CSDN博客
  • 安装hadoop3.0版本踩坑_风雨落-CSDN博客

推荐阅读
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。 ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • SSAS入门指南:基础知识与核心概念解析
    ### SSAS入门指南:基础知识与核心概念解析Analysis Services 是一种专为决策支持和商业智能(BI)解决方案设计的数据引擎。该引擎能够为报告和客户端应用提供高效的分析数据,并支持在多维数据模型中构建高性能的分析应用。通过其强大的数据处理能力和灵活的数据建模功能,Analysis Services 成为了现代 BI 系统的重要组成部分。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 在前一篇文章《Hadoop》系列之“踽踽独行”(二)中,我们详细探讨了云计算的核心概念。本章将重点转向物联网技术,全面解析其基本原理、应用场景及未来发展前景。通过深入分析物联网的架构和技术栈,我们将揭示其在智能城市、工业自动化和智能家居等领域的广泛应用潜力。此外,还将讨论物联网面临的挑战,如数据安全和隐私保护等问题,并展望其在未来技术融合中的重要角色。 ... [详细]
  • 全面解析:Hadoop技术栈中的Linux操作系统概览
    全面解析:Hadoop技术栈中的Linux操作系统概览 ... [详细]
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • 本文详细介绍了如何在PHP中记录和管理行为日志,包括ThinkPHP框架中的日志记录方法、日志的用途、实现原理以及相关配置。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
author-avatar
U友47919166
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有