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

HDFS基础部分详解

精选30云产品,助力企业轻松上云!上一篇文章Hadoop系列之1.0和2.0架构中,提到了Google的三驾马车,关于

精选30+云产品,助力企业轻松上云!>>> hot3.png

上一篇文章 Hadoop 系列之 1.0和2.0架构 中,提到了 Google 的三驾马车,关于分布式存储,计算以及列式存储的论文,分别对应开源的 HDFS,Mapreduce以及 HBase。这里的 HDFS 是分布式文件系统,主要用于数据的存储。它的应用非常广泛,作为一款开源的文件系统,其高容错性、可靠性以及可部署在廉价机器上的特点,受到很多开发者的青睐。


今天我们就来撩一撩这个分布式文系统,HDFS 全称 Hadoop Distributed File System,初学者只需要知道我们大数据解决的两个主要问题就可以了,一个是数据如何存储,另一个是数据如何计算。本文的 HDFS 就是数据存储的一种方式。好了,说了这么多,大家应该对这个 HDFS 有一个清晰的认识了吧?说白了,就是一个文件系统,但是与我们普通的文件系统有很多不同。比如:多副本,分布式,自动备份等等。


有人会问了,Hadoop 不是凉了吗?Spark, Flink 才是未来。O__O "…


这样说是不全面的,带有全盘否定的眼光。我们常说的 Hadoop 是指 HDFS + MapReduce + Yarn,其中 HDFS 和 Yarn 在如今的流式计算中也发挥着重要的作用,后面会提到。事实上有很多离线数仓都是使用 Hive 跑在 MapReduce 计算框架之上的。抓住技术的发展趋势没错,但是作为初学者,学习思想不会错,对比每个框架的架构思想,你会发现,不管是宝刀未老的 Hadoop ,还是站在巨人肩膀上的 Flink, 都是基于分布式的思想,在 CAP 之间权衡,为我们的大数据提供更快速的算力,为我们的数据提供更可靠的港湾。


1 HDFS 是什么

它是一个分布式文件存储系统,全称是 Hadoop Distributed File System 。HDFS is built using the Java language。为什么会出现这个呢?想象一个场景,数据随着业务的增长飞快的积累,达到了PB甚至更大的量级,这时候受网络带宽和单机节点的资源限制的影响,海量的数据无法进行存储,如何存储,万一数据丢了怎么办?这一系列问题,在 HDFS 中都将迎刃而解。HDFS 就是解决海量数据的存储问题。百度网盘就是一个现实的例子,它的成功离不开分布式存储技术。


2 HDFS 的优缺点

优点:

  • 处理海量数据,TB , PB ...

  • 支持处理百万规模以上的文件数量, 10k+节点

  • 适合批处理 ,移动计算而非数据,数据位置暴露给计算框架

  • 可构建在廉价机器上

  • 可靠性高,多个副本

  • 自动创建多个副本,副本丢失后自动恢复,高容错性


缺点:

  • 不支持毫秒级别

  • 吞吐量达但受限于延迟

  • 不允许修改文件(其实本身支持,但不这么做,为了性能)


当然上面不是我瞎编出来的,下面是官方的说明,请对号入座。

7870f43f8a36a11c31e4dc624b8c63d9faf.jpg

点击图片放大  


3 HDFS 的组成

下面来说一下 HDFS 包含的两个大的角色:

NameNode 和 DataNode。了解 web 系统结构的小伙伴一定知道主备架构,master/slave 这样的设计。没错,HDFS 的 NameNode 和 DataNode 就是 master 和 slave 的关系。


d3f768668ca612189373805079747015009.png              

   

通过上面这张图也可以看出:


NameNode 主要负责管理元数据信息,通过管理命名空间并接受客户端的读写请求。NameNode 既然管理命名空间,就意味着管理打开、关闭、重命名文件或目录等命令,同时也负责管理 blocks 和 DataNode 节点的映射管理。


DataNode 上面存储着一个个的 Block 块,那么他就会响应客户端的读写请求,同时负责执行来自 NameNode 的 block 的创建、删除、复制等等命令。


我们的 NameNode 只负责元数据的管理,主要是管理工作。数据其实上是客户端直接通过 DataNode 流入流出的、想一想,这样的设计有什么好处呢?当我们数据请求很多时,我们的 NameNode 是没有什么压力的,全部的压力都在 DataNode 上面,我们只需要水平扩展数据节点就可以提高整个集群的吞吐量了。


