我眼中的大数据(二)——HDFS

Hadoop的第一个产品是HDFS,可以说分布式文件存储是分布式计算的基础,也可见分布式文件存储的重要性。如果我们将大数据计算比作烹饪,那么数据就是食材,而Hadoop分布式文件系统HDFS就是烧菜的那口大锅。这些年来,各种计算框架、各种算法、各种应用场景不断推陈出新,让人眼花缭乱,但是大数据存储的王者依然是HDFS。

为什么HDFS的地位如此稳固呢?在整个大数据体系里面,最宝贵、最难以代替的资产就是数据,大数据所有的一切都要围绕数据展开。HDFS作为最早的大数据存储系统,存储着宝贵的数据资产,各种新的算法、框架要想得到人们的广泛使用,必须支持HDFS才能获取已经存储在里面的数据。所以大数据技术越发展,新技术越多,HDFS得到的支持越多,我们越离不开HDFS。 HDFS也许不是最好的大数据存储技术,但依然最重要的大数据存储技术

那我们就从HDFS的原理说起,今天我们来聊聊HDFS是如何实现大数据高速、可靠的存储和访问的。

Hadoop分布式文件系统HDFS的设计目标是管理数以千计的服务器、数以万计的磁盘,将这么大规模的服务器计算资源当作一个单一的存储系统进行管理,对应用程序提供数以PB计的存储容量,让应用程序像使用普通文件系统一样存储大规模的文件数据。

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:9f8e511d-893e-4580-b812-05d94b577a68

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:72f450eb-8691-43c0-b4db-55e601ce4191

我们想想RAID磁盘阵列存储,RAID将数据分片后在多块磁盘上并发进行读写访问,从而提高了存储容量、加快了访问速度,并通过数据的冗余校验提高了数据的可靠性,即使某块磁盘损坏也不会丢失数据。将RAID的设计理念扩大到整个分布式服务器集群,就产生了分布式文件系统,Hadoop分布式文件系统的核心原理就是如此。

和RAID在多个磁盘上进行文件存储及并行读写的思路一样,HDFS是在一个大规模分布式服务器集群上,对数据分片后进行并行读写及冗余存储。因为HDFS可以部署在一个比较大的服务器集群上,集群中所有服务器的磁盘都可供HDFS使用,所以整个HDFS的存储空间可以达到PB级容量。

我眼中的大数据(二)——HDFS

上图是HDFS的架构图,从图中你可以看到HDFS的关键组件有两个,一个是DataNode,一个是NameNode。

DataNode负责文件数据的存储和读写操作,HDFS将文件数据分割成若干数据块(Block),每个DataNode存储一部分数据块,这样文件就分布存储在整个HDFS服务器集群中。应用程序客户端(Client)可以并行对这些数据块进行访问,从而使得HDFS可以在服务器集群规模上实现数据并行访问,极大地提高了访问速度。

在实践中,HDFS集群的DataNode服务器会有很多台,一般在几百台到几千台这样的规模,每台服务器配有数块磁盘,整个集群的存储容量大概在几PB到数百PB。

NameNode负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名、数据块的ID以及存储位置等信息。HDFS为了保证数据的高可用,会将一个数据块复制为多份(缺省情况为3份),并将多份相同的数据块存储在不同的服务器上,甚至不同的机架上。这样当有磁盘损坏,或者某个DataNode服务器宕机,甚至某个交换机宕机,导致其存储的数据块不能访问的时候,客户端会查找其备份的数据块进行访问。

下面这张图是数据块多份复制存储的示意,图中对于文件/users/sameerp/data/part-0,其复制备份数设置为2,存储的BlockID分别为1、3。Block1的两个备份存储在DataNode0和DataNode2两个服务器上,Block3的两个备份存储DataNode4和DataNode6两个服务器上,上述任何一台服务器宕机后,每个数据块都至少还有一个备份存在,不会影响对文件/users/sameerp/data/part-0的访问。

我眼中的大数据(二)——HDFS

和RAID一样,数据分成若干数据块后存储到不同服务器上,可以实现数据大容量存储,并且不同分片的数据可以并行进行读/写操作,进而实现数据的高速访问。你可以看到,HDFS的大容量存储和高速访问相对比较容易实现,但是HDFS是如何保证存储的高可用性呢?

我们尝试从不同层面来讨论一下HDFS的高可用设计。

1.数据存储故障容错

