HDFS Erasure Coding

目标

复制是昂贵的–HDFS默认3x复制方案在存储和其他资源方面(eg.网络、宽带)有200%的开销。但是,对于I/O活动相对较少的热数据集和冷数据集,在正常操作期间很少访问额外的block副本,但仍然消耗与第一个副本同样的资源量。

因此,一个自然的改进是使用纠删码代替副本,它以更少的磁盘空间提供了相同级别的容错性。在经典纠删码(EC)设置中,存储开销不超过50%。EC文件的副本因子是没有意义的。它始终为1,不能通过via -setrep命令改变。

背景

在存储系统中,EC最显著的用途是廉价磁盘冗余阵列(RAID)。RAID通过条带化来实现EC,它将逻辑上顺序的数据(如文件)划分成更小的单元(像bit、byte或block)并且将连续的单元存储到不同磁盘上。在本指南的其余部分中,此条带分布单元称为条带单元(或单元)。 对于每条原始数据单元格,都会计算并存储一定数量的奇偶校验单元——这个过程称为编码。任何条带单元的错误都可以通过基于幸存数据和奇偶校验单元的解码计算来恢复。

将EC与HDFS集成可以提高存储效率,同时还可以提供与传统的基于复制的HDFS部署类似的数据持久性。
例如,具有6个block的3x复制文件将消耗6*3-18个block的磁盘空间,但是EC(6个数据3个奇偶校验)部署,它仅消耗9个 block的磁盘空间。

结构

在EC环境下,条带化有几个关键优势。第一,它支持在线激活EC(以EC格式立即写入数据),避免转换阶段和立即节省存储空间。在线EC还通过并行多个磁盘轴来提升序列化I/O性能;这在具有高端网络的集群中尤其可取。第二,它自然将一个小文件分发给多个数据节点,并消除了多个文件捆绑到单个编码组的需求。
这大大简化了文件操作,像删除、配额报告和联邦名称空间之间的迁移。

在典型的HDFS集群中,小文件可以占总存储消耗4/3以上。为了更好的支持小文件,在第一阶段的工作,HDFS支持带条化带的EC。在未来,HDFS也支持连续的EC布局。有关更多信息,请参阅HDFS-7285的设计文档和讨论。

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

  • Client 扩展 -客户端读取和写入路径得到增强,可以并行处理block group中的多个内部块。在输出/写入路径中,DFSStripedOutputStream管理一组数据流处理器,每个DataNode 存储一个内部块在当前的block group中,这个流处理器大多是异步工作的。协调器负责对整个block group 的操作,包括结束当前block group ,分配新的block group等。在输入/读取路径中,DFSStripedInputStream 将请求的数据逻辑字节范围作为范围转换为存储在 DataNode 上的内部块。然后它并发发出读取请求。出现故障时,它胡发出额外的读取请求进行解码。

  • DataNode 扩展 - DataNode 运行额外的ErasureCodingWorker(ECWorker)任务,用于后台恢复失败的纠删码 block。NameNode会检测失败的EC block,然后它选择一个DataNode去执行恢复工作。恢复任务作为心跳响应传递。此进程类似于失败时重新复制已复制的块的方式。重建执行三个关键任务:

    1. 从源节点读取数据:使用专用线程池从源节点并行读取数据。基于EC策略,它读取请求调度到所有源目标,并仅读取最小数量的block进行重建。
    2. 数据解码并生成输出数据:从输入数据中解码新数据和奇偶校验块。所有丢失的数据和奇偶校验块一起解码。
    3. 将生成的数据块传输到目标节点:解码完成后,将恢复的块传输到目标 DataNode。
  • 纠删码策略为了适应异构工作负载,我们允许 HDFS 集群中的文件和目录具有不同的复制和纠删码策略。 纠删码策略封装了如何对文件进行编码/解码。 每个策略都由以下信息定义:

    1. EC 模式:这包括 EC 组中的数据和奇偶校验块的数量(例如,6+3),以及编解码器算法(例如,Reed-Solomon,XOR)。
    2. 条带化单元的大小。 这决定了条带读取和写入的粒度,包括缓冲区大小和编码工作。

    策略命名为编解码器num数据块num奇偶校验块单元大小。目前,支持五种内置策略:RS-3-2-1024k、RS-6-3-1024k、RS-10-4-1024k、RS-LEGACY-6-3-1024k、XOR-2-1-1024k。

    还支持默认的 REPLICATION 方案。它只能在目录上设置,强制目录采用 3x 复制方案,而不是继承其祖先的纠删码策略。此策略使 3x 复制方案目录与纠删码目录交错成为可能。

    复制始终处于启用状态。在所有EC策略中,默认情况下启用RS(6,3)。

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

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

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

    1. layoutversion:表示 EC 策略 XML 文件格式的版本。
    2. schemas:这包括所有用户定义的 EC 模式。
    3. policies:这包括所有用户定义的 EC 策略,每个策略由模式 id 和条带单元的大小 (cellsize) 组成。

    名为user_ec_policies.xml.template 的 EC策略文件位于 Hadoop 配置目录,用户可以参考该文件。

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

部署

集群和硬件配置

纠删码在 CPU 和网络方面对集群提出了额外的要求。

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

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

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

