大数据开发中的秘密武器:探索Hadoop纠删码的奇妙世界
随着大数据技术的发展,HDFS作为Hadoop的核心模块之一得到了广泛的应用。为了系统的可靠性,HDFS通过复制来实现这种机制。但在HDFS中每一份数据都有两个副本,这也使得存储利用率仅为1/3,每TB数据都需要占用3TB的存储空间。因此,在保证可靠性的前提下如何提高存储利用率已成为当前HDFS面对的主要问题之一。Hadoop 3.0 引入了纠删码技术(Erasure Coding),它可以提高50%以上的存储利用率,并且保证数据的可靠性。
一、什么是EC
起源
纠删码 (Erasure Code)
纠删码技术起源于通信传输领域,后被逐渐运用到存储系统中。它对数据进行分块,然后计算出一些冗余的校验块。当一部分数据块丢失时,可以通过剩余的数据块和校验块计算出丢失的数据块。
Facebook 的开源项目HDFS-RAID在HDFS之上使用了纠删码技术。HDFS-RAID对属于同一文件的块分组并依次生成校验块,将这些校验块构成独立的文件,并与原始的数据文件一一对应。RaidNode作为一个新的角色被引入进来,它负责从DataNode中读取文件的数据块,计算出校验块, 并写入校验文件中;同时,它还周期性地检查被编码了的文件是否存在块丢失,如有丢失则重新进行计算以恢复丢失的块。
HDFS-RAID的优点是其构建于HDFS之上,不需要修改HDFS本已经复杂的内部逻辑,但缺点也显而易见:校验文件对用户是可见的,存在被误删除的可能;依赖于MySQL和MapReduce来存储元数据和生成校验文件;RaidNode需要周期性地查找丢失的块,加重了NameNode的负担;使用的编解码器性能较差,在实际应用中往往不能满足要求。另外,由于缺乏维护,HDFS已将HDFS-RAID的代码从contrib包中移除,这给使用HDFS-RAID带来不少困难。
发展
2014下半年,英特尔和Cloudera共同提出了将纠删码融入到HDFS内部的想法和设计(HDFS EC),随后吸引了包括Hortonworks、华为、Yahoo!等众多公司的参与,使之成为Hadoop开源社区较为活跃的一个项目。将纠删码融入到HDFS内部带来了诸多好处:它不再需要任何的外部依赖,用户使用起来更为方便;其代码成为HDFS的一部分,便于维护;可以充分利用HDFS的内部机制使性能得到最大程度的优化。纠删码的编解码性能对其在HDFS中的应用起着至关重要的作用,如果不利用硬件方面的优化就很难得到理想的性能。英特尔的智能存储加速库(ISA-L)提供了对纠删码编解码的优化,极大的提升了其性能。
二、EC原理
原理介绍
1. 在存储系统中,纠删码技术主要是通过利用纠删码算法将原始的数据进行编码得到校验,并将数据和校验一并存储起来,以达到容错的目的。其基本思想是将k块原始的数据元素通过一定的编码计算,得到m块校验元素。对于这k+m块元素,当其中任意的m块元素出错(包括数据和校验出错),均可以通过对应的重构算法恢复出原来的k块数据。生成校验的过程被成为编码(encoding),恢复丢失数据块的过程被称为解码(decoding)。
Reed-Solomon Codes缩写为RS码,使用复杂的线性代数运算来生成多个奇偶校验块,因此可以容忍多个数据块故障。RS码在使用的时候需指定2个参数RS(n, m),n代表的是数据块的数量,m代表的是校验块的数量,校验块由数据块编码产生。
2. RS编码的编码与解码原理如图1所示。编码时,利用生成矩阵B与数据列向量D的乘积得到信息列向量D+C;重构时,利用现存的信息列向量Survivors与对应的逆矩阵B'-1 乘积得到原数据列向量D,从而达到恢复原数据的目的。

图1 RS编码的编码与重构原理
举例
举个例子:
比如:我们有 7、8、9 三个原始数据,通过矩阵乘法,计算出来两个校验数据 50、122。这时原始数据加上校验数据,一共五个数据:7、8、9、50、122,可以任意丢两个,然后通过算法进行恢复。

我们再举个简单的例子:



三、HDFS EC方案
连续布局
对HDFS的一个普通文件来说,构成它的基本单位是块。对于EC模式下的文件,构成它的基本单位为块组。块组由一定数目的数据块加上生成的校验块放一起构成。以RS(6,3)为例,每一个块组包含1-6个数据块,以及3个校验块。进行EC编码的前提是每个块的长度一致。如果不一致,则应填充0。
数据被依次写入一个块中,一个块写满之后再写入下一个块,数据的这种分布方式被称为连续布局。在一些分布式文件系统如QFS和Ceph中,广泛使用另外一种布局:条形布局。条(stripe)是由若干个相同大小单元(cell)构成的序列。在条形布局下,数据被依次写入条的各个单元中,当条被写满之后就写入下一个条,一个条的不同单元位于不同的数据块中。