NameNode 主要干这些:


  • 接受客户端的读、写请求,注意这里不是说数据通过 NameNOde 流入流出。

  • 接收 DateNode 汇报 block 列表

  • 保存元数据,元数据是基于内存的。数据包括文件的大小,归属,偏移量列表等

  • block 的位置信息,在启动的时候上报给 NN,并且动态更新。一般是3秒一次


DataNode 主要做这些:就是用来存储数据的。逻辑上分为各个block 块


4 Data 副本

因为数据被切分为 Blocks 之后,副本需要分散到集群里面,所以下面和这个放置策略很有用。(前提是你的集群配置了机架信息),这个副本数默认是 3 ,我们可以自己自定义,但是不能超过 DataNode 节点的个数,因为 NameNode 不允许 DataNode 的一个节点上有多个相同的副本。


  • 第一个副本,如果在集群内部会放到上传的这台服务器的 DN 上。如果是集群外,则会随机找一个空闲的机器。

  • 第二个副本,放置在与第一个副本 不同机架 的节点上。

  • 第三个副本,放置在与第二个副本 相同机架 的 不同 节点上。

  • 更多 副本,随机


这里也可以叫做「机架感知防止策略」

05b25dcc06849a0026fdd67a01f73dfc56c.jpg


下面是官网的描述:

fc8a27e27cf554593eb8ecde9420856beb4.jpg

点击图片放大  


5 副本选择


依据我们上面机架感知、副本放置策略,我们客户端在拿数据的时候,是基于什么样的原则呢?这个也很好理解,就近选择,也符合我们的常识。为了减少带宽和延迟,优先选择里我们客户端最近的网络节点拿数据。下面是官方的描述:


f5ff53ed35685fce78dc2456dae8a34cd0b.jpg

点击图片放大     

6 安全模式

当启动的时候,NameNode 会进入一个特殊的模式叫做安全模式。这个时候副本是不可以复制的。NameNode 接受来自 DataNode 的心跳和 block 报告信息,后者包括该数据节点承载的数据块列表。每个数据块(block)都有一个最小的副本数,如果NameNode 检查符合条件,就说明这个数据块是安全的。上面的汇报以及检查工作完成会后,再过 30 秒,就会退出安全模式了!


7 通讯协议

所有 HDFS 通信协议都基于TCP/IP协议之上。客户机建立到 NameNode 节点计算机上可配置TCP端口的连接。它与namenode对话clientProtocol。数据节点使用数据节点协议与 NameNode 通信。远程过程调用(RPC)抽象包含客户机协议和数据节点协议。根据设计,namenode从不启动任何 rpc。相反,它只响应由数据节点或客户机发出的RPC请求。


8 三种故障类型

The three common types of failures are NameNode failures, DataNode failures, and network partitions.

  • 网络延迟,通讯发生延迟,造成假死。

  • NameNode 元数据丢失

  • DataNode 数据块损坏

9 HDFS HA

这里只展示基于QJM(Quorum Journal Manager) 的HA,Active 和 Standby NameNode 通过 QJM 集群来共享 edit log 。这种方式比较优雅,可以自动的切换主备。我之前写过一篇文章就讲了 Hdfs HA 的实现原理。主要是元数据的共享和两个 NameNode 的切换。查看文章:Hadoop HA 深度解剖


3f35c61b59f235691175e05516b75254fbf.jpg 点击图片放大  

10 HDFS 读流程


b3d0f11567038c79e1858b8e06a07dd427a.jpg


角色:HDFS Client , NameNode, DateNode


1,首先 HDFS 调用 FileSystem 对象的 Open 方法获取一个 DistributedFileSystem 实例;


2, DistributedFileSystem 通过 RPC协议 获取第一批 block localtions(第一批 block 块的位置),同一个 block 和副本都会返回位置信息,这些位置信息按照 Hadoop 的拓扑结构给这些位置排序,就近原则。


3.前两部会生成一个 FSDataInputStream ,该对象会被封装 DFSInputStream 对象,DFSInputStream 可以方便的管理 DataNode 和 NameNode 数据流。客户端调用 read 方法,DFSInputStream 最会找出离客户端最近的 DataNode 并连接。


4.数据从 datanode 源源不断的流向客户端。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。


5.如果第一批 block 都读完了, DFSInputStream 就会去 NameNode 拿下一批 block 的 locations,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流。


