目的

HDFS默认的3副本策略,在存储空间和其他比如网络带宽上有200%的开销,因而副本策略是昂贵的。但是对于具有相对较低I/O的冷热数据集,在正常操作期间很少访问其他副本块,但仍然消耗与第一个副本相同的资源量。

因此,一种改进措施是使用纠删码(Erasure Code,EC)来替换副本策略。纠删码提供了与副本相同的容错能力,但使用较少的存储空间。在典型的纠删码中,存储开销不超过50%。纠删码文件的副本因子由于始终为1,无法通过-setrep命令更改,故没有意义。

背景

在存储系统中,EC最显着的用途是廉价磁盘冗余阵列(RAID)。 RAID通过条带化实现EC,条带化将逻辑上连续的数据(例如文件)划分为较小的单元(例如位,字节或块),并将连续的单元存储在不同的磁盘上。将这种条带分布的单位称为条带化单元(或单元)。对于原始数据单元的每个条带,都会计算并存储一定数量的奇偶校验块,这个过程称为编码。可以通过剩余数据块和奇偶校验块的解码计算来恢复任何条带单元上的错误。

将EC与HDFS集成可以提高存储效率,同时提供与副本相同的容错能力。例如,一个具有6个块的3副本文件将占用6 * 3 = 18个磁盘空间;但使用EC(6个数据,3个奇偶校验)部署时,它将仅占用9个磁盘空间块。

架构

在EC的背景下,条带化具有几个关键优势。首先,它启用在线EC(以EC格式实时写入数据),避免了转换阶段并立即节省了存储空间。 Online EC还通过并行利用多个磁盘主轴来增加I/O性能。对高并发网络的集群尤其理想;其次,它将一个小文件分发到多个DataNode,并且不需要将多个文件捆绑到一个编码组中。这极大地简化了例如删除、配额报告以及联合名称空间之间迁移等文件操作。

在典型的HDFS群集中,小文件可占总存储消耗的3/4以上。 为了更好地支持小文件,在第一阶段的工作中,HDFS支持带条带化的EC。 将来,HDFS也将支持连续的EC设计。有关更多信息,请参见设计文档和有关HDFS-7285(https://issues.apache.org/jira/browse/HDFS-7285)的讨论。

  • NameNode扩展

条带HDFS文件在逻辑上由块组构成,每个块组包含一定数量的内部块。为了减少NameNode对这些块的内存消耗,引入了新的分层块命名协议。可以从其任何内部块的ID推断出块组的ID。这允许在块组而不是块的级别进行管理。

  • 客户端扩展

客户端读取和写入路径得到了增强,可以并行处理块组中的多个内部块。在输出/写入路径上,DFSStripedOutputStream管理着一组数据流,每个数据节点一个,在当前块组中存储一个内部块。这些流通常异步工作。协调器负责整个块组的操作,包括结束当前块组、分配新的块组等。在输入/读取路径上,DFSStripedInputStream将请求的逻辑字节数据转换为存储在DataNodes上的内部块。然后并行发出读取请求。当发生故障时,它将发出其他读取请求以进行解码。

  • 数据节点扩展

数据节点运行附加ErasureCodingWorker(ECWorker)任务,用于后台恢复失败的纠删码块。 NameNode检测到失败的EC块,然后选择一个DataNode进行恢复工作。恢复任务以心跳响应方式进行传递。此过程类似于采用复制策略恢复丢失的数据块。重建执行三个关键任务:

(1)从源节点读取数据

使用专用线程池从源节点并行读取输入数据。基于EC策略,它计划对所有源数据进行读取请求,并仅读取最少数量的输入块以进行重建。

(2)解码数据并生成输出数据

从新数据和奇偶校验块解码成原始数据。所有丢失的数据和奇偶校验块一起解码。

(3)将生成的数据块传输到目标节点

解码完成后,恢复的数据块将传输到目标DataNodes。

  • 纠删码策略

为了适应异步的工作负载,我们允许HDFS集群中的文件和目录具有不同的复制和纠删码策略。纠删码策略封装了如何对文件进行编码/解码。每个策略由以下信息定义:

EC模式:这包括EC组(例如6 + 3)中的数据块和奇偶校验块的数量,以及纠删码算法(例如Reed-Solomon,XOR)。

条带单元的大小。 这确定了条带读取和写入的粒度,包括缓冲区大小和编码工作。

策略被命名为编解码器-数据块数-奇偶校验块-单元大小。当前,支持六种内置策略:RS-3-2-1024k,RS-6-3-1024k,RS-10-4-1024k,RS-LEGACY-6-3-1024k,XOR-2-1- 1024k和复制(REPLICATION)。

复制是一项特殊政策,它只能在目录上设置,以强制目录采用3倍复制方案,而不继承其原始的纠删码策略。此策略可以使3x复制方案目录与纠删码目录交错。

REPLICATION策略始终处于默认开启状态。对于其他内置策略,默认情况下禁用。

与HDFS存储策略类似,在目录上设置纠删码策略。创建文件后,它将继承其最近祖先目录的EC策略。

目录级EC策略仅影响目录中创建的新文件。创建文件后,可以查询其纠删码策略,但不能更改。如果将纠删码文件重命名为具有其他EC策略的目录,则该文件将保留其现有的EC策略。将文件转换为其他EC策略需要重写该数据。通过复制文件(例如,通过distcp)而不是重命名来做到这一点。

我们允许用户通过XML文件配置自己的EC策略,该文件必须包含以下三个部分:

1. 布局版本:这表示EC策略XML文件格式的版本;

2. 模式:这包括所有用户定义的EC模式;

3. 策略:这包括所有用户定义的EC策略,每个策略都由架构ID和条带化单元的大小(cellsize)组成。

Hadoop conf目录中有一个名为user_ec_policies.xml.template的示例EC策略XML文件,用户可以参考该文件。

  • Intel ISA-L

Intel ISA-L代表英特尔智能存储加速库。ISA-L是针对存储应用程序而优化的低级功能的开源集合。它包括针对Intel AVX和AVX2指令集优化的快速块Reed-Solomon类型纠删码。HDFS纠删码可以利用ISA-L加速编码和解码计算。ISA-L支持大多数主要操作系统,包括Linux和Windows。默认情况下不启用ISA-L。请参阅以下说明以了解如何启用ISA-L。

4部署方式

4.1集群和硬件配置

纠删码在CPU和网络方面对群集提出了其他要求。

编码和解码工作会消耗HDFS客户端和DataNode上额外的CPU资源。

纠删码要求群集中的DataNode最少与配置的EC条带宽度一样多。 对于EC策略RS(6,3),这意味着至少需要9个DataNode。

纠删码文件分布在整个机架上,以实现机架容错。这意味着在读写条带化文件时,大多数操作都是在机架上进行的。因此,网络分带宽非常重要。

对于机架容错,具有至少与配置的EC条带宽度一样多的机架也很重要。对于EC策略RS(6,3),这意味着最少要有9个机架,理想情况下是10或11个机架,以处理计划内和计划外的中断。对于机架少于条带宽度的群集,HDFS无法保持机架容错,但仍将尝试在多个节点之间分布条带化文件以保留节点级容错。

4.2配置项

默认情况下,dfs.namenode.ec.system.default.policy默认启用,其他所有内置纠删码策略均被禁用。群集管理员可以根据群集的大小和所需的容错属性,通过hdfs ec [-enablePolicy -policy <policyName>]命令启用纠删码测量。例如,对于具有9个机架的群集,像RS-10-4-1024k这样的策略将不会保留机架级的容错能力,而RS-6-3-1024k或RS-3-2-1024k可能更合适。如果管理员只关心节点级的容错能力,则只要集群中至少有14个DataNode,RS-10-4-1024k仍然适用。

可以通过“dfs.namenode.ec.system.default.policy”配置来设置系统默认EC策略。使用此配置时,如果在“-setPolicy”命令中未传递任何策略名称,则使用默认的EC策略,“dfs.namenode.ec.system.default.policy”默认为“RS-6-3-1024k”。

可以使用以下客户端和DataNode配置密钥来配置Reed-Solomon和XOR的编解码器实现:默认RS编解码器的io.erasurecode.codec.rs.rawcoders;旧版RS编解码器的io.erasurecode.codec.rs-legacy.rawcoders;XOR编解码器的io.erasurecode.codec.xor.rawcoders。用户还可以使用密钥来配置自定义编解码器,例如:io.erasurecode.codec.self-defined-codec.rawcoders。这些键的值是带有备用机制的编码器名称列表。这些编解码器工厂将按照配置值指定的顺序加载,直到成功加载编解码器为止。默认的RS和XOR编解码器配置首选纯Java本地实现。没有RS-LEGACY本机编解码器实现,因此默认设置仅为纯Java实现。所有这些编解码器均具有纯Java实现。对于默认的RS编解码器,还有一个本机实现,可利用英特尔ISA-L库提高编解码器的性能。对于XOR编解码器,还支持利用Intel ISA-L库提高编解码器性能的本机实现。请参阅“启用Intel ISA-L”一节以获取更多详细信息。RS Legacy的默认实现是纯Java,默认RS和XOR的默认实现是使用Intel ISA-L库的本机实现。

还可以通过以下配置参数来调整DataNode上的纠删码后台恢复工作:

(1)dfs.datanode.ec.reconstruction.stripedread.timeout.millis:条带读取的超时,默认值为5000毫秒。

(2)dfs.datanode.ec.reconstruction.stripedread.buffer.size:读取器服务的缓冲区大小,默认值为64KB。

(3)dfs.datanode.ec.reconstruction.threads:Datanode用于后台重建工作的线程数,默认值为8个线程。

(4)dfs.datanode.ec.reconstruction.xmits.weight:EC后台恢复任务与复制块恢复相比使用的xmit的相对权重,默认值为0.5。设置为0将禁用EC恢复任务的计算权重,即EC任务始终具有1 xmits。纠删码恢复任务的xmit被计算为读取流的数量和写入流的数量之间的最大值。例如,如果EC恢复任务需要从6个节点读取并写入2个节点,则它的xmit值为max(6,2)* 0.5 =3。复制文件的恢复任务始终计为1 xmit。 NameNode利用dfs.namenode.replication.max-streams减去DataNode上的总xmitsInProgress(将来自复制文件和EC文件的xmit组合在一起)来调度恢复任务到此DataNode。

4.3启用Intel ISA-L

默认RS编解码器的HDFS本机实现利用Intel ISA-L库来改善编码和解码计算。要启用和使用Intel ISA-L,需要执行三个步骤。

(1)建立ISA-L库。请参阅官方网站“https://github.com/01org/isa-l/”以获取详细信息;

(2)使用ISA-L支持构建Hadoop。 请参阅源代码(BUILDING.txt)中“Hadoop的构建说明”中的“Intel ISA-L构建选项”部分;

(3)使用-Dbundle.isal将isal.lib目录的内容复制到最终的tar文件中。 使用tar文件部署Hadoop。 确保ISA-L在HDFS客户端和DataNode上可用。

要验证Hadoop是否正确检测到ISA-L,请运行hadoop checknative命令。

4.4管理命令

HDFS提供了一个ec子命令来执行与纠删码有关的管理命令。

hdfs ec [generic options][-setPolicy -path <path> [-policy <policyName>] [-replicate]][-getPolicy -path <path>][-unsetPolicy -path <path>][-listPolicies][-addPolicies -policyFile <file>][-listCodecs][-enablePolicy -policy <policyName>][-disablePolicy -policy <policyName>][-help [cmd ...]]

以下是有关每个命令的详细信息。

  • [-setPolicy -path <path> [-policy <policyName>] [-replicate]]

在指定路径的目录上设置纠删码策略。

path:HDFS中的目录。必填参数。设置策略仅影响新创建的文件,不影响已有文件。

policyName:用于此目录下文件的纠删码策略。如果设置了“dfs.namenode.ec.system.default.policy”配置,则可忽略此参数。EC策略下的path将在配置中设置为默认值。

-replicate:在目录上应用特殊的REPLICATION策略,强制采用3x复制方案。

-replicate和-policy <policyName>是可选参数。不能同时指定它们。

  • [-getPolicy -path <path>]

获取指定路径下文件或目录的纠删码策略的详细信息。

  • [-unsetPolicy -path <path>]

取消先前对目录上调用所设置的纠删码策略。如果从祖先目录继承了纠删码策略,则unsetPolicy是no-op。在没有显式策略集的目录上取消设置策略不会返回错误。

  • [-listPolicies]

列出在HDFS中注册的所有(启用,禁用和删除)纠删码策略。只有启用的策略才适合与setPolicy命令一起使用。

  • [-addPolicies -policyFile <file>]

添加纠删码策略列表。请参阅etc/hadoop/user_ec_policies.xml.template获取示例文件。单元格的大小在属性“dfs.namenode.ec.policies.max.cellsize”中定义,默认为4MB。当前,HDFS允许用户总共添加64个策略,并且添加的策略ID在64到127之间。如果已经添加了64个策略,添加策略将失败。

  • [-listCodecs]

获取系统中支持的纠删码编解码器和编码器列表。编码器是编解码器的一种实现。编解码器有不同的实现和类型。编解码器以列表顺序列出。

  • [-removePolicy -policy <policyName>]

删除纠删码策略。

  • [-enablePolicy -policy <policyName>]

启用纠删码策略。

  • [-disablePolicy -policy <policyName>]

禁用纠删码策略。

5局限性

由于大量的技术挑战,某些纠删码文件不支持一些HDFS操作,如hflush,hsync,concat,setReplication,truncate和append。

  • 纠删码文件上的append()和truncate()将抛出IOException。

  • 如果文件与不同的纠删码策略或复制的文件混合使用,则concat()将引发IOException。

  • setReplication()对纠删码文件不起作用。

  • DFSStripedOutputStream上的hflush()和hsync()是空指令。因此,在纠删码文件上调用hflush()或hsync()不能保证数据持久化。

客户端可使用StreamCapabilities API查询OutputStream是否支持hflush()和hsync()。如果客户端希望通过hflush()和hsync()进行数据持久化,则当前的补救措施是在非纠删码目录中创建此类文件,例如常规3x复制文件,或者使用FSDataOutputStreamBuilder#replicate()API在纠删码目录中创建3x复制文件。

原文参看:https://hadoop.apache.org/docs/r3.1.0/hadoop-project-dist/hadoop-hdfs/HDFSErasureCoding.html

HDFS纠删码(Erasure Coding)相关推荐

  1. Hadoop hdfs副本存储和纠删码(Erasure Coding)存储优缺点

    The advantages and disadvantages of hadoop hdfs replicating storage and erasure coding storage. Hado ...

  2. minio存储之纠删码(Erasure Code)

    纠删码的原理介绍可以参考: https://www.jianshu.com/p/4abf65ad03af 一般上我们如果要保证数据高可用,主流的有两种策略: 多副本 纠删码 副本(Replicatio ...

  3. Hadoop 3.0 Erasure Coding 纠删码功能预分析

    前言 HDFS也可以支持Erasure Coding功能了,将会在Hadoop 3.0中发布,可以凭图为证: 在HDFS-7285中,实现了这个新功能.鉴于此功能还远没有到发布的阶段,可能后面此块相关 ...

  4. Hadoop 3.0纠删码简单调研

    目录: 1.  背景 2. 纠删码(Erasure Coding)介绍 3. 纠删码(Erasure Coding)原理 4. 总结 一. 背景 随着大数据技术的发展,HDFS作为Hadoop的核心模 ...

  5. 【海云捷迅云课堂】分布式存储系统纠删码技术分享

    云课堂专题 海云捷迅云课堂专题,旨在秉承开源理念,为大家提供OpenStack技术原理与实践经验,该专题文章均由海云捷迅工程师理论与实践相结合总结而成,如大家有其他想要了解的信息,可留言给我们,我们会 ...

  6. 全网最新最全的 HDFS 文件纠删码技术分析

    前言 本文隶属于专栏<1000个问题搞定大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见1000个问题搞定大数据技 ...

  7. Hadoop纠删码算法启用ISA-L加速库

    在前文HDFS纠删码(Erasure Coding)一文中提到,HDFS启用ISA-L存储加速库,有有助于提升HDFS纠删码的编码和解码效率. 版本说明如下: 软件 版本 Hadoop 3.1.0 i ...

  8. 什么是纠删码(与纠错码的区别)|纠删码与副本对比|LDPC码

    什么是纠删码(与纠错码的区别) 存储领域来看,数据冗余机制其实这几十年来没有太多进展,RAID.副本一直是当仁不让的最终选择.而近几年,尤其是规模较大的应用场景下,纠删码越来越多的出现在选择的视野范围 ...

  9. MiniO纠删码快速入门

    MiniO纠删码快速入门 Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏. 即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据. 什么是纠 ...

最新文章

  1. 人工智能是否能开启人类世界新纪元?
  2. numpy 修改数据类型
  3. git同一项目使用多个远程仓库
  4. Ajax回退刷新页面问题的解决办法
  5. android中AndroidManifest.xml 的解析 (转)
  6. LeetCode 33. 搜索旋转排序数组 golang
  7. 判断字符串中是否包含中文
  8. MaxCompute Hash Clustering介绍
  9. C++常用概念——while循环时终止输入(Ctrl+Z,Ctrl+C,Ctrl+D(EOF))
  10. freecplus框架-ftp客户端
  11. OC-NSFileManager
  12. 一套C#图书管理系统源码 书籍借还登记统计系统源码
  13. c语言中指数对数函数,在C语言中使用对数函数的方法
  14. 经济法论文选题有什么推荐吗?
  15. gsap_使用GSAP的动画库为Bootstrap传送带制作动画
  16. Openresrt最佳案例
  17. Leetcode动态规划专题(共38道)
  18. bzoj4455UOJ185 [Zjoi2016]小星星(树形DP+容斥原理)
  19. Play Framework 整合 农业银行网银
  20. AWS安装WordPress更改IP地址后无法访问的解决办法

热门文章

  1. 数学建模:线性回归模型的Python实现
  2. ChatGPT - 使用chatgpt + xmind 快速生成思维导图
  3. Java开发 - MybatisPlus框架初体验
  4. css3波浪纹路_CSS Houdini实现动态波浪纹效果
  5. 好看软件多linux,软件技术|ubuntu18+正在成为最漂亮好用桌面系统
  6. 电力工程中能够快速判断电缆故障点的电缆路径探测仪 ----TFN FB28
  7. ffprobe综合教程(内含7个示例)
  8. ffprobe查看多媒体流音视频详情
  9. 【rmzt】清纯王范儿xp主题
  10. 不可估量的善意:全球网友在Facebook捐了10亿美元善款