5分钟深入浅出 HDFS

通过前面几篇文章的介绍,我们深入讨论了 Hadoop MapReduce 处理数据的过程,以及优化 MapReduce 性能的方方面面。 期间被反复提及的 HDFS 分布式文件存储系统,一直没有机会深入讲解。那么今天我们就仔细学习一下 HDFS 是如何工作的。

HDFS架构

HDFS Client

大家还记得我们如何向 Hadoop cluster 提交任务吗?是通过 Hadoop client 进行的。

同样,我们和 HDFS 打交道也是通过一个 client library. 无论读取一个文件或者写一个文件,我们都是把数据交给 HDFS client,它负责和 Name nodes 以及 Data nodes 联系并传输数据。

Name Nodes

我们在之前的文章中简要提及过 HDFS 把文件存在多个机器上,并且不把“在哪些机器上存的”,“如何存的”这些内部的信息暴露给使用者,而是只显示给用户一个像普通 linux 文件结构的文件系统。

那么,是谁在管理这些信息的呢?这就是 Name nodes.

在 HDFS 里, Name node 保存了整个文件系统信息,包括文件和文件夹的结构。其实和 linux 上的真的很像, HDFS 也是把文件和文件夹表示为 inode, 每个 inode 有自己的所有者,权限,创建和修改时间等等。HDFS 可以存很大的文件,所以每个文件都被分成一些 data block,存在不同机器上, name node 就负责记录一个文件有哪些 data block,以及这些 data block 分别存放在哪些机器上。

Name nodes 还负责管理文件系统常用操作,比如创建一个文件,重命名一个文件,创建一个文件夹,重命名一个文件夹等。

当我们通过 HDFS client 向 HDFS 读取或者写文件时,所有的读写请求都是先发给 Name nodes, 它负责创建或者查询一个文件,然后再让 HDFS client 和 Data nodes 联系具体的数据传输。

Data Nodes

存储 data block 的机器叫做 Data nodes. 在读写过程中,Data nodes 负责直接把用户读取的文件 block 传给 client,也负责直接接收用户写的文件。

当我们读取一个文件时:

  • HDFS client 联系 Name nodes,获取文件的 data blocks 组成、以及每个 data block 所在的机器以及具体存放位置;
  • HDFS client 联系 Data nodes, 进行具体的读写操作;

重要的事情说三遍。在读写一个文件时,当我们从 Name nodes 得知应该向哪些 Data nodes 读写之后,我们就直接和 Data node 打交道,不再通过 Name nodes.

数据备份

大家猜猜企业存储数据时最头疼的事情是什么?

实际操作中最头疼的事,不是数据量太大或者读写速度不够快,而是数据丢失。

有很多企业存储着客户重要信息,尤其是和钱打交道的信息,一旦丢失,会造成很坏的经济和声誉影响。而实际中,一个中等大小的数据中心就有上千台机器存储数据,这些机器每天都在高负荷运转,所以发生故障,比如硬盘损毁,或者电源故障,经常发生。有多经常?Google 做过统计,Google 全世界运行的数据中心中,每年有1000台机器要出故障,几千个硬盘会出错,一个电源分配设备出故障,造成500到1000台机器停止运行6小时。

那么 HDFS 是如何保证在机器故障情况下文件数据依然不丢失的呢?如题,就是数据备份,说白了就是多存几份。那究竟多存几份呢?这是一个可以配置的参数,从1到很大;如果我们不去配置,HDFS 默认3份。

Rack

不知道大家有没有去过数据中心,就是存放运行 Hadoop 和 HDFS 的机器的地方,那里的计算机和我们平常用的 PC 不太一样,有若干台机器垂直地组成一个 Rack,像一个书架一样。

通常,一个 rack 共享一个电源,一条网线,一个交换机;据统计,很多数据中心里的故障都是一整个 rack 出问题。出于这个原因,HDFS 备份数据的时候,(假设还是3份),通常在同一个 rack 上储存一份,然后在另一个 rack 上储存另两份。这样就保证数据有更高的安全性。

别忘了 HDFS 存储文件是以 block 为单位的,所以备份也是以 block 为单位的。

Name nodes 也需要知道每个 Data node 所在的 rack, 这样才能给 client 提供准确信息 。这个知识是 HDFS 启动时数据中心管理员配置给 Name nodes 的。