如果在读数据的时候, DFSInputStream 和 datanode的通讯发生异常,就会尝试正在读的 block 的排序第二近的datanode,并且会记录哪个 datanode 发生错误,剩余的blocks 读的时候就会直接跳过该 datanode。DFSInputStream 也会检查 block 数据校验和,如果发现一个坏的 block, 就会先报告到 NameNode 节点,然后DFSInputStream 在其他的 Datanode 上读该 block 的镜像。该设计就是客户端直接连接 Datanode 来检索数据并且namenode 来负责为每一个 block 提供最优的 datanode,NameNode 仅仅处理 block location 的请求,这些信息都加载在 NameNode 的内存中,hdfs 通过 DataNode 集群可以承受大量客户端的并发访问。


RPC 跨越了传输层和应用层。RPC 使得开发包括网络分布式多程序在内的应用程序更加容易。


11 HDFS的写流程

574827459c098b539192d0a2c939539b4e8.jpg


1、客户端通过调用 DistributedFileSystem 的 create 方法创建新文件。


2、DistributedFileSystem 通过 RPC 调用 namenode 去创建一个没有 blocks 关联的新文件,创建前, namenode 会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过, namenode 就会记录下新文件,否则就会抛出IO异常。


3、前两步结束后,会返回 FSDataOutputStream 的对象,与读文件的时候相似,FSDataOutputStream 被封装成DFSOutputStream。DFSOutputStream 可以协调 namenode 和 datanode。客户端开始写数据到 DFSOutputStream,DFSOutputStream 会把数据切成一个个小的 packet,然后排成队列 data quene。


4、DataStreamer 会去处理接受 data quene,它先询问namenode 这个新的 block 最适合存储的在哪几个 datanode 里(比如重复数是 3,那么就找到 3 个最适合的 datanode),把他们排成一个管道 pipeline 输出。DataStreamer 把packet 按队列输出到管道的第一个 datanode 中,第一个datanode 又把 packet 输出到第二个 datanode 中,以此类推。


5、DFSOutputStream 还有一个对列叫 ack quene,也是由 packet 组成等待 datanode 的收到响应,当 pipeline 中的 datanode 都表示已经收到数据的时候,这时 ack quene才会把对应的 packet 包移除掉。如果在写的过程中某个datanode 发生错误,会采取以下几步:


① pipeline 被关闭掉;


② 为了防止防止丢包。ack quene 里的 packet 会同步到 data quene 里;创建新的 pipeline 管道怼到其他正常 DN上剩下的部分被写到剩下的两个正常的 datanode 中;


③ namenode 找到另外的 datanode 去创建这个块的复制。当然,这些操作对客户端来说是无感知的。


6.客户端完成写数据后调用 close 方法关闭写入流。



推荐阅读


Hive 数据压缩格式总结


CombineFileInputFormat 文件分片总结


Hive基础部分详解




本文分享自微信公众号 - 大数据每日哔哔(bb-bigdata)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。



推荐阅读
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • 如何在U8系统中连接服务器并获取数据
    本文介绍了如何在U8系统中通过不同的方法连接服务器并获取数据,包括使用MySQL客户端连接实例的方法,如非SSL连接和SSL连接,并提供了详细的步骤和注意事项。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 深入解析:存储技术的演变与发展
    本文探讨了从单机文件系统到分布式文件系统的存储技术发展过程,详细解释了各种存储模型及其特点。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 2017年软件开发领域的七大变革
    随着技术的不断进步,2017年对软件开发人员而言将充满挑战与机遇。本文探讨了开发人员需要适应的七个关键变化,包括人工智能、聊天机器人、容器技术、应用程序版本控制、云测试环境、大众开发者崛起以及系统管理的云迁移。 ... [详细]
  • 深入探讨:Actor模型如何解决并发与分布式计算难题
    在现代软件开发中,高并发和分布式系统的设计面临着诸多挑战。本文基于Akka最新文档,详细探讨了Actor模型如何有效地解决这些挑战,并提供了对并发和分布式计算的新视角。 ... [详细]
  • 探讨低代码行业发展现状,分析其未能催生大型企业的原因,包括市场需求、技术局限及商业模型等方面。 ... [详细]
  • 英特尔推出第三代至强可扩展处理器及傲腾持久内存,AI性能显著提升
    英特尔在数据创新峰会上发布了第三代至强可扩展处理器和第二代傲腾持久内存,全面增强AI能力和系统性能。 ... [详细]
author-avatar
ddcall
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有