磁盘介质在存储过程中受环境或者老化影响,其存储的数据可能会出现错乱。HDFS的应对措施是,对于存储在DataNode上的数据块,计算并存储校验和(CheckSum)。在读取数据的时候,重新计算读取出来的数据的校验和,如果校验不正确就抛出异常,应用程序捕获异常后就到其他DataNode上读取备份数据。

2.磁盘故障容错

如果DataNode监测到本机的某块磁盘损坏,就将该块磁盘上存储的所有BlockID报告给NameNode,NameNode检查这些数据块还在哪些DataNode上有备份,通知相应的DataNode服务器将对应的数据块复制到其他服务器上,以保证数据块的备份数满足要求。

3.DataNode故障容错

DataNode会通过心跳和NameNode保持通信,如果DataNode超时未发送心跳,NameNode就会认为这个DataNode已经宕机失效,立即查找这个DataNode上存储的数据块有哪些,以及这些数据块还存储在哪些服务器上,随后通知这些服务器再复制一份数据块到其他服务器上,保证HDFS存储的数据块备份数符合用户设置的数目,即使再出现服务器宕机,也不会丢失数据。

4.NameNode故障容错

NameNode是整个HDFS的核心,记录着HDFS文件分配表信息,所有的文件路径和数据块存储信息都保存在NameNode,如果NameNode故障,整个HDFS系统集群都无法使用;如果NameNode上记录的数据丢失,整个集群所有DataNode存储的数据也就没用了。

所以,NameNode高可用容错能力非常重要。NameNode采用主从热备的方式提供高可用服务,请看下图。

集群部署两台NameNode服务器,一台作为主服务器提供服务,一台作为从服务器进行热备,两台服务器通过ZooKeeper选举,主要是通过争夺znode锁资源,决定谁是主服务器。而DataNode则会向两个NameNode同时发送心跳数据,但是只有主NameNode才能向DataNode返回控制信息。

正常运行期间,主从NameNode之间通过一个共享存储系统shared edits来同步文件系统的元数据信息。当主NameNode服务器宕机,从NameNode会通过ZooKeeper升级成为主服务器,并保证HDFS集群的元数据信息,也就是文件分配表信息完整一致。

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:e2ff899f-5040-4a40-b043-68c287cf5950

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:29d621ed-c14c-4970-9156-1bdc13b0bfba

而分布式系统可能出故障地方又非常多,内存、CPU、主板、磁盘会损坏,服务器会宕机,网络会中断,机房会停电,所有这些都可能会引起软件系统的不可用,甚至数据永久丢失。

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:530552e2-32ee-4aed-90d1-8de0daa86191

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:2cc4a1a6-49c6-48ea-a6de-960f920c3b4b

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:8f393a27-79c1-4c16-9db5-1ac6a973d1df

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:8e590829-5777-4511-91b8-81d4c612ec9e

比如 冗余备份,任何程序、任何数据,都至少要有一个备份,也就是说程序至少要部署到两台服务器,数据至少要备份到另一台服务器上。此外,稍有规模的互联网企业都会建设多个数据中心,数据中心之间互相进行备份,用户请求可能会被分发到任何一个数据中心,即所谓的异地多活,在遭遇地域性的重大故障和自然灾害的时候,依然保证应用的高可用。

当要访问的程序或者数据无法访问时,需要将访问请求转移到备份的程序或者数据所在的服务器上,这也就是 失效转移。失效转移你应该注意的是失效的鉴定,像NameNode这样主从服务器管理同一份数据的场景,如果从服务器错误地以为主服务器宕机而接管集群管理,会出现主从服务器一起对DataNode发送指令,进而导致集群混乱,也就是所谓的”脑裂”。这也是这类场景选举主服务器时,引入ZooKeeper的原因。ZooKeeper的工作原理,我将会在后面专门分析。

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:8093f891-dd10-4884-89d1-1cd946825316

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:e02f46f6-294a-45cf-bb33-fb07957bcc17

我们小结一下,看看HDFS是如何通过大规模分布式服务器集群实现数据的大容量、高速、可靠存储、访问的。

1.文件数据以数据块的方式进行切分,数据块可以存储在集群任意DataNode服务器上,所以HDFS存储的文件可以非常大,一个文件理论上可以占据整个HDFS服务器集群上的所有磁盘,实现了大容量存储。