文件数据被依次写入块中,一个块写满之后再写入下一个块,这种分布方式称为连续布局。
优点:
- 容易实现
- 方便和多副本存储策略进行转换
缺点:
- 需要客户端缓存足够的数据块
- 不适合存储小文件
条形布局
条(stripe)是由若干个相同大小的单元(cell)构成的序列。文件数据被依次写入条的各个单元中,当一个条写满之后再写入下一个条,一个条的不同单元位于不同的数据块中。这种分布方式称为条形布局。
优点:
- 客户端缓存数据较少
- 无论文件大小都适用
缺点:
- 会影响一些位置敏感任务的性能,因为原先在一个节点上的块被分散到了多个不同的节点上。
- 和多副本存储策略转换比较麻烦。

布局方案选择
对HDFS EC来说,首要的问题是选择什么样的布局方式。连续布局实现起来较为容易,但它只适合较大的文件。另外,如果让client端直接写一个连续布局文件需要缓存下足够的数据块,然后生成校验块并写入,以RS(6,3),blockSize=128M为例,client端需要缓存1.12G的数据,这点决定了连续布局的文件更适合由普通文件转化而来,而条形布局就不存在上述缺点。由于一个条的单元往往较小(通常为64K或1M),因此无论文件大小,条形布局都可以为文件节省出空间。client端在写完一个条的数据单元后就可以计算出校验单元并写出,因此client端需要缓存的数据很少。条形布局的一个缺点是会影响一些位置敏感任务的性能,因为原先在一个节点上的一个块被分散到了多个不同的节点上。
HDFS最初就是为较大文件设计的分布式文件系统,但随着越来越多的应用将数据存储于HDFS上,HDFS的小(即小于1个块组)文件数目越来越多,而且它们所占空间的比率也越来越高。以Cloudera一些较大客户的集群为例,小文件占整个空间的比例在36-97%之间。
基于以上分析,HDFS EC优先考虑对条形布局的支持。设计与实现也主要围绕已经实现了的条形布局展开。
四、EC的优势与劣势
优势
纠删码技术作为一门数据保护技术,自然有许多的优势,首先可以解决的就是目前分布式系统,云计算中采用副本来防止数据的丢失。副本机制确实可以解决数据丢失的问题,但是翻倍的数据存储空间也必然要被消耗,这一点却是非常致命的。EC技术的运用就可以直接解决这个问题。
劣势
EC技术的优势确实明显,但是他的使用也是需要一些代价的,一旦数据需要恢复,他会造成2大资源的消耗:
1、网络带宽的消耗,因为数据恢复需要去读其他的数据块和校验块。
2、进行编码,解码计算需要消耗CPU资源。
就是既耗网络又耗CPU。
总结
纠删码技术作为一门数据保护技术,自然有许多的优势。将纠删码技术融入到HDFS中,可以保证在同等(或者更高)可靠性的前提下,将存储利用率提高了一倍。同样的集群用户可以存储两倍的数据,这将大大减少用户硬件方面的开销。
对于EC,最好的选择是用于冷数据集群,有下面2点原因:
1. 冷数据集群往往有大量的长期没有被访问的数据,体量确实很大,采用EC技术,可以大大减少副本数。
2.冷数据集群基本稳定,耗资源量少,所以一旦进行数据恢复,将不会对集群造成大的影响。
出于上述2种原因,冷数据集群是一个很好的选择。
相关文章:

大数据开发中的秘密武器:探索Hadoop纠删码的奇妙世界
随着大数据技术的发展,HDFS作为Hadoop的核心模块之一得到了广泛的应用。为了系统的可靠性,HDFS通过复制来实现这种机制。但在HDFS中每一份数据都有两个副本,这也使得存储利用率仅为1/3,每TB数据都需要占用3TB的存储空间。因此&…...

华为数通方向HCIP-DataCom H12-831题库(单选题:301-310)
第301题 关于配置防火墙安全区域的安全级别的描述,错误的是 A、同一系统中,两个安全区域不允许配置相同的安全级别 B、只能为自定义的安全区域设定安全级别 C、安全级别一旦设定不允许更改 D、新建的安全区域,系统默认其安全级别为1 答案:D 解析: 新创建的安全区域缺省未…...

Vite 踩坑 —— require is not defined
动态require引入图片报错 require 是属于 Webpack 的方法,而我使用的是 Vite,所以我们需要去寻找 Vite 静态资源处理的方法 所以,我们只需要将代码改写以下形式即可。 template <CarouselItem v-for"(item,index) of carous…...

彻底理解操作系统与内核的区别!
通用底盘技术 Canoo公司有一项核心技术专利,这就是它们的通用电动底盘技术,长得是这个样子,非常像一个滑板: 这个带轮子、有电池、能动的滑板已经包含了一辆车最核心的组件,差的就是一个外壳。这个看起来像滑板的东西…...
微信小程序4
一自定义组件应用 1.介绍 微信小程序自定义组件是指开发者可以自定义组件,将一些常用的 UI 元素封装成一个自定义组件,然后在多个页面中复用该组件,实现代码复用和页面性能优化的效果。 2.自定义组件分为两种类型 组件模板类型:…...
OpenCV14-图像平滑:线性滤波和非线性滤波
OpenCV14-图像平滑:线性滤波和非线性滤波 1.图像滤波2.线性滤波2.1均值滤波2.2方框滤波2.3高斯滤波2.4可分离滤波 3.非线性滤波3.1中值滤波3.2双边滤波 1.图像滤波 图像滤波是指去除图像中不重要的内容,而使关心的内容表现得更加清晰的方法,…...
kafka_2.10启动Kafka broker
要启动 Kafka broker,你需要执行以下步骤: 首先,确保你已经安装了 Kafka。你可以从 Apache Kafka 的官方网站下载 Kafka 的二进制发行版,并按照官方文档中的说明进行安装。 在安装完成后,进入 Kafka 的安装目录。 打…...

【配置环境】SQLite数据库安装和编译以及VS下C++访问SQLite数据库
一,环境 Windows 11 家庭中文版,64 位操作系统, 基于 x64 的处理器SQLite - 3.43.2Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.5.3 二,SQLite简介 简要介绍 SQLite(Structured Query Language for Lite&a…...

Confluence 自定义展示页面
1. 概述 Confluence 作为知识库可通过JS脚本方式,根据登录用户或用户组进行前端页面的自定义 2. 实现方式 Confluence →管理→自定义HTML 嵌入对应JS脚本,示例如下 <script type"text/javascript">jQuery(#footer).html(<div>…...
使用C#的Socket从头实现的带有文件上传和下载功能的HTTP服务器
使用C#和Socket从头实现的带有文件上传和下载功能的HTTP服务器。它支持GET、POST请求方法,并能处理URL参数、请求体以及文件上传和下载。 using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text;class HttpServer {publi…...

【OSPF Loading、FULL状态与display ospf peer brief命令、OSPF的数据库讲解】
个人名片: 🐼作者简介:一名大二在校生,喜欢编程🎋 🐻❄️个人主页🥇:落. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️ 零基…...

除氟树脂在工业、市政含氟废水处理中的应用
含氟废水的不达标排放对自然环境有很大的危害,氟化物离子可以累积在土壤和水体中,从而对生态系统造成破坏。大量的氟化物离子会对植物生长产生不良影响,并对水生生物造成毒性作用,严重时还可能导致生态灾难。氟化物离子如果没有得…...
模拟地和数字地的区别
模拟地和数字地的主要区别体现在设计目的、处理技术、数据类型和数据精度四个方面。 设计目的:模拟地的主要设计目的是分析时空数据、进行模型和预测,它主要关注动态变化和过程。而数字地的主要设计目的是数据的存储、管理、查询和分析,在地…...

Druid连接池最小连接数设置失效问题
问题发现: 配置 当项目启动后 线程池确实是初始化了5条连接,但是当项目运行一段时间后,5条连接确消失了,只会程序用到得时候,再去初始化连接,这样有点违背了参数设置得意义,后来通过查阅资料发…...
Javascript数据类型和类型转换
Javascript数据类型和类型转换 在JavaScript中,理解数据类型,如何区分它们,以及它们如何被转换是至关重要的。在这篇文章中,我们将探讨这些主题,以帮助巩固你的JavaScript基础。 基础数据类型和引用数据类型 当涉及…...

冲刺十五届蓝桥杯P0005单词分析
文章目录 题目分析代码 题目 单词分析 分析 统计字符串中字母出现的次数,可以采用哈希表,代码采用的是数组来存储字符,将字符-97,得到对应的数组下标,将对应下标的数组;找到数组元素最大的下标ÿ…...

php获取10年内的年份并加入下拉列表
要实现的效果 在html中内嵌php循环将数组中的年份加入下拉列表 <div class="form-group"><label>年份:</label><div class="input-group"><div class="input-group-prepend"><span class="input-group-te…...

2020年亚太杯APMCM数学建模大赛B题美国总统的经济影响分析求解全过程文档及程序
2020年亚太杯APMCM数学建模大赛 B题 美国总统的经济影响分析 原题再现: 美国总统选举每四年举行一次。 2020年是美国总统大选年,共和党候选人唐纳德特朗普和民主党对手乔拜登竞选总统。 甲乙双方候选人在金融贸易,经济金融治理,…...

保护隐私就是在保护自己!如何在Android上更改应用程序权限
如果你关心隐私,知道如何在Android上更改应用程序权限将成为一项非常重要的技能。即使是最好的安卓应用程序也可以对手机的功能和数据进行广泛的访问,因此准确控制它们的使用范围会有所帮助。 一旦你在手机上加载了应用程序,你可能会注意到它…...

Linux/Ubuntu 安装 Java运行环境
linux下安装Java运行环境 1、下载安装包 .tar.gz 先在官网下载 JDK 点击这里 在这里要选择对应的 JDK 版本,一般我们目前选择JDK8 点击这里 2、在 /usr/local/ 目录下创建Java文件夹 cd /usr/local/ mkdir java3、将下载的文件通过FTP程序上传到刚刚创建的Java文…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...