热门标签 | 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源创计划”,欢迎正在阅读的你也加入,一起分享。



推荐阅读
  • HDFS是什么?HDFS全称HadoopDistributedFileSystem,简称HDFS,是一个分布式文件系统。它是谷歌的GFS提出之后出现的另外一种文件系统。它有一定高 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • Hadoop + Spark安装(三) —— 调hadoop
    ***************************测试hadoop及问题跟进***************************执行以下语句报错datahadoop-2.9. ... [详细]
  • 前期Linux环境准备1.修改Linux主机名2.修改IP3.修改主机名和IP的映射关系4.关闭防火墙5.ssh免登陆6.安装JDK,配置环境变量等集群规划主机 IP安装软件运行进 ... [详细]
  • 1、概述hdfs文件系统主要设计为了存储大文件的文件系统;如果有个TB级别的文件,我们该怎么存储呢?分布式文件系统未出现的时候࿰ ... [详细]
  • 以Flink为例,消除流处理常见的六大谬见
    以Flink为例,消除流处理常见的六大谬见 ... [详细]
  • hadoop完全分布式搭建
    原文链接:hadoop完全分布式搭建主机分配以及地址要求:角色主机名IP地址Namenodemaster192.168.222.201Datanodeslave ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • Zookeeper作为Apache Hadoop生态系统中的一个重要组件,主要致力于解决分布式应用中的常见数据管理难题。它提供了统一的命名服务、状态同步服务以及集群管理功能,有效提升了分布式系统的可靠性和可维护性。此外,Zookeeper还支持配置管理和临时节点管理,进一步增强了其在复杂分布式环境中的应用价值。 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
  • 在第二课中,我们将深入探讨Scala的面向对象编程核心概念及其在Spark源码中的应用。首先,通过详细的实战案例,全面解析Scala中的类和对象。作为一门纯面向对象的语言,Scala的类设计和对象使用是理解其面向对象特性的关键。此外,我们还将介绍如何通过阅读Spark源码来进一步巩固对这些概念的理解。这不仅有助于提升编程技能,还能为后续的高级应用开发打下坚实的基础。 ... [详细]
  • 字节跳动深圳研发中心安全业务团队正在火热招募人才! ... [详细]
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社区 版权所有