2.HDFS一般的访问模式是通过MapReduce程序在计算时读取,MapReduce对输入数据进行分片读取,通常一个分片就是一个数据块,每个数据块分配一个计算进程,这样就可以同时启动很多进程对一个HDFS文件的多个数据块进行并发访问,从而实现数据的高速访问。关于MapReduce的具体处理过程,我们会在专栏后面详细讨论。

3.DataNode存储的数据块会进行复制,使每个数据块在集群里有多个备份,保证了数据的可靠性,并通过一系列的故障容错手段实现HDFS系统中主要组件的高可用,进而保证数据和整个系统的高可用。

Original: https://www.cnblogs.com/hhhnicvscs/p/16719579.html
Author: 平凡程序猿
Title: 我眼中的大数据(二)——HDFS

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/561841/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Ubuntu装机

    更新源 sed -ri ‘s/http:\/\/(cn.)?archive.ubuntu.com\/ubuntu\//https:\/\/mirrors.tuna.tsinghua…

    大数据 2023年5月27日
    061
  • Python笔记 之 sqlite3模块

    sqlite3安装 Python可以使用sqlite3 模块对SQLite3进行操作。 Python 2.5.x 以上版本默认自带安装sqlite3模块。 sqlite3示例 连接…

    大数据 2023年11月10日
    031
  • Java中的强制转换

    在Java中,之所以需要强制类型转换是为了防止程序员在不知情的情况下把A类型数据错当成B类型的数据。 强制转换的方法: 如将double类型转换为int类型; java;gutte…

    大数据 2023年6月3日
    087
  • Flink中State管理与恢复之Savepint案例

    Savepoints 是检查点的一种特殊实现,底层实现其实也是使用 Checkpoints 的机制。 Savepoints 是用户以手工命令的方式触发 Checkpoint,并将结…

    大数据 2023年5月25日
    070
  • BERT如何解决一词多义问题

    知乎上有一个这样的问题: Bert 在pretrain的时候 每个字的输出都是经过一个分类层后去预测自己 由于分类层中的权重是固定的 所以不管输入和中间的encoding有多么的复…

    大数据 2023年5月28日
    089
  • 数仓工具—Hive源码之SQL解析的应用SQL优化(9)

    ; SQL解析的应用 数据库作为核心的基础组件,是需要重点保护的对象。任何一个线上的不慎操作,都有可能给数据库带来严重的故障,从而给业务造成巨大的损失。为了避免这种损失,一般会在管…

    大数据 2023年11月13日
    031
  • 0

    000 posted on2022-02-28 23:21 风中明月 阅读(5 ) 评论() 编辑 Original: https://www.cnblogs.com/nzpdbk…

    大数据 2023年6月3日
    076
  • 如何在linux上安装sqlite数据库

    如何在linux上安装sqlite数据库 一、下载 二、解压 三、配置(configure) 四、编译和安装 五、执行sqlite3程序 六、测试代码 一、下载 首先要先下载sql…

    大数据 2023年11月12日
    075
  • jenkins构建go及java项目

    jenkins构建go及java项目 转载请注明出处https://www.cnblogs.com/funnyzpc/p/14554017.html 写在前面 jenkins作为j…

    大数据 2023年6月3日
    088
  • ant-design-vue运行时动态切换主题色

    1.创建项目 使用vue-cli V3.0+创建项目 vue ;create ;antd-vue-theme-demo 选择css预处理器(其他的根据项目所需选择) 由于ant-d…

    大数据 2023年5月26日
    068
  • hive sql 优化记录

    大数据 2023年11月14日
    045
  • Hive语法及其进阶(二)

    1、使用JDBC连接Hive 1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import jav…

    大数据 2023年5月26日
    062
  • qt环境下sqlite3教程

    本操作在qt环境下完成。1、添加sqlite3的源代码文件,sqlite3.cpp和sqlite3.h。这两个文件可以在网上自己下载。2、Pro文件中添加 LIBS+=-ldl。 …

    大数据 2023年11月11日
    053
  • Solr部署到Tomcat

    1、版本选择 solr-5.3.1.tgz apache-tomcat-8.0.29.tar.gz 2、解压tomcat和solr [root@iZ23exixsjaZ solr]…

    大数据 2023年6月3日
    077
  • spark学习记录之join引发重复计算

    一直对spark sql中的join操作感到迷惑, 如果join之前的操作没有进行persist DataFrame的话,是否会存在让之前的transformation重复执行的问…

    大数据 2023年6月3日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球