亚马逊云科技 re:Inforce 2024 中国站
再度来袭!
想要了解安全领域的最新发展趋势?
想要学习专业大咖们的深度剖析与见解?
👇 快来了解大会详情吧 👇
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 集群,恢复完整的数据,见下图。
Apache HBase
扫码了解更多
本文会模拟 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
YCSB
扫码了解更多
测试架构
测试用例
在不同的模式下,使用 YCSB 向 Amazon EMR HBase 写入数据,运行 10 分钟后,自动关闭集群,开启新集群查看数据条目数。
测试方法
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"
左右滑动查看完整示意
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 #模拟故障,终止集群
左右滑动查看完整示意
3、创建新集群,从原 Amazon S3 目录恢复,查询当前表的条目数
和 YCSB 插入的数据条目数对比:
两者相差 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:*/*"
}
]
}
左右滑动查看完整示意
截图如下:
之后在 console 上创建 Amazon 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、创建新集群,从原 Amazon S3 目录恢复,恢复时可扫码参考此配置
相关配置
扫码了解更多
查询用户条目数:
和 YCSB 统计的插入数据条目数一致。
测试数据汇总
测试结论
对于开启 Amazon EMR WAL 功能的 Amazon EMR HBase on Amazon S3 模式的集群,在遇到集群意外终止的情况下,数据可以从托管的 WAL workspaces 恢复到完全一致的状态,对数据一致性要求高的用户建议升级到高版本 Amazon EMR 并开启此项功能。
本篇作者
韩宇光
亚马逊云科技解决方案架构师,熟悉互联网业务的大数据业务场景,有超过 10 年的运维经验,深入理解云架构设计,对云上的运维、 Devops、大数据解决方案有丰富的实践经验。
刘欣然
亚马逊云科技解决方案架构师,目前负责互联网媒体行业云端应用的架构设计与技术咨询,专注于 Devops 与边缘计算领域。
星标不迷路,开发更极速!
关注后记得星标「亚马逊云开发者」
点击阅读原文查看博客,获得更详细内容
听说,点完下面4个按钮
就不会碰到bug了!