亚马逊AWS官方博客

探索 Amazon EMR HBase 托管 WAL workspaces 新功能

背景

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 功能的测试

  1. 创建 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"
    
  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 #模拟故障,终止集群
    
  1. 创建新集群,从原 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 并开启此项功能。

本篇作者

韩宇光

亚马逊云科技解决方案架构师,熟悉互联网业务的大数据业务场景,在加入 AWS 之前,在猎豹移动任职大数据高级运维工程师,有 10 多年的运维经验,深入理解云架构设计,对云上的运维,Devops,大数据解决方案有丰富的实践经验。

刘欣然

亚马逊云科技解决方案架构师,目前负责互联网媒体行业云端应用的架构设计与技术咨询。在加入 AWS 之前从事多年互联网开发工作,目前专注于 Devops 与边缘计算领域。