Hadoop3.0 HDFS擦除编码

96
ghwolf1124
2017.11.23 10:43 字数 3953

目的

复制是昂贵的 - 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格式写入数据),避免了转换阶段,并立即节省存储空间。在线EC还通过并行使用多个磁盘主轴来增强顺序I / O性能; 这在高端网络的群集中是特别理想的。其次,它自然将一个小文件分发给多个DataNode,并且不需要将多个文件捆绑到一个编码组中。这极大地简化了文件操作,如删除,配额报告以及联邦名称空间之间的迁移。
在典型的HDFS集群中,小文件占总存储消耗的3/4以上。为了更好地支持小文件,在第一阶段的工作中,HDFS支持带有条带的EC。未来,HDFS也将支持连续的EC布局。有关更多信息,请参阅HDFS-7285的设计文档和讨论。
NameNode扩展 - 条带化的HDFS文件在逻辑上由块组组成,每个块组包含一定数量的内部块。为了减少来自这些附加块的NameNode内存消耗,引入了新的分层块命名协议。块组的ID可以从任何内部块的ID中推断出来。这允许在块组而不是块的级别进行管理。
客户端扩展 - 客户端读写路径得到了增强,可并行处理块组中的多个内部块。在输出/写入路径上,DFSStripedOutputStream管理一组数据流,每个DataNode存储当前块组中的内部块。拖缆主要是异步工作的。一个协调器负责整个块组的操作,包括结束当前块组,分配一个新的块组,等等。信范读范范亦范范亦亦H2读亦读信范上亦读信范中内亦读 然后它并行发出读取请求。一旦失败,它会发出额外的解码请求。
DataNode扩展 - DataNode运行额外的ErasureCodingWorker(ECWorker)任务,用于失败的删除编码块的后台恢复。NameNode检测到失败的EC块,然后选择一个DataNode进行恢复工作。恢复任务作为心跳响应传递。这个过程类似于复制块在失败时被重新复制的方式。重建执行三项关键任务:
从源节点读取数据:使用专用线程池从源节点并行读取输入数据。基于EC策略,它将读取请求安排到所有的源目标,只读取最小数量的输入块进行重构。
解码数据并生成输出数据:从输入数据中解码新数据和奇偶校验块。所有丢失的数据和奇偶校验块一起解码。
将生成的数据块传输到目标节点:一旦解码完成,恢复的块将传输到目标DataNode。
擦除编码策略为了适应异构工作负载,我们允许HDFS集群中的文件和目录具有不同的复制和擦除编码策略。擦除编码策略封装了如何对文件进行编码/解码。每个策略由以下几条信息定义:
EC模式:这包括EC组(例如,6 + 3)中的数据和奇偶校验块的数量,以及编解码器算法(例如Reed-Solomon,XOR)。
条纹单元的大小。这决定了条带读取和写入的粒度,包括缓冲区大小和编码工作。
策略被命名为codec - 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复制方案目录与删除编码目录交错。
REPLICATION策略始终处于启用状态。对于其他内置策略,默认情况下它们是禁用的。
类似于HDFS存储策略,擦除编码策略在目录上设置。当一个文件被创建时,它会继承它最近的祖先目录的EC策略。
目录级EC策略仅影响在该目录中创建的新文件。一旦创建了一个文件,就可以查询它的删除编码策略,但不能改变。如果擦除编码的文件被重命名为具有不同EC策略的目录,则该文件保留其现有的EC策略。将文件转换为不同的EC策略需要重写其数据; 通过复制文件(例如,通过distcp)而不是重命名它。
我们允许用户通过一个XML文件来定义他们自己的EC策略,该文件必须包含以下三个部分:
layoutversion:这表示EC策略XML文件格式的版本。
schemas:这包括所有用户定义的EC模式。
policies:这包括所有用户定义的EC策略,每个策略由模式标识和条带化单元的大小(单元格大小)组成。
名为user_ec_policies.xml.template的示例EC策略XML文件位于Hadoop conf目录中,供用户参考。
英特尔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。
擦除编码的文件也分布在机架上以实现机架容错。这意味着在读取和写入条带化文件时,大多数操作都是机架外的。网络二等分带宽非常重要。
对于机架容错,配置至少与配置的EC条带宽度一样多的机架也很重要。对于欧共体政策RS(6,3),这意味着最少9个机架,最好是10或11个,以处理计划内和计划外停机。对于机架数量少于条带宽度的机箱,HDFS无法保持机架的容错性,但仍然会尝试在多个节点间传播条带文件以保持节点级的容错性。

