HDFS 纠删码技术(Erasure Coding, EC)详解 - 指南

news/2025/9/21 17:35:45/文章来源:https://www.cnblogs.com/yfceshi/p/19103880

HDFS 纠删码技术(Erasure Coding,简称 EC)是 HDFS 为解决传统副本机制存储效率低的问题而引入的核心优化技术。它依据 “数据分块 + 冗余编码” 的方式,在保证数据可靠性的前提下,大幅降低存储开销,尤其适用于海量冷数据(如归档数据、历史日志)的长期存储场景。

一、核心背景:为什么需要纠删码?

在 EC 出现前,HDFS 采用副本机制(Replication)保障素材可靠性,例如默认的 3 副本策略(1 份原始数据 + 2 份副本)。但该机制存在明显缺陷:

  • 存储开销极高:3 副本策略的存储利用率仅约 33%(1 份管用数据对应 2 份冗余),海量资料场景下会造成巨大的存储成本浪费;

  • 扩展性受限:随着数据量爆炸式增长,副本数量增加会进一步加剧存储集群的硬件压力(如磁盘、机柜空间、电力消耗)。

为解决这一痛点,HDFS 在 3.x 版本正式引入纠删码科技,其核心目标是:用 “计算冗余” 替代 “数据副本冗余”,以极少量的计算开销,换取存储效率的大幅提升

二、纠删码的核心原理

“将原始数据拆分并编码生成冗余块,通过原始块与冗余块的组合,实现数据丢失后的恢复”。HDFS 采用业界主流的就是纠删码的本质Reed-Solomon(RS)编码算法,其核心流程可拆解为 3 步:

1. 数据分块(Chunking)

将原始记录(或 HDFS 块)拆分为k 个大小相等的原始数据块(Data Chunk)。例如:原始数据大小为 10G,若 k=5,则每个原始块大小为 2GB(记为 D1、D2、D3、D4、D5)。

2. 编码生成冗余块(Encoding)

通过 RS 编码算法对 k 个原始块进行计算,生成m 个冗余块(Parity Chunk)存储原始块的数学运算结果(如异或、多项式计算)。例如:若 m=2,则生成 2 个冗余块(记为 P1、P2),此时总块数为 k+m=7。就是。冗余块的大小与原始块一致,其内容是原始块的 “校验信息”—— 不直接存储原始数据,而

3. 数据恢复(Recovery)

当存储的块(原始块或冗余块)发生丢失时,只要剩余的块数量 ≥ k(即丢失的块数量 ≤ m),就能通过 RS 解码算法,利用剩余块计算出丢失块的完整内容。

三、HDFS 纠删码的关键概念

为适配 HDFS 的分布式架构,EC 引入了以下核心概念,确保编码、存储和恢复的高效性:

概念定义作用
编码策略(Erasure Coding Policy)定义 “k(原始块数)+ m(冗余块数)” 的组合,以及编码算法(默认 RS)。标准化 EC 的配置,HDFS 协助预定义策略(如 RS-6-3-1024k、RS-3-2-1024k),也协助自定义。
编码组(Coding Group)一组用于编码的 “k 个原始块 + m 个冗余块” 的集合,是 EC 操作的主要单元。确保编码 / 解码仅在组内进行,避免跨组计算导致的性能开销。
存储策略(Storage Policy)定义编码组中块的存储位置(如不同机架、不同节点),遵循 “机架感知” 原则。避免单点故障:原始块和冗余块分散存储在不同节点 / 机架,即使部分节点 / 机架下线,仍能保证数据可恢复。
逻辑块(Logical Block)EC 机制下的 “文件块” 概念:1 个逻辑块对应 1 个编码组(k+m 个物理块)。对用户透明:用户操作文件时,感知到的仍是 “逻辑块”,无需关心底层 k+m 个物理块的存储细节。
物理块(Physical Block)编码组中的单个块(原始块或冗余块),是 HDFS 实际存储在 DataNode 上的单元。构建分布式存储:每个物理块独立存储在不同 DataNode,提升并行读写和可靠性。

四、HDFS 纠删码 vs. 传统副本机制

两者的核心差异体现在存储效率、可靠性、性能三个维度,具体对比如下:

对比维度纠删码(EC)传统副本机制(Replication)
存储效率极高:例如 RS-6-3 策略(6 原始 + 3 冗余),存储利用率约 66.7%(6/(6+3));RS-10-4 策略利用率达 71.4%。低:3 副本策略利用率仅 33.3%(1/3);2 副本策略利用率 50%,但可靠性大幅下降。
数据可靠性高:丢失 ≤m 个块即可恢复,例如 RS-6-3 可容忍 3 个块丢失,相当于 “3 副本级别的可靠性”。中高:3 副本可容忍 2 个副本丢失,但副本数量与可靠性正相关(副本越多,可靠性越高,但存储开销越大)。
读写性能读性能:正常读取时与副本机制相近;数据恢复时需计算,性能略低。
写性能:需编码生成冗余块,比副本机制多一次计算开销,写延迟略高。
读性能:高,可直接读取任意副本,无需计算。
写性能:高,仅需复制原始数据到其他节点,无额外计算。
适用场景冷数据、归档数据(如历史日志、离线计算结果):这类资料读写频率低,对存储成本敏感,可接受轻微的读写性能损耗。热数据、实时数据(如在线服务数据、实时计算输入):这类材料读写频繁,对性能要求高,可接受较高的存储开销。

五、HDFS 纠删码的优势与局限性

1. 核心优势

  • 大幅降低存储成本:是 EC 最核心的价值,例如用 RS-6-3 替代 3 副本,存储成本可降低约 50%(从 3 倍存储降至 1.5 倍)。

  • 可靠性不降级:通过 m 个冗余块,可搭建与多副本相当的可靠性(例如 RS-6-3 可容忍 3 个块丢失,等同于 3 副本的容错能力)。

  • 灵活适配场景:支持多种 “k+m” 策略(如 RS-3-2、RS-10-4),可根据业务对 “存储效率” 和 “可靠性” 的需求灵活选择。

2. 主要局限性

  • 计算开销增加:写数据时需编码生成冗余块,读丢失数据时需解码恢复,会占用 CPU 资源(尤其在大规模数据恢复场景)。

  • 延迟略高:编码 / 解码过程会增加少量读写延迟,不适用于对延迟敏感的热资料场景。

  • 复杂度提升:需管理编码组、存储策略等额外配置,且数据恢复逻辑比副本机制更复杂,对运维能力有一定要求。

六、HDFS 纠删码的典型应用场景

EC 并非替代副本机制,而是与副本机制互补,主要适用于以下场景:

  1. 冷数据归档:如企业历史业务资料、用户行为日志、离线计算任务的输出结果(如 Hive 表、Spark 计算结果),这类数据存储周期长、读写频率低,对存储成本敏感。

  2. 海量数据存储:如大数据平台中的数据湖(Data Lake),存储 PB 级甚至 EB 级数据,EC 可显著降低集群的存储硬件投入。

  3. 低成本备份:替代传统的多副本备份,用 EC 生成冗余块作为备份,在保证可靠性的同时减少备份存储开销。

七、总结

HDFS 存储架构的重要优化,其核心逻辑是就是HDFS 纠删码技术用 “编码计算” 替代 “数据复制”,在不降低可靠性的前提下,将存储利用率从 33%(3 副本)提升至 60%-70%(主流 RS 策略),大幅降低海量冷数据的存储成本。

它与传统副本机制并非 “替代关系”,而是 “场景互补”:热资料用副本保证性能,冷数据用 EC 降低成本,共同构成 HDFS 高效、可靠的存储体系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL小贴式: 用NOT EXISTS 而不是 NOT IN !!!

SQL小贴式: 用NOT EXISTS 而不是 NOT IN !!! 当使用NOT IN进行过滤时, 比如NOT IN xxx 时, 如果 xxx 中有NULL值时, 就会一行也不返回 !在 SQL 中,NOT IN 子查询遇到 NULL 值时会产生意外行为,主要因为 SQL 使用三值…

CF global round 29 CD

CF global round 29 CDCF global round 29 C 思路: 只要考虑每个 0 的位置怎么更新 考虑从当前 pos[i] 转移到下一个 pos[i+1] 的位置 分三种情况, 中间没有 1, 只要当前位置有一个位置左右两种情况都能转移 中间 1…

go语言复杂的map

go语言复杂的map 漫思

手撕大模型|FlashAttention 原理及代码解析

