百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

HDFS概述(hdfs技术原理)

wxin55 2024-11-11 14:42 18 浏览 0 评论

HDFS定义


HDFS(Hadoop Distributed File System) 是一个分布式文件系统,用于存储和管理大规模数据集。它主要适用于一次写入,多次读取的场景,支持追加记录,但是不支持记录的修改。

HDFS优缺点


优点

  • 具有高可靠性和容错性:数据自动保存多个副本,通过增加副本来增加可靠性,且其中某个副本丢失之后,可以根据其他节点自动恢复。
  • 适合处理大规模数据:可以处理大规模数据,比如TB级甚至PB级的文件,能够处理百万规模以上的文件数量。
  • 高可扩展性:HDFS可以构建在廉价机器上,只需添加更多的节点,就能轻松扩展以处理大规模数据,这种可扩展性使其适用于应对不断增长的数据量。
  • 适合批处理:移动计算比移动数据更划算。这样就能降低网络阻塞的影响,提高系统数据的吞吐量。
  • 支持流式数据访问:一次性写入,多次读取,保证数据一致性。

缺点

  • 不适合处理低延迟的数据访问:HDFS通常用于批量数据处理,对于需要低延迟的实时数据访问场景不太适用,读取数据的响应时间会较长
  • 不适合处理大量的小文件:对于存储在HDFS文件系统中的文件,HDFS都会开销一部分内存来存储它的元数据(包括目录和块信息等),存储大量小文件,会占用NameNode大量的内存来存储文件目录和块信息,NameNode的内存是有限的,太多的小文件会增加NameNode的负担,甚至会使其崩溃。
  • 不支持并发写入:一个文件只能同一时间只能有一个写,不允许多个线程同时写;仅支持数据追加(append),不支持文件的随机修改。

HDFS架构


HDFS采用master/slave架构。HDFS集群主要由NameNode、Secondary NameNode、Client和一定数目的DataNodes组成。

NameNode(NN)

Namenod相当于Master,是一个中心服务器,负责元数据股那里和客户端对文件的访问等。

  • 元数据管理:NameNode负责管理HDFS的元素据,包括文件和目录结构、文件的位置信息、文件权限和命名空间等。
  • 块映射:NameNode维护一个块到数据节点的映射表,它记录了每个数据块的副本存储在哪些数据节点上。
  • 客户端请求处理:NameNode处理客户端的文件系统请求,例如创建、删除、重命名文件或目录,以及读取文件的元数据信息。

DataNode(DN):

相当于Slave,是文件系统中真正存储数据的地方,执行NameNode下达的命令。

  • 数据块存储:DataNode负责存储实际的数据块。他们根据NameNode的指示将数据块写入本地磁盘,并在需要时将数据块传送给客户端。
  • 块信息报告:DataNode周期性地向NameNode发送报告,告知NameNode其存储的数据块信息。
  • 数据块复制:如果某个副本损坏,数据块的副本数降到设定的阈值以下,DataNode会复制丢失的块副本,以维护数据的可靠性。

Secondary NameNode(2NN)

辅助NameNode,负责定期合并fsimage和edits日志,减轻NameNode负担。

  • 元数据备份:Secondary NameNode的主要作用是定期备份NameNode元数据。它并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务,只是备份元数据。
  • 日志合并:负责定期合并fsimage和edits日志,减小edits日志大小。


因为内存需求和NameNode在一个数量级上,所以通常Secondary NameNode和NameNode运行在不同的机器上

Secondary NameNode的必要性

NameNode将对文件系统的改动和追加保存到本地文件系统上的一个日志文件(edits)。当一个NameNode启动时,它首先从一个映像文件(fsimage)中读取HDFS的状态,接着应用日志文件中的edits操作。然后将新的HDFS状态写入(fsimage)中,并使用一个空的edits文件开始正常操作。因为NameNode只有在启动阶段才合并fsimage和edits,所以久而久之日志文件可能会变得非常庞大,日志文件太大的副作用是下一次NameNode启动会花很长时间。

Client

提供命令行界面与HDFS交互,也可以编写应用程序与HDFS交互。

HDFS副本存放机制


副本的存放是HDFS可靠性和性能的关键。优化的副本存放策略是HDFS区分于其他大部分分布式文件系统的重要特性。HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。

通过机架感知的过程,Namenode可以确定每个Datanode所属的机架id。一个简单但没有优化的策略就是将副本存放在不同的机架上。这样可以有效防止当整个机架失效时数据的丢失,并且允许读数据的时候充分利用多个机架的带宽。这种策略设置可以将副本均匀分布在集群中,有利于当组件失效情况下的负载均衡。但是,这种策略的一个写操作需要传输数据块到多个机架,增加了写数据的代价。

默认情况下,HDFS的副本数为3。HDFS的存放策略是将一个副本存放在本地机架的节点上,一个副本放在同一机架的另一个节点上,最后一个副本放在不同机架的节点上。这种策略减少了机架间的数据传输,这就提高了写操作的效率。机架的错误远远比节点的错误少,所以这个策略不会影响到数据的可靠性和可用性。于此同时,因为数据块只放在两个(不是三个)不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。这一策略在不损害数据可靠性和读取性能的情况下改进了写的性能。

HDFS块大小


HDFS中的文件在物理上是分块存储(Block),换句话说数据块是HDFS中的基本存储单位,通常默认为128MB,可以通过配置参数(dfs.blocksize)适当修改块大小。

文件快大小不能设置太大,也不能设置太小。HDFS的块设置太小,会增加寻址时间;块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。根据具体的业务日志情况,可以调整dfs.blocksize参数的值以优化HDFS的性能和存储效率。

通常,对于大规模数据处理工作,较大的数据块大小(如128MB或256MB)可能更合适,可以提高数据处理性能。如果需要处理大量小文件,可以考虑减小数据块的大小,以最大程度地减少存储浪费和提高小文件的写入性能。因为HDFS默认情况下不会将多个小文件内的数据合并到一个数据块内,即使小文件的实际大小小于数据块大小,HDFS也会将它们分成不同的数据块,不会将多个小文件的数据合并到一个数据块内。这样的话就会造成每个小文件都独占一个数据块,但实际上数据块内存并没有充分利用,就造成了内存浪费。

欢迎大家关注我的公众号,后续会不断更新大数据相关技术文章。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: