Hadoop3.2.4纠删码介绍(一)

耀灵1年前技术文章492

1、介绍

纠删码是Hadoop3新加入的功能,之前的HDFS都是采用副本方式容错,默认情况下,一个文件有3个副本,可以容忍任意2个副本(DataNode)不可用,这样提高了数据的可用性,但也带来了2倍的冗余开销。例如3TB的空间,只能存储1TB的有效数据。而纠删码则可以在同等可用性的情况下,节省更多的空间,以rs-6-3-1024K这种纠删码策略为例子,6份原始数据,编码后生成3份校验数据,一共9份数据,只要最终有6份数据存在,就可以得到原始数据,它可以容忍任意3份数据不可用,而冗余的空间只有原始空间的0.5倍,只有副本方式的1/4,因此,可以大大节约成本。

2、启用纠删码

1.通过修改配置文件hdfs-site.xml,保存后退出需要重启HDFS服务。

   <!-- 启用 EC 编码 -->
   <property>
     <name>dfs.namenode.ec.enabled</name>
     <value>true</value>
   </property>


   <!-- 设置 EC 编码方案,例如 RS-6-3 表示 6 数据块和 3 编码块 -->
   <property>
     <name>dfs.namenode.ec.system.default.policy</name>
     <value>XOR-2-1-1024k</value>
   </property>

1.png

备注:

参数:dfs.namenode.ec.system.default.policy

描述:默认的纠删码编码策略,这里可以看到是XOR-2-1-1024k。在后台依旧还是可以单独对目录进行设置。

3、纠删码策略介绍

首先我们查看一下系统中具体支持的纠删码策略类型。

[root@hd2 hadoop]# hdfs ec -listPolicies
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop-3.2.4/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/apache-tez-0.10.2-bin/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
Erasure Coding Policies:
ErasureCodingPolicy=[Name=RS-10-4-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=10, numParityUnits=4]], CellSize=1048576, Id=5], State=DISABLED
ErasureCodingPolicy=[Name=RS-3-2-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=3, numParityUnits=2]], CellSize=1048576, Id=2], State=ENABLED
ErasureCodingPolicy=[Name=RS-6-3-1024k, Schema=[ECSchema=[Codec=rs, numDataUnits=6, numParityUnits=3]], CellSize=1048576, Id=1], State=DISABLED
ErasureCodingPolicy=[Name=RS-LEGACY-6-3-1024k, Schema=[ECSchema=[Codec=rs-legacy, numDataUnits=6, numParityUnits=3]], CellSize=1048576, Id=3], State=DISABLED
ErasureCodingPolicy=[Name=XOR-2-1-1024k, Schema=[ECSchema=[Codec=xor, numDataUnits=2, numParityUnits=1]], CellSize=1048576, Id=4], State=ENABLED

2.png

可以看到一共有5种纠删码策略,这里具体解释一下:

1.RS-10-4-1024k:使用RS编码,每10个数据单元(cell),生成4个校验单元,共14个单元,也就是说:这14个单元中,只要有任意的10个单元存在(不管是数据单元还是校验单元,只要总数=10),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576B。



2.RS-3-2-1024k:使用RS编码,每3个数据单元,生成2个校验单元,共5个单元,也就是说:这5个单元中,只要有任意的3个单元存在(不管是数据单元还是校验单元,只要总数=3),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576B。



3.RS-6-3-1024k:使用RS编码,每6个数据单元,生成3个校验单元,共9个单元,也就是说:这9个单元中,只要有任意的6个单元存在(不管是数据单元还是校验单元,只要总数=6),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576B。



4.RS-LEGACY-6-3-1024k:策略和上面的RS-6-3-1024k一样,只是编码的算法用的是rs-legacy,应该是之前遗留的rs算法。



5.XOR-2-1-1024k:使用XOR编码(速度比RS编码快),每2个数据单元,生成1个校验单元,共3个单元,也就是说:这3个单元中,只要有任意的2个单元存在(不管是数据单元还是校验单元,只要总数=2),就可以得到原始数据。每个单元的大小是1024k=1024*1024=1048576B。



以RS-6-3-1024k为例,6个数据单元+3个校验单元,可以容忍任意的3个单元丢失,冗余的数据是50%。而采用副本方式,3个副本,冗余200%,却还不能容忍任意的3个单元丢失。因此,RS编码在相同冗余度的情况下,会大大提升数据的可用性,而在相同可用性的情况下,会大大节省冗余空间。


相关文章

MySQL 初始化推荐关注的参数

MySQL 初始化推荐关注的参数

前言新部署的 MySQL 实例如何配置?本 SOP 将提供一些 MySQL 关键参数及设置方法。必须设置的参数1. innodb_buffer_pool_size对于 innodb 表引擎来说,用户数...

MySQL运维实战(4.3) SQL_MODE之ONLY_FULL_GROUP_BY

设置ONLY_FULL_GROUP_BY后,对有group by子句SQL,select的字段要么是group by中的字段,要么对字段进行聚合运算,否则sql执行报错。不设置ONLY_FULL_GR...

Docker常用命令

1、找镜像去docker hub,查找需要的镜像,docker pull nginx  #下载最新版 镜像名:版本名(标签) docker pull nginx:1.20.1 #...

MySQL排障实战(一)—— 连接异常中断

MySQL排障实战(一)—— 连接异常中断

问题背景数栈数据质量模块,接入客户的数据源后,一执行就报错。报错信息:{"logInfo": {{"jobid":"1a4ebbbd&quo...

greenplum安装配置

一、配置服务器安装环境1、修改服务器内核参数(所有节点)编辑sysctl.conf,需要设置共享内存Greenplum数据库使用共享内存在属于同一postgres实例的postgres进程之间进行通信...

MySQL 评估 ALTER TABLE 进度(5.7)

MySQL 评估 ALTER TABLE 进度(5.7)

一、前言问题:大表里执行 ALTER TABLE 的时候,经常会比较忐忑,会面临 “跑又跑不完 Kill 也不敢 Kill” 的窘境。需求:客户在执行 ALTER TABLE 时也会让我们来评估影响的...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。