配置键

默认情况下,除了在默认情况下启用的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仍然适用。
系统默认的EC策略可以通过“dfs.namenode.ec.system.default.policy”配置进行配置。使用此配置,当在“-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编解码器,还支持利用Intel ISA-L库来提高编解码器性能的本机实现。有关更多详细信息,请参阅“启用Intel ISA-L”部分。RS Legacy的默认实现是纯Java,
DataNode上的擦除编码后台恢复工作也可以通过以下配置参数进行调整:
dfs.datanode.ec.reconstruction.stripedread.timeout.millis - 条带读取超时。默认值是5000毫秒。
dfs.datanode.ec.reconstruction.stripedread.buffer.size - 读取器服务的缓冲区大小。默认值是64KB。
dfs.datanode.ec.reconstruction.threads - Datanode用于后台重建工作的线程数。默认值是8个线程。
启用英特尔ISA-L
默认RS编解码器的HDFS本地实现利用了Intel ISA-L库来改进编码和解码计算。要启用和使用英特尔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命令。

管理命令

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

hdfs ec [通用选项]
[-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]]
在指定路径的目录中设置删除编码策略。
路径:HDFS中的目录。这是一个强制参数。设置策略只影响新创建的文件,不影响现有的文件。
policyName:用于此目录下文件的擦除编码策略。如果设置了“dfs.namenode.ec.system.default.policy”配置,则可以省略此参数。路径的EC策略将在配置中设置为默认值。
-replicate在目录上应用特殊的REPLICATION策略,强制目录采用3x复制方案。
-replicate和-policy <policyName>是可选参数。它们不能同时指定。
[-getPolicy -path <path>]
获取指定路径下文件或目录的删除编码策略的详细信息。
[-unsetPolicy -path <path>]
取消先前对目录上的setPolicy调用所设置的擦除编码策略。如果目录继承祖先目录中的删除编码策略,则unsetPolicy为空操作。在没有显式策略设置的目录上取消设置策略不会返回错误。
[-listPolicies]
列出在HDFS中注册的所有(启用,禁用和删除)删除编码策略。只有已启用的策略适用于setPolicy命令。
[-addPolicies -policyFile <文件>]
添加删除编码策略的列表。示例策略文件请参考etc / hadoop / user_ec_policies.xml.template。最大单元尺寸在属性“dfs.namenode.ec.policies.max.cellsize”中定义,默认值为4MB。
[-listCodecs]
获取系统中支持的纠删码编解码器和编码器列表。编码器是一个编解码器的实现。一个编解码器可以有不同的实现,因此不同的编码器。编解码器的编码器按照回退顺序列出。
[-removePolicy -policy <policyName>]
删除纠删码策略。
[-enablePolicy -policy <policyName>]
启用删除编码策略。
[-disablePolicy -policy <policyName>]
禁用擦除编码策略。

限制

擦除编码文件不支持某些HDFS文件写入操作,即hflush,hsync和append,因为存在严重的技术挑战。
append()在擦除编码文件将抛出IOException。
hflush()和HSYNC()上DFSStripedOutputStream是无操作。因此,在擦除编码的文件上调用hflush()或hsync()不能保证数据持久。
客户端可以使用StreamCapabilities API来查询OutputStream是否支持hflush()和hsync()。如果客户希望通过hflush()和hsync()来实现数据持久化,目前的补救措施是在非擦除编码的目录中创建常规3x复制文件等文件,或使用FSDataOutputStreamBuilder#replicate() API创建3x复制文件一个删除编码的目录。

Hadoop3.0
Web note ad 1