HDFS 集群中经常配置的 3 个副本是很占用空间的 - HDFS中的默认 3x 复制方案在存储空间和其他资源(例如,网络带宽)上有 200% 的开销。但是,对于具有较低 I / O 活动的暖数据集和冷数据集,在正常操作期间很少访问其他块副本,但仍然消耗与第一个副本相同的资源。
因此,一种自然的改进是使用 Erasure Coding (EC) 来代替复制,它提供了相同级别的容错能力,但存储空间要小得多。在典型的 Erasure Coding (EC) 设置中,存储开销不超过50%。EC 文件的复制因子是无意义的。它总是 1,不能通过 -setrep 命令更改。
在存储系统中,EC 最显著的用法是廉价磁盘冗余阵列(RAID)。RAID 通过条带实现 EC,条带将逻辑上顺序的数据(如文件)划分为更小的单元(如位、字节或块),并在不同的磁盘上存储连续的单元。在本指南的其余部分中,条带分布的单位被称为条带单元(或单元)。对于每条原始数据单元,计算并存储一定数量的奇偶校验单元,此过程称为编码。任何条带单元上的错误都可以通过基于存活数据和奇偶校验单元的解码计算来恢复。
将 EC 与 HDFS 集成可以提高存储效率,同时仍然提供与传统基于副本的 HDFS 部署类似的数据持久性。例如,一个具有6个块的 3x 复制文件将消耗6*3 = 18块磁盘空间。但是对于 EC (6 data, 3 parity)部署,它只会消耗9块磁盘空间。
在电子商务的背景下,条带化具有几个关键的优势。首先,它启用了在线 EC(立即以 EC 格式写入数据),避免了转换阶段,并立即节省了存储空间。在线电子商务还提高了连续 I/O 性能,利用多个磁盘主轴并行;这在具有高端网络的集群中尤其可取。其次,它自然地将一个小文件分发到多个 datanode,并消除了将多个文件捆绑到单个编码组的需要。这极大地简化了文件操作,例如删除、配额报告和在联邦名称空间之间迁移。
在典型的 HDFS 集群中,小文件占总存储消耗的 3/4 以上。为了更好地支持小文件,在第一阶段的工作中,HDFS 支持带条带的 EC。将来,HDFS 还将支持连续的 EC 布局。
NameNode Extensions - 分段的 HDFS 文件在逻辑上由块组组成,每个块组包含一定数量的内部块。为了减少这些额外块的 NameNode 内存消耗,引入了一种新的分层块命名协议。块组的 ID 可以从其内部块的 ID 推断出来。这允许在块组级别而不是块级别进行管理。
Client Extensions - 客户端读和写路径得到了增强,可以并行地处理一个块组中的多个内部块。在输出/写入路径上, DFSStripedOutputStream 管理一组数据流,每个 DataNode 都有一个数据流,用于存储当前块组中的一个内部块。流媒体大多是异步工作的。协调器负责对整个块组的操作,包括结束当前块组、分配新块组等等。在输入/读取路径上, DFSStripedInputStream 将请求的逻辑字节范围的数据转换为存储在 datanode 上的内部块。然后并行地发出读请求。如果失败,它会发出额外的读请求进行解码。
DataNode Extensions - DataNode 运行一个额外的 ErasureCodingWorker (ECWorker)任务,用于后台恢复失败的擦除代码块。失败的 EC 块由 NameNode 检测,然后由 NameNode 选择一个 DataNode 来执行恢复工作。恢复任务作为心跳响应传递。这个过程类似于在失败时重新复制已复制的块。重构有三个关键任务:
1、从源节点读取数据:使用专用线程池并行地从源节点读取输入数据。基于 EC 策略,它将读请求调度到所有源目标,并且只读取用于重构的最小输入块数。
2、解码数据并生成输出数据:从输入数据中解码出新的数据和奇偶校验块。所有丢失的数据和奇偶校验块一起被解码。
3、将生成的数据块传输到目标节点:解码完成后,将恢复的数据块传输到目标 datanode。
Erasure coding policies 为了适应不同的工作负载,我们允许 HDFS 集群中的文件和目录具有不同的复制和 EC 策略。擦除编码策略封装了如何对文件进行编码/解码。每个策略由以下信息定义:
1、EC 模式:这包括 EC 组(如6+3)中的数据和奇偶校验块的数量,以及编解码器算法(如Reed-Solomon、XOR)。
2、条带化大小:这决定了条带化读写的粒度,包括缓冲区大小和编码工作。
策略被命名为 codec-num 数据块 -num奇偶校验块-单元大小。目前支持5种内置策略:RS-3-2-1024k、RS-6-3-1024k、RS-10-4-1024k、RS-LEGACY-6-3-1024k、XOR-2-1-1024k。
还支持默认的复制方案。它只能在目录上设置,以强制目录采用 3x 复制方案,而不是继承其祖先的 EC 策略。该策略使 3x 复制方案目录与 EC 目录交叉成为可能。
始终启用复制。在所有 EC 策略中,RS(6,3)在默认情况下是启用的。
与 HDFS 存储策略类似,EC 策略是在目录上设置的。创建文件时,它继承最近的祖先目录的 EC 策略。
目录级的 EC 策略只影响在目录中创建的新文件。一旦创建了一个文件,就可以查询它的 EC 策略,但不能更改它。如果将 EC 文件重命名为具有不同 EC 策略的目录,则该文件将保留其现有 EC 策略。将文件转换为不同的 EC 策略需要重写其数据;通过复制文件(例如,通过 distcp)而不是重命名文件来实现这一点。
我们允许用户通过一个 XML 文件定义他们自己的 EC 策略,该文件必须包含以下三个部分:
layoutversion: 这表示 EC policy XML 文件格式的版本。
schemas: 这包括所有用户定义的EC模式。
policies: 这包括所有用户定义的 EC 策略,每个策略由模式 id 和分段单元格(cellsize)的大小组成。
一个名为 user_ec_policies.xml 的示例 EC 策略 XML 文件。模板位于 Hadoop conf 目录中,用户可以引用它。
Intel ISA-L Intel ISA-L 代表 Intel 智能存储加速库。ISA-L 是一个为存储应用程序设计的优化的底层函数的开源集合。它包括为英特尔 AVX 和 AVX2 指令集优化的快速块 Reed-Solomon 类型擦除代码。HDFS EC 可以利用 ISA-L 加速编码和解码计算。ISA-L 支持大多数主要的操作系统,包括 Linux 和 Windows。默认情况下没有启用 ISA-L。有关如何启用 ISA-L,请参阅下面的说明。
EC 在 CPU 和网络方面对集群提出了额外的要求。
编码和解码工作消耗 HDFS 客户端和 DataNode 上的额外 CPU。
EC 要求集群中的 DataNode 数量至少与配置的 EC 条带宽度相同。对于 EC 策略 RS(6,3),这意味着至少有 9个 datanode。
EC 文件也分布在机架上,以获得机架的容错能力。这意味着当读取和写入条带文件时,大多数操作都是 off-rack。因此,网络对分带宽非常重要。
对于机架容错,拥有足够的机架数量也很重要,这样,平均而言,每个机架拥有的块的数量不超过 EC 奇偶校验块的数量。计算这个的公式是(数据块+奇偶校验块)/奇偶校验块,向上舍入。对于 EC 策略 RS(6,3),这意味着最少3个机架(通过(6 + 3)/ 3 = 3计算),理想情况下是 9 个或更多机架来处理计划内和计划外停机。对于机架数量少于奇偶校验单元数量的集群,HDFS 不能维护机架的容错能力,但仍然会尝试跨多个节点传播带条文件,以保持节点级别的容错能力。由于这个原因,建议使用相同数量的 datanode 来设置机架。
默认情况下,所有内置的 EC 策略都是禁用的,除了在默认情况下启用的 dfs.namenode.ec.system.default.policy 中定义的策略。集群管理员可以根据集群的大小和所需的容错属性,通过 hdfs ec [-enablePolicy -policy
系统默认的 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。默认 RS 编解码器的 rawcoders, io.erasureco.codec . RS -legacy。为遗留RS编解码器的 rawcoders, io.erasureco.codec .xor。XOR 编解码器的 rawcoders。用户也可以配置自定义的编解码器与配置键像:io.erasurecode.codec.self-defined-codec.rawcoders。这些键的值是带有回退机制的编码器名称列表。这些编解码器工厂将按照配置值指定的顺序加载,直到成功加载编解码器为止。默认的 RS 和 XOR 编解码器配置更喜欢本机实现,而不是纯 Java 实现。没有 rs 遗留的本地编解码器实现,因此默认是纯 Java 实现。所有这些编解码器都用纯 Java 实现。对于默认的 RS 编解码器,还有一个原生实现,它利用 Intel ISA-L 库来提高编解码器的性能。对于 XOR 编解码器,还支持利用 Intel ISA-L 库来提高编解码器性能的本地实现。请参阅“启用Intel ISA-L”一节以获得更多详细信息。RS Legacy 的缺省实现是纯 Java,缺省 RS 和 XOR 的缺省实现是使用 Intel ISA-L 库的本机实现。
DataNode 上的 EC 后台恢复工作也可以通过以下配置参数进行调整:
默认 RS 编解码器的 HDFS 本机实现利用 Intel ISA-L 库来改进编码和解码计算。要启用和使用 Intel ISA-L,需要三个步骤。
要验证 Hadoop 正确地检测到 ISA-L,请运行 Hadoop checknative 命令。
HDFS 提供了一个 ec 子命令来执行与 EC 相关的管理命令。
hdfs ec [generic options]
[-setPolicy -path [-policy ] [-replicate]]
[-getPolicy -path ]
[-unsetPolicy -path ]
[-listPolicies]
[-addPolicies -policyFile ]
[-listCodecs]
[-enablePolicy -policy ]
[-disablePolicy -policy ]
[-help [cmd ...]]
下面是关于每个命令的详细信息。
[-setPolicy -path
在指定路径上的目录上设置 EC 策略。
path: HDFS 中的一个目录。这是一个强制参数。设置策略只影响新创建的文件,而不影响现有的文件。
policyName: 用于此目录下文件的 EC 策略。如果设置了“dfs.namenode.ec.system.default.policy”配置,则可以省略此参数。该路径的 EC 策略将在配置中使用默认值设置。
-replicate 对目录应用默认复制方案,强制该目录采用3x复制方案。
-replicate 和 -policy
[-getPolicy -path
获取指定路径上文件或目录的 EC 策略的详细信息。
[-unsetPolicy -path
取消先前对目录上的 setPolicy 调用所设置的 EC 策略。如果该目录从一个祖先目录继承 EC 策略,则 unsetPolicy 为无操作。在没有显式策略集的目录上取消策略设置不会返回错误。
[-listPolicies]
列出在 HDFS 中注册的所有(启用、禁用和删除)EC 策略。只有启用的策略适合与 setPolicy 命令一起使用。
[-addPolicies -policyFile
添加用户定义的 EC 策略列表。请参考等/ hadoop / user_ec_policies.xml。示例策略文件的模板。最大单元格大小在属性' dfs.namenode.ec.policies.max.cellsize '中定义,默认值为 4MB。目前 HDFS 允许用户总共添加 64 个策略,添加的策略 ID在 64 到 127 之间。如果已经添加了 64 个策略,则添加策略将失败。
[-listCodecs]
获取系统中支持的 EC 编解码器和编码器的列表。编码器是编解码器的一种实现。一个编解码器可以有不同的实现,因此不同的编码器。编解码器的编码器是列出在一个后退顺序。
[-removePolicy -policy
删除用户定义的 EC 策略。
[-enablePolicy -policy
启用 EC 策略。
[-disablePolicy -policy
禁用 EC 策略。
某些 HDFS 操作,例如。删除编码文件不支持 hflush、hsync、concat、setReplication、truncate和append,因为存在重大的技术挑战。
客户端可以使用 StreamCapabilities API 来查询 OutputStream 是否支持 hflush()和 hsync()。如果客户端希望通过 hflush()和 hsync()实现数据持久性,当前的补救方法是在一个非 EC 的目录中创建常规 3x 复制文件,或者使用 FSDataOutputStreamBuilder# replication () API 在一个 EC 的目录中创建 3x 复制文件。