备份的读写选择

问题来了:如果 HDFS 为每一个 block 存三份,那 client 如何来写呢?同时向三个 data node 写吗?

不是的。当 client 写文件创建新 block 的时后,Name nodes 会为这个 block 创建一个整个 HDFS cluster 里独有的 block ID,并且决定哪些 Data nodes l来存储这个 block 的所有备份。这些被选择的 Data nodes 组成一个队列,client 向队列的第一个 Data node 写,那么第一个 Data node 除了把数据存在自己的硬盘上以外,还要把数据传给队列里的下一个 data node,如此这般,直到最后一个 data node 接到数据完毕。如下图所示

同样的,当 HDFS client 读取一个文件时,它首先从 Name nodes 获得这个文件所有 blocks 和每个 block 的所有备份所在机器位置。当 client 开始读取 block 时,client 会选择从“最近”的一台机器读取备份(“最近”指的是网络延迟最短),如果第一个备份出现问题,比如网络突然中断,或者硬盘出故障,那 client 就从第二个备份读,以此类推。

预告

综上,这篇文章洋洋洒洒为大家介绍了 HDFS 的架构和如何实现读写容错。其实容错性对于所有分布式系统都是个重要问题,下篇文章我们就为大家介绍 Hadoop MapReduce 是如何实现容错的,这也是 Hadoop 被称为业界良心的重要原因之一,欢迎大家继续关注我们。

原文发布于微信公众号 - 包子铺里聊IT(baozitraining)

原文发表时间:2015-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT大咖说

你只知大数据的便利,却不知漏洞——hadoop安全完整解析

内容来源:2017 年 07 月 29 日,威客安全技术合伙人安琪在“CDAS 2017 中国数据分析师行业峰会”进行《大数据平台基础架构hadoop安全分析》...

28440
来自专栏加米谷大数据

Spark Streaming应用与实战全攻略

有一块业务主要是做爬虫抓取与数据输出,通过大数据这边提供的SOA服务入库到HBase,架构大致如下:

19930
来自专栏hadoop学习

深度解析大快DKM大数据运维管理平台功能

之前几周的时间一直是在围绕DKhadoop的运行环境搭建写分享,有一些朋友留言索要了dkhadoop安装包,不知道有没有去下载安装一探究竟。关于DKHadoop...

27550
来自专栏美图数据技术团队

大数据集群安全组件解析(含代码)

感谢阅读「美图数据技术团队」的第 5 篇文章,关注我们持续获取美图最新数据技术动态。

18820
来自专栏美图数据技术团队

大数据集群安全组件解析

大数据集群的基本是数据以及用于计算的资源,企业将相应的数据和资源开放给对应的用户使用,防止被窃取、破坏等,这些都涉及到大数据安全。基于以上关键点,考虑到美图公司...

34800
来自专栏个人分享

大数据全体系年终总结

  1、文件存储当然是选择Hadoop的分布式文件系统HDFS,当然因为硬件的告诉发展,已经出现了内存分布式系统Tachyon,不论是Hadoop的MapRed...

18250
来自专栏祝威廉

如何基于Yarn开发你的分布式程序

这篇文章不会具体教你如何使用Yarn的API,但是会教你我实践过后的一些经验。接下来的内容会探讨以下两个主题:

10140
来自专栏about云

Apache Hadoop 3.0.0-alpha1版发布做了哪些改进

问题导读 1.hadoop3.x必须使用哪个版本的jdk? 2.hadoop3.x是否可以配置5个namenode? 3.hadoop除了可以使用swift,还...

37980
来自专栏腾讯大数据的专栏

Hadoop Raid-实战经验总结

分布式文件系统用于解决海量数据存储的问题,腾讯大数据采用HDFS(Hadoop分布式文件系统)作为数据存储的基础设施,并在其上构建如Hive、HBase、Spa...

329100
来自专栏PPV课数据科学社区

一文看懂HIVE和HBASE的区别

两者分别是什么Apache Hive是一个构建在hadoop基础设施之上的数据仓库。通过Hive可以使用HQL语言查询存放在HDFS上的数据。HQL是一种类SQ...

54380

扫码关注云+社区

领取腾讯云代金券