持久化的日志保存与回放大师!Amazon EMR WAL Workspaces 一触即发!

b3fa05664044c5182b69471e2cf4b1e5.gif

亚马逊云科技 re:Inforce 2024 中国站

再度来袭!

想要了解安全领域的最新发展趋势?

想要学习专业大咖们的深度剖析与见解?

👇 快来了解大会详情吧 👇

7912b49901b9631808609f2af3454e00.png

Amazon EMR 是行业领先的云上大数据解决方案,适用于使用开源框架(如 Apache Spark、Apache Hive、Presto)进行 PB (拍字节)级数据处理、交互分析和机器学习。

Amazon EMR 原生支持 Apache HBase,让您可以实时访问可扩展到数十亿行和数百万列的表

Amazon EMR HBase 有两种模式:

  • Amazon EMR HBase on HDFS,即基于 HDFS 的传统 HBase 构建方式。

  • Amazon EMR HBase on S3,是采用 Amazon EMR 文件系统的 Apache HBase,使用 Amazon S3 作为数据存储可以将计算与存储分离,Amazon EMR 还会将 Apache HBase 数据文件(HFile)保存到 Amazon S3。而且与 Apache Hadoop 的集群上 Hadoop Distributed File System(HDFS)相比,具有多种优势,详情可扫码查看。

Amazon EMR HBase WAL 功能介绍:

  • WAL 介绍:HBase 的 Write Ahead Log(WAL)提供了一种高并发、持久化的日志保存与回放机制。每一个业务数据的写入操作(PUT / DELETE)执行前,都会记账在 WAL 中,主要用于灾难恢复,类似 MySQL 的 BIN log。

  • Amazon EMR HBase on Amazon S3 模式在 Amazon EMR 6.15 版本之前 WAL 日志是存储在 Amazon EMR HBase 的 HDFS 上的(HFile 在 Amazon S3 上),如果用户误删除了 WAL 日志或操作失误终止了 Amazon EMR 集群,那对于未及时 Flush 成 HFile 的数据是无法恢复,需要重新写入的

  • Amazon EMR HBase on S3 模式在 Amazon EMR 6.15 版本之后,推出了托管的 WAL workspaces (工作空间)功能,用户可以将 WAL 日志存储到托管的 WAL workspaces 上,如果出现上述的情况,用户也可以重新创建 Amazon EMR HBase 集群,恢复完整的数据,见下图。

acf5bc7176f601659721470786818e93.png

Apache HBase

扫码了解更多

e3e0155498d27d828f2c3f1a8e88a5ac.png

本文会模拟 Amazon EMR 集群意外终止的情况,以对比 WAL 功能开启和关闭之后的数据一致性情况,以验证托管 WAL 功能的作用

测试准备

测试的亚马逊云科技服务:Amazon EMR HBase on S3

测试区域:Amazon 美西 2 区域

测试版本:EMR 7.1.0,对应 HBase 2.4.17

测试机型:m6g.4x(Graviton 实例)    

部署模式:Amazon EMR HBase on Amazon S3 Standard,开启 WAL 功能和关闭 WAL 功能    

写入数据 Client:m6g.4xlarge    

测试软件:YCSB

a8d87bd4ac99f4cb3088b10d311be213.png

YCSB

扫码了解更多

测试架构

3104ccce0d96ec87b327129ff690b9c8.jpeg

测试用例

在不同的模式下,使用 YCSB 向 Amazon EMR HBase 写入数据,运行 10 分钟后,自动关闭集群,开启新集群查看数据条目数。

289dc8d2531a861432ef87c292df8a5e.png

测试方法

1

关闭 WAL 功能的测试

1、创建 Amazon EMR 集群

#创建集群的具体参数如下
aws emr create-cluster \
 --name "emr-hbase-disable-wal" \
 --log-uri "s3n://aws-logs-049970088233-us-west-2/elasticmapreduce/" \
 --release-label "emr-7.1.0" \
 --service-role "arn:aws:iam::049970088233:role/EMR_DefaultRole" \
 --ec2-attributes '{"InstanceProfile":"EMR_EC2_DefaultRole","EmrManagedMasterSecurityGroup":"sg-0660fbec61fde0dfd","EmrManagedSlaveSecurityGroup":"sg-0f4a6644c5c1e740a","KeyName":"us-west-2","AdditionalMasterSecurityGroups":[],"AdditionalSlaveSecurityGroups":[],"SubnetId":"subnet-d8d18a93"}' \
 --applications Name=HBase Name=Hadoop Name=ZooKeeper \
 --configurations '[{"Classification":"hbase-site","Properties":{"hbase.rootdir":"s3://emr-hbase-disable-wal/business-a-production"}},{"Classification":"hbase","Properties":{"hbase.emr.storageMode":"s3"}}]' \
 --instance-groups '[{"InstanceCount":5,"InstanceGroupType":"CORE","Name":"Core","InstanceType":"m6g.4xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp2","SizeInGB":64},"VolumesPerInstance":4}]}},{"InstanceCount":1,"InstanceGroupType":"MASTER","Name":"Primary","InstanceType":"m6g.4xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp3","Iops":3000,"SizeInGB":256,"Throughput":125},"VolumesPerInstance":1}]}}]' \
 --scale-down-behavior "TERMINATE_AT_TASK_COMPLETION" \
 --auto-termination-policy '{"IdleTimeout":3600}' \
 --region "us-west-2"

左右滑动查看完整示意

6e00fff954d925d5013452f11baea7fb.jpeg

2、运行 YCSB 脚本,并在 10 分钟后关闭集群

#YCSB workload文件内容如下
[root@ip-172-31-59-40 YCSB]# cat workloads/workload_100M | grep -v "^#" | grep -v "^$"
recordcount=100000000
operationcount=100000000
workload=site.ycsb.workloads.CoreWorkload
readallfields=true
readproportion=0.5
updateproportion=0.5
scanproportion=0
insertproportion=0
requestdistribution=Zipfian


#创建conf目录,拷贝集群配置文件到该目录下
[root@ip-172-31-59-40 YCSB]# ls conf/hbase-site.xml
conf/hbase-site.xml


#根据YCSB HBase2测试指导,在HBase里创建表,如下

左右滑动查看完整示意

8655c7398db0569f7fba4a4fd41f821f.png

#运行脚本如下
nohup /root/YCSB/bin/ycsb.sh load hbase2 -P /root/YCSB/workloads/workloada -P /root/YCSB/conf/hbase-site.xml -p table=usertable -p columnfamily=family -s -threads 10 &   #在后台执行YCSB的压测命令写入数据
sleep 600 #等待600秒
aws emr terminate-clusters --cluster-ids j-1D8HKB7FFM77H #模拟故障,终止集群

左右滑动查看完整示意

3、创建新集群,从原 Amazon S3 目录恢复,查询当前表的条目数

814cd0bd4f0ba4b0cd33951eb342b3fb.png

和 YCSB 插入的数据条目数对比:

2eb0a92709de985b3a68cd596fde364d.png

两者相差 1780921 条数据,相差的数据即未 Flush 成 HFile 的数据

2

开启 WAL 功能的测试

1、创建开启 WAL 功能的 Amazon EMR 集群

前提条件:要预先在 EMR_EC2_DefaultRole 附加一项 inline policy,policy 示例如下

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "emrwal:ReplayEdits",
                "emrwal:DeleteWal",
                "emrwal:AppendEdit",
                "emrwal:GetCurrentWalTime",
                "emrwal:CreateWal",
                "emrwal:CompleteWalFlush",
                "emrwal:CreateWorkspace",
                "emrwal:ListWALs",
                "emrwal:ListWorkspaces"            ],
            "Resource": "arn:aws:emrwal:us-west-2:049970088233:*/*"
        }
    ]
}

左右滑动查看完整示意

截图如下:

0e801c0333a219ecc05b0f9cae8e7014.png

之后在 console 上创建 Amazon EMR 集群,选择下图红框选项即开启 WAL workspaces 功能

ded0422914fbf00985ef90dfb0562cd9.jpeg

#创建命令如下
aws emr create-cluster \
 --name "emr-hbase-enable-wal" \
 --log-uri "s3://aws-logs-049970088233-us-west-2/elasticmapreduce" \
 --release-label "emr-7.1.0" \
 --service-role "arn:aws:iam::049970088233:role/EMR_DefaultRole" \
 --ec2-attributes '{"InstanceProfile":"EMR_EC2_DefaultRole","EmrManagedMasterSecurityGroup":"sg-0660fbec61fde0dfd","EmrManagedSlaveSecurityGroup":"sg-0f4a6644c5c1e740a","KeyName":"us-west-2","AdditionalMasterSecurityGroups":[],"AdditionalSlaveSecurityGroups":[],"SubnetId":"subnet-d8d18a93"}' \
 --applications Name=HBase Name=Hadoop Name=ZooKeeper \
 --configurations '[{"Classification":"hbase","Properties":{"hbase.emr.storageMode":"s3","hbase.emr.wal.enabled":"true"}},{"Classification":"hbase-site","Properties":{"emr.wal.workspace":"defaultWALworkspace","hbase.rootdir":"s3://emr-hbase-enable-wal/business-b-production"}}]' \ #注意此处配置
 --instance-groups '[{"InstanceCount":1,"InstanceGroupType":"MASTER","Name":"Primary","InstanceType":"m6g.4xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp3","Iops":3000,"SizeInGB":256,"Throughput":125},"VolumesPerInstance":1}]}},{"InstanceCount":5,"InstanceGroupType":"CORE","Name":"Core","InstanceType":"m6g.4xlarge","EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"VolumeType":"gp2","SizeInGB":64},"VolumesPerInstance":4}]}}]' \
 --scale-down-behavior "TERMINATE_AT_TASK_COMPLETION" \
 --region "us-west-2"

左右滑动查看完整示意

2、运行 YCSB 脚本,并在 10 分钟后关闭集群,具体步骤和第一次测试一致

3、创建新集群,从原 Amazon S3 目录恢复,恢复时可扫码参考此配置

6ae072d4db6dee80cec12095aff21e5c.png

相关配置

扫码了解更多

查询用户条目数:

6998467e46b28e65bc0d42d06846ba9e.png

和 YCSB 统计的插入数据条目数一致。

a200f28336be08cc82e94a104213de05.png

测试数据汇总

609c4d8a148717c85931651bff5123c2.png

测试结论

对于开启 Amazon EMR WAL 功能的 Amazon EMR HBase on Amazon S3 模式的集群,在遇到集群意外终止的情况下,数据可以从托管的 WAL workspaces 恢复到完全一致的状态,对数据一致性要求高的用户建议升级到高版本 Amazon EMR 并开启此项功能

本篇作者

e3b15f72b6e4999435542906e9353205.png

韩宇光

亚马逊云科技解决方案架构师,熟悉互联网业务的大数据业务场景,有超过 10 年的运维经验,深入理解云架构设计,对云上的运维、 Devops、大数据解决方案有丰富的实践经验。

fcb20e1c1d2cf0de6e1cb879a29a5dd0.png

刘欣然

亚马逊云科技解决方案架构师,目前负责互联网媒体行业云端应用的架构设计与技术咨询,专注于 Devops 与边缘计算领域。

b6104892fbadac4b44094de631d70498.jpeg

0d65957fb7e73ffde1d20279364b683c.gif

星标不迷路,开发更极速!

关注后记得星标「亚马逊云开发者」

点击阅读原文查看博客,获得更详细内容

听说,点完下面4个按钮

就不会碰到bug了!

085da8c30fb586651529cd270ad989fb.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值