复制非常昂贵– HDFS中的默认3x复制方案在存储空间和其他资源(例如,网络带宽)上有200%的开销。但是,对于具有相对较低I / O活动的冷热数据集,在正常操作期间很少访问其他块副本,但是仍然消耗与第一个副本相同的资源量。
因此,自然的改进是使用擦除编码(EC)代替复制,它提供了相同级别的容错能力,而存储空间却少得多。在典型的擦除编码(EC)设置中,存储开销不超过50%。EC文件的复制因子没有意义。它始终为1,无法通过-setrep命令进行更改。
在存储系统中,EC最显着的用途是廉价磁盘冗余阵列(RAID)。RAID通过条带化实现EC,条带化将逻辑上连续的数据(例如文件)划分为较小的单元(例如位,字节或块),并将连续的单元存储在不同的磁盘上。在本指南的其余部分中,这种条带分布的单位称为条带化单元(或单元)。对于原始数据单元的每个条带,都会计算并存储一定数量的奇偶校验单元-其过程称为编码。可以通过基于剩余数据和奇偶校验单元的解码计算来恢复任何条带单元上的错误。
将EC与HDFS集成可以提高存储效率,同时仍提供与传统的基于复制的HDFS部署类似的数据持久性。例如,一个具有6个块的3x复制文件将占用6 * 3 = 18个磁盘空间。但是使用EC(6个数据,3个奇偶校验)部署时,它将仅占用9个磁盘空间块。
在EC的背景下,条带化具有几个关键优势。首先,它启用在线EC(立即以EC格式写入数据),避免了转换阶段并立即节省了存储空间。Online EC还通过并行利用多个磁盘主轴来增强顺序I / O性能。在具有高端网络的群集中,这尤其理想。其次,它自然地将一个小文件分发到多个DataNode,并且不需要将多个文件捆绑到一个编码组中。这极大地简化了文件操作,例如删除,配额报告以及联合名称空间之间的迁移。
在典型的HDFS群集中,小文件可占总存储消耗的3/4以上。为了更好地支持小文件,在第一阶段的工作中,HDFS支持带条带化的EC。将来,HDFS也将支持连续的EC布局。有关更多信息,请参见设计文档和有关HDFS-7285的讨论。
NameNode扩展 -条带化HDFS文件在逻辑上由块组组成,每个块组包含一定数量的内部块。为了减少这些附加块的NameNode内存消耗,引入了新的分层块命名协议。可以从其任何内部块的ID推断出块组的ID。这允许在块组而不是块的级别进行管理。
客户端扩展 -客户端读取和写入路径得到了增强,可以并行处理块组中的多个内部块。在输出/写入路径上,DFSStripedOutputStream管理着一组数据流传输器,每个数据节点一个,在当前块组中存储一个内部块。拖缆通常异步工作。协调器负责整个块组的操作,包括结束当前块组,分配新的块组,等等。在输入/读取路径上,DFSStripedInputStream将请求的逻辑字节数据范围转换为存储在DataNodes上的内部块。然后,它并行发出读取请求。发生故障时,它将发出其他读取请求以进行解码。
数据节点扩展 -数据节点运行附加的ErasureCodingWorker(ECWorker)任务,用于对失败的擦除编码块进行后台恢复。NameNode检测到失败的EC块,然后NameNode选择一个DataNode进行恢复工作。恢复任务作为心跳响应传递。此过程类似于失败时如何重新复制复制的块。重建执行三个关键任务:
从源节点读取数据:使用专用线程池从源节点并行读取输入数据。基于EC策略,它计划对所有源目标的读取请求,并仅读取最少数量的输入块以进行重建。
解码数据并生成输出数据:从输入数据解码新数据和奇偶校验块。所有丢失的数据和奇偶校验块一起解码。
将生成的数据块传输到目标节点:解码完成后,恢复的块将传输到目标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方案。它只能在目录上设置,以强制目录采用3x复制方案,而不继承其祖先的擦除编码策略。此策略可以使3x复制方案目录与擦除编码目录交错。
REPLICATION始终处于启用状态。在所有EC策略中,默认情况下启用RS(6,3)。
与HDFS存储策略类似,在目录上设置擦除编码策略。创建文件后,它将继承其最近祖先目录的EC策略。
目录级EC策略仅影响目录中创建的新文件。创建文件后,可以查询其擦除编码策略,但不能更改。如果将擦除编码文件重命名为具有其他EC策略的目录,则该文件将保留其现有的EC策略。将文件转换为其他EC策略需要重写其数据。通过复制文件(例如通过distcp)而不是重命名来做到这一点。
我们允许用户通过XML文件定义自己的EC策略,该文件必须包含以下三个部分:
layoutversion:这表示EC策略XML文件格式的版本。
模式:这包括所有用户定义的EC模式。
策略:这包括所有用户定义的EC策略,每个策略都由架构ID和条带化单元的大小(cellsize)组成。
Hadoop conf目录中有一个名为user_ec_policies.xml.template的示例EC策略XML文件,用户可以参考该文件。
英特尔ISA-L英特尔ISA-L代表英特尔智能存储加速库。ISA-L是针对存储应用程序而优化的低级功能的开源集合。它包括针对Intel AVX和AVX2指令集优化的快速块Reed-Solomon类型擦除代码。HDFS擦除编码可以利用ISA-L加速编码和解码计算。ISA-L支持大多数主要操作系统,包括Linux和Windows。默认情况下不启用ISA-L。请参阅以下说明以了解如何启用ISA-L。
纠删编码对群集在CPU和网络方面提出了其他要求。
编码和解码工作会消耗HDFS客户端和DataNode上的额外CPU。
擦除编码要求群集中的DataNode最少与配置的EC条带宽度一样多。对于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 <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”。
用于里德-索罗门和XOR的编解码器的实现可以用下面的客户端和数据管理部的配置的键被构造成:io.erasurecode.codec.rs.rawcoders默认RS编解码器,io.erasurecode.codec.rs-legacy.rawcoders用于遗留RS编解码器,用于XOR编解码器的io.erasurecode.codec.xor.rawcoders。用户还可以使用配置密钥来配置自定义编解码器,例如: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,
还可以通过以下配置参数来调整DataNode上的纠删编码后台恢复工作:
默认RS编解码器的HDFS本机实现利用Intel ISA-L库来改善编码和解码计算。要启用和使用Intel ISA-L,需要执行三个步骤。
要验证Hadoop是否正确检测到ISA-L,请运行hadoop checknative命令。
HDFS提供了一个ec子命令来执行与擦除编码有关的管理命令。
hdfs ec [通用选项] [-setPolicy -path <路径> [-策略<policyName>] [-复制]] [-getPolicy -path <路径>] [-unsetPolicy -path <路径>] [-listPolicies] [-addPolicies -policyFile <文件>] [-listCodecs] [-enablePolicy -policy <policyName>] [-disablePolicy -policy <policyName>] [-帮助[cmd ...]]
以下是有关每个命令的详细信息。
[-setPolicy -path <路径> [-策略<policyName>] [-复制]]
在指定路径的目录上设置擦除编码策略。
path:HDFS中的目录。这是必填参数。设置策略仅影响新创建的文件,而不影响现有文件。
policyName:用于此目录下文件的擦除编码策略。如果设置了“ dfs.namenode.ec.system.default.policy”配置,则可以省略此参数。路径的EC策略将在配置中设置为默认值。
-replicate在目录上应用默认的REPLICATION方案,强制目录采用3x复制方案。
-replicate和-policy <policyName>是可选参数。不能同时指定它们。
[-getPolicy -path <路径>]
获取指定路径下文件或目录的擦除编码策略的详细信息。
[-unsetPolicy -path <路径>]
取消设置先前对目录上的setPolicy的调用所设置的擦除编码策略。如果目录从祖先目录继承了擦除编码策略,则unsetPolicy是no-op。在没有显式策略集的目录上取消策略不会返回错误。
[-listPolicies]
列出在HDFS中注册的所有(启用,禁用和删除)擦除编码策略。只有启用的策略才适合与setPolicy命令一起使用。
[-addPolicies -policyFile <文件>]
添加用户定义的擦除编码策略列表。请参阅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>]
禁用擦除编码策略。
由于大量的技术挑战,某些擦除擦除文件不支持某些HDFS操作,例如hflush,hsync,concat,setReplication,truncate和append。
客户端可以使用StreamCapabilities API查询OutputStream是否支持hflush()和hsync()。如果客户端希望通过hflush()和hsync()进行数据持久化,则当前的解决方法是在非擦除编码目录中创建此类文件,例如常规3x复制文件,或者使用FSDataOutputStreamBuilder#replicate() API在以下位置创建3x复制文件:擦除编码的目录。