背景
Amazon EMR 是行业领先的云大数据解决方案,适用于使用开源框架(如 Apache Spark、Apache Hive、Presto)进行 PB 级数据处理、交互分析和机器学习。
Amazon EMR 原生支持 Apache HBase,让您可以实时访问可扩展到数十亿行和数百万列的表。
EMR HBase 有两种模式:
- EMR HBase on HDFS,即基于 HDFS 的传统 HBase 构建方式。
- EMR HBase on S3,是采用 EMR 文件系统的 Apache HBase,使用 Amazon S3 作为数据存储可以将计算与存储分离,Amazon EMR 还会将 Apache HBase 数据文件(HFile)保存到 Amazon S3。而且与 Apache Hadoop 的集群上 Hadoop Distributed File System(HDFS)相比,具有多种优势,详见 https://aws.amazon.com/cn/emr/features/hbase/。
EMR HBase WAL 功能介绍:
- WAL 介绍:HBase 的 Write Ahead Log(WAL)提供了一种高并发、持久化的日志保存与回放机制。每一个业务数据的写入操作(PUT / DELETE)执行前,都会记账在 WAL 中,主要用于灾难恢复,类似 MySQL 的 BIN log。
- EMR HBase on S3 模式在 EMR 6.15 版本之前 WAL 日志是存储在 EMR HBase 的 HDFS 上的(HFile 在 S3 上),如果用户误删除了 WAL 日志或操作失误终止了 EMR 集群,那对于未及时 Flush 成 HFile 的数据是无法恢复,需要重新写入的。
- EMR HBase on S3 模式在 EMR 6.15 版本之后,推出了托管的 WAL workspaces 功能,用户可以将 WAL 日志存储到托管的 WAL workspaces 上,如果出现上述的情况,用户也可以重新创建 EMR HBase 集群,恢复完整的数据,见下图。
本篇 Blog 会模拟 EMR 集群意外终止的情况,以对比 WAL 功能开启和关闭之后的数据一致性情况,以验证托管 WAL 功能的作用。
测试准备
| 测试的 AWS 服务 |
Amazon EMR HBase on S3 |
| 测试区域 |
AWS 美西 2 区域 |
| 测试版本 |
EMR 7.1.0,对应 HBase 2.4.17 |
| 测试机型 |
m6g.4x(Graviton 实例) |
| 部署模式 |
EMR HBase on S3 Standard,开启 WAL 功能和关闭 WAL 功能 |
| 写入数据 Client |
m6g.4xlarge |
| 测试软件 |
YCSB https://github.com/akopytov/sysbench |
测试架构
测试用例
在不同的模式下,使用 YCSB 向 EMR HBase 写入数据,运行 10 分钟后,自动关闭集群,开启新集群查看数据条目数。
| 模式 |
YCSB Client 写入条目总数 |
EMR HBase 恢复后的条目数 |
| EMR HBase on S3 关闭 WAL 功能 |
/ |
/ |
| EMR HBase on S3 开启 WAL 功能 |
/ |
/ |
测试方法
一:关闭 WAL 功能的测试
- 创建 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"
 |
- 运行 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里创建表,如下
#运行脚本如下
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 #模拟故障,终止集群
- 创建新集群,从原 S3 目录恢复,查询当前表的条目数
和 YCSB 插入的数据条目数对比
两者相差 1780921 条数据,相差的数据即未 Flush 成 HFile 的数据
二:开启 WAL 功能的测试
1. 创建开启 WAL 功能的 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:*/*"
}
]
}
截图如下
之后在 console 上创建 EMR 集群,选择下图红框选项即开启 WAL workspaces 功能
 |
#创建命令如下
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. 创建新集群,从原 S3 目录恢复,恢复时参考此配置 https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hbase-wal-restoring.html
查询用户条目数
和 YCSB 统计的插入数据条目数一致
测试数据汇总
| 模式 |
YCSB Client 写入条目总数 |
EMR HBase 恢复后的条目数 |
备注 |
| EMR HBase 关闭 WAL 功能 |
9745276 |
7964355 |
意外终止时,数据未 Flush 成 HFile 导致恢复集群后数据不一致 |
| EMR HBase 开启 WAL 功能 |
1030182 |
1030182 |
意外终止时,完整保留 WAL 日志到托管的 workspace,恢复集群后数据一致 |
测试结论
对于开启 EMRWAL 功能的 EMR HBase on S3 模式的集群,在遇到集群意外终止的情况下,数据可以从托管的 WAL workspace 恢复到完全一致的状态,对数据一致性要求高的用户建议升级到高版本 EMR 并开启此项功能。
本篇作者