在当今大模型蓬勃发展的时代,训练效率成为了制约模型发展与应用的关键因素。Transformer 架构中的自注意力机制虽强大,但面临着高计算成本与内存消耗的挑战。FlashAttention 应运而生,作为一种高效的注意力计算方法…

react工程化

推荐 https://umijs.org/本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/p/19103865

CF700E Cool Slogans 做题记录

CF700E Cool Slogans 做题记录 https://www.luogu.com.cn/problem/CF700E 首先条件可以转化为,\(s_i\) 必须是 \(s_{i-1}\) 的 border,否则 \(s_i\) 可以缩短且不是变劣。 子串是后缀的前缀,所以在后缀上考虑。设 \…

完整教程:在 Ubuntu 上安装和配置 PostgreSQL 实录

完整教程:在 Ubuntu 上安装和配置 PostgreSQL 实录pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

一个MCU与FPGA混合电路上电启动的问题及其解决办法探索[原创www.cnblogs.com/helesheng]

给出了MCU与FPGA混合电路上电启动不正常现象的一种分析和对应的解决方案。最近在做一个同时需要MCU与FPGA的项目,具体说是FPGA作为MCU的FSMC(Flexible Static Memory Controller)接口的一个外设,通过SRAM接口与MCU…

Unity Volume Rendering

Unity Volume Rendering如下内容是对 https://tips.hecomi.com/entry/2018/01/05/192332 进行翻译同时增补得到笔记体积渲染概述 体积渲染是一种在 2D 屏幕上渲染 3D Texture 的技术,其中 3D Texture 来源有:从 CT 扫…

JMX与RMI

JMX与RMIJMX -监控 Jconsole -Djava.rmi.server.hostname= ip-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=XXX-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.aut…

深入解析:线程安全相关的注解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

go语言的结构体和指针

go语言的结构体和指针type Person struct {Name stringAge int }func updateName(p *Person, newName string) {p.Name = newName // 通过指针修改结构体字段 }func main() {p := Person{Name: "Tom", Age:…

通过主机监控发现路径遍历漏洞的实战技巧

本文介绍如何利用简单的Bash脚本监控主机在线状态,通过实时Telegram通知及时发现目标系统上线,并成功挖掘出Jira系统的路径遍历高危漏洞的实战经验。通过主机监控发现路径遍历漏洞 脚本功能概述 我最近编写了一个简单…

Code New Roman 字体的正确下载方式

Code New Roman 字体的上游已经不知所踪,而各大字体网站上流传的版本在 VS Code 里的显示效果也有些问题。(具体来说,字符的上边界会顶到一行的上边界。)但是我在网上冲浪时发现 Nerd Font 里有修复了这个问题的 r…

go语言中的数组类型

go语言中的数组类型var arr1 [3]int // 声明一个长度为3的整型数组 arr2 := [3]int{1, 2, 3} // 声明并初始化 arr3 := [...]string{"a", "b"} // 自动推断长度fmt.Printl…

多态是对于处理不同的变量,但是使用相同或者类似的方式。多态核心分为两种形式:编译时多态(静态多态)和运行时多态(动态多态)C++中多态通常使用虚函数或者指针(引用)实现。

多态是对于处理不同的变量,但是使用相同或者类似的方式。多态核心分为两种形式:编译时多态(静态多态)和运行时多态(动态多态)C++中多态通常使用虚函数或者指针(引用)实现。pre { white-space: pre !important;…

从 C++ 到 Python

从 C++ 到 Python 一、注释 #单行注释多行注释"""多行注释"""二、字符串 Hello, python! #单、双引号都可以,没有区别 #倾向于用单引号三、I/O与变量 #输出 print(Hello, python!) #Py…

在 Unity 中实现 0GC(零垃圾回收)对象池 — 实战指南 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Nipper 3.9.0 for Windows Linux - 网络设备漏洞评估

Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估 Nipper for routers, switches & firewalls | Nipper Network Configuration Audit Tool 请访…

c++单例实践

这篇文章为大家介绍`static` 关键字相关知识以及如何实现自己的C++单例类。C++单例实践 在日常开发中,虽然太多的单例调用会让代码的耦合度变高,但是例如日志类这种,单例模式就变得非常有。所以这篇文章为大家介绍s…