对于机架容错,拥有足够数量的机架也很重要,以便平均每个机架容纳的块数量不超过 EC 奇偶校验块的数量。计算这个的公式是(数据块+奇偶校验块)/奇偶校验块,四舍五入。对于 EC 策略 RS (6,3),这意味着最少需要 3 个机架(按 (6 + 3) / 3 = 3 计算),理想情况下需要 9 个或更多机架来处理计划内和计划外的中断。对于机架数少于奇偶校验单元数的集群,HDFS 无法保持机架容错,但仍会尝试将条带文件分布到多个节点以保持节点级容错。出于这个原因,建议设置具有相似数量 DataNode 的机架。

配置密钥

默认情况下,除 dfs.namenode.ec.system.default.policy 中定义的那些默认启用的纠删码策略外,所有内置纠删码策略均处于禁用状态。集群管理员可以根据集群的大小和所需的容错属性,通过 hdfs ec [-enablePolicy -policy ] 命令启用一组策略。例如,对于有 9 个机架的集群,像 RS-10-4-1024k 这样的策略不会保留机架级容错,而 RS-6-3-1024k 或 RS-3-2-1024k 可能更合适.如果管理员只关心节点级别的容错,只要集群中至少有 14 个 DataNode,RS-10-4-1024k 仍然是合适的。

系统默认 EC 策略可以通过“dfs.namenode.ec.system.default.policy”配置进行配置。使用此配置,当在“-setPolicy”命令中没有将策略名称作为参数传递时,将使用默认的 EC 策略。

默认情况下,“dfs.namenode.ec.system.default.policy”是“RS-6-3-1024k”。

Reed-Solomon 和 XOR 的编解码器实现可以使用以下客户端和 DataNode 配置键进行配置:io.erasurecode.codec.rs.rawcoders 用于默​​认 RS 编解码器,io.erasurecode.codec.rs-legacy.rawcoders 用于旧版RS 编解码器,io.erasurecode.codec.xor.rawcoders 用于 XOR 编解码器。用户还可以使用配置键配置自定义编解码器,例如:io.erasurecode.codec.self-defined-codec.rawcoders。这些键的值是具有回退机制的编码器名称列表。这些编解码器工厂按照配置值指定的顺序加载,直到成功加载编解码器。默认的 RS 和 XOR 编解码器配置比纯 Java 更喜欢本机实现。没有 RS-LEGACY 本机编解码器实现,因此默认仅为纯 Java 实现。所有这些编解码器都有纯 Java 实现。对于默认的 RS 编解码器,还有一个利用英特尔 ISA-L 库来提高编解码器性能的本机实现。对于 XOR 编解码器,还支持利用英特尔 ISA-L 库来提高编解码器性能的本机实现。有关更多详细信息,请参阅“启用 Intel ISA-L”部分。 RS Legacy 的默认实现是纯 Java,默认 RS 和 XOR 的默认实现是使用英特尔 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 个 xmit。 纠删码恢复任务的xmits计算为读流数和写流数之间的最大值。 例如,如果一个EC恢复任务需要从6个节点读取并写入2个节点,它的xmits为max(6, 2) * 0.5 = 3。复制文件的恢复任务总是计为1个xmit。 NameNode 使用 dfs.namenode.replication.max-streams 减去 DataNode 上的总 xmitsInProgress,它结合了来自复制文件和 EC 文件的 xmit,将恢复任务安排到此 DataNode。

启用Intel ISA-L

默认 RS 编解码器的 HDFS 原生实现利用英特尔 ISA-L 库来改进编码和解码计算。 要启用和使用Intel ISA-L,需要三个步骤。

  1. 构建ISA-L库。有关详细信息,请参考官网网站https://github.com/01org/isa-l/
  2. 使用ISA-L支持构建Hadoop。请参阅源代码 (BUILDING.txt) 中“Build instructions for Hadoop”中的“Intel ISA-L build options”部分。
  3. 使用 -Dbundle.isal 将 isal.lib 目录的内容复制到最终的 tar 文件中。 使用 tar 文件部署 Hadoop。
    确保 ISA-L 在 HDFS 客户端和 DataNode 上可用。

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

管理员命令

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>]
     [-removePolicy -policy <policyName>]
     [-verifyClusterSetup -policy <policyName>...<policyName>]
     [-help [cmd ...]]

下面是每个命令的详细信息。

  • [-setPolicy -path [-policy ] [-replicate]]
    在指定路径的目录上设置纠删码策略。
    path:HDFS的目录。这是一个强制性参数。 设置策略仅影响新创建的文件,不会影响现有文件。
    policyName:用于此目录下文件的纠删码策略。 如果设置了“dfs.namenode.ec.system.default.policy”配置,则可以省略此参数。 路径的 EC 策略将使用配置中的默认值进行设置。
    - replicate 对目录应用默认复制方案,强制目录采用3x复制方案。
    - replicate and - policy < policyName> 是可选参数。不能同时指定他们。
  • [-getPolicy -path <path>]
    获取指定路径的文件或目录的纠删码策略的详细信息。
  • [-unsetPolicy -path <path>]
    取消设置由先前对目录上的 setPolicy 调用设置的擦除编码策略。 如果目录从祖先目录继承纠删码策略,则 unsetPolicy 是空操作。 在没有明确策略集的目录上取消策略不会返回错误。
  • [-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 ]
    启动纠删码策略。
  • [-disablePolicy -policy ]
    禁用纠删码策略。
  • [-verifyClusterSetup -policy …]
    验证集群设置是否可以支持所有启用的纠删码策略。 如果指定了可选参数 -policy,请验证集群设置是否可以支持给定的策略。

使用限制

由于大量的技术挑战,擦除编码文件不支持某些 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 复制文件。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值