使用批处理网关在多集群 Amazon EMR on EKS 环境中自动化作业管理 大数据博客
使用批处理网关自动化多集群下的工作管理
关键要点
在Amazon EMR的EKS环境中,当面临管理多集群时,使用批处理网关Batch Processing Gateway BPG可以简化作业管理,提高系统的弹性和可扩展性。此解决方案自动化了作业路由,使得在多集群环境间的负载均衡变得更加高效。
AWS的客户通常使用Amazon EMR on EKS处理PB级数据。在复杂的企业环境中,由于操作需求不同,客户们常常选择多集群架构。这样做的主要好处包括:
更好的弹性与无单点故障 一旦某个集群发生故障,其他集群仍可继续处理关键工作,保持业务连续性更好的安全性与隔离 增加作业之间的隔离,提升了安全性并简化了合规性更好的可扩展性 在集群间分配工作量,使横向扩展更为便捷,以应对高峰期的需求性能收益 最小化Kubernetes调度延迟及网络带宽争用,提高作业运行时间更高的灵活性 轻松进行实验与成本优化,在多个集群间孤立工作负载但多集群架构的一个劣势是缺乏有效的工作负载分配及负载均衡机制。本文提出了批处理网关BPG,作为解决此挑战的集中管理网关,它能够自动化作业管理及路由。
多集群环境面临的挑战
在多集群环境中,Amazon EMR on EKS上的Spark作业需要从多个客户端提交给不同的集群。这样的架构带来了以下主要挑战:
端点管理 客户端必须维护和更新到每个目标集群的连接操作开销 单独管理多个客户端连接增加了复杂性和操作负担工作负载分配 缺乏在多个集群间路由作业的内置机制,影响配置、资源分配、成本透明度和系统弹性高可用性和容错能力 没有负载均衡机制的环境缺乏容错能力和高可用性BPG通过提供一个提交Spark作业的单一入口来解决这些问题,自动化作业路由至合适的EMR on EKS集群,提供有效的负载均衡、简化的端点管理和提升的弹性。该解决方案对于使用Spark Kubernetes Operator 的多集群Amazon EMR on EKS设置特别有利。
注意: BPG当前仅与Spark Kubernetes Operator兼容,尚未与Volcano调度程序进行过测试,并且此解决方案不适用于使用原生Amazon EMR on EKS API的环境。
解决方案概述
Martin Fowler描述的网关是一种封装对外部系统或资源访问的对象。在这里,这种资源便是运行Spark的EMR on EKS集群。网关作为与该资源对抗的单一入口,所有代码或连接只与网关的接口交互,而网关负责将传入的API请求转换为资源所提供的API。
BPG是专为Spark on Kubernetes提供无缝接口而设计的网关。这是一个REST API服务,可以将底层的Spark on EKS集群细节从用户中抽象出来。该网关在自己的EKS集群中运行,与不同EKS集群的Kubernetes API服务器通信。Spark用户通过客户端将应用程序提交给BPG,然后BPG将应用程序路由至底层的EKS集群之一。
提交Spark作业的流程如下:
用户使用客户端将作业提交给BPG。BPG解析请求,将其转换为自定义资源定义CRD,并根据预定义规则提交该CRD至EMR on EKS集群。Spark Kubernetes Operator解释作业规范并在集群中启动作业。Kubernetes调度程序调度并管理作业的运行。下图展示了BPG的高层细节,更多关于BPG的信息可以在GitHub的README中找到。
该解决方案涉及对多个底层EMR on EKS集群的BPG实现,有效地解决了前面讨论的缺点。以下图展示了解决方案的细节。
源代码
您可以在AWS Samples和批处理网关的GitHub存储库中找到代码库。
在接下来的部分中,我们将介绍实现此解决方案的步骤。
先决条件
在您部署此解决方案之前,请确保满足以下先决条件:
访问有效的AWS账户在本地计算机上安装AWS命令行界面AWS CLI在本地计算机上安装git、docker、eksctl、kubectl、helm、jq和yq工具有权限创建AWS资源熟悉Kubernetes、Amazon EKS和Amazon EMR on EKS克隆存储库到本地计算机
假设所有存储库都已克隆到主目录/中。所有提供的相对路径均基于此假设。如果您已将存储库克隆到其他位置,请相应调整路径。
通过以下命令克隆BPG在EMR上的EKS GitHub仓库:bash cd / git clone git@githubcomawssamples/batchprocessinggatewayonemroneksgit
BPG存储库目前正在积极开发中。为了提供与所提供指令一致的稳定部署体验,我们将存储库固定在稳定的提交哈希aa3e5c8be973bee54ac700ada963667e5913c865上。
在克隆存储库之前,验证任何安全更新,遵循您组织的安全实践。
通过以下命令克隆BPG GitHub仓库:bash git clone git@githubcomapple/batchprocessinggatewaygit cd batchprocessinggateway git checkout aa3e5c8be973bee54ac700ada963667e5913c865
创建两个EMR on EKS集群
创建EMR on EKS集群并不是本文的主要内容。有关全面的指导,请参考使用Spark Operator运行Spark作业。然而,为了您的方便,我们已在GitHub仓库中包含了设置名为sparkclusterav和sparkclusterbv的EMR on EKS虚拟集群的步骤。请按照这些步骤创建集群。
成功完成步骤后,您应该在EKS集群sparkclustera和sparkclusterb上运行两个名为sparkclusterav和sparkclusterbv的虚拟集群。
要验证集群的成功创建,请打开Amazon EMR控制台,选择导航窗格中的虚拟集群。
在Amazon EKS上设置BPG
在Amazon EKS上设置BPG,完成以下步骤:
切换到合适的目录:bash cd /batchprocessinggatewayonemroneks/bpg/
设置AWS区域:bash export AWSREGION=ltAWSREGIONgt
创建密钥对。确保遵循您组织的最佳实践进行密钥对管理。bash aws ec2 createkeypair region AWSREGION keyname ekskp keytype ed25519 keyformat pem query KeyMaterial output text gt ekskppem chmod 400 ekskppem sshkeygen y f ekskppem gt ekspublickeypem chmod 400 ekspublickeypem
现在您已准备好创建EKS集群。
默认情况下,eksctl会在专用虚拟私有云VPC中创建EKS集群。为了避免达到账户中VPC数量的默认软限制,使用vpcpublicsubnets参数在现有VPC中创建集群。在本文中,我们使用默认VPC进行解决方案部署。根据您组织的最佳实践修改以下代码,以在适当的VPC中部署解决方案。有关官方指导,请参见创建VPC。
获取您的VPC的公共子网:bash export DEFAULTFORAZSUBNET=(aws ec2 describesubnets region AWSREGION filters Name=defaultforazValues=true query Subnets[AvailabilityZone != useast1e]SubnetId jq r map(tostring) join())
创建集群:bash eksctl create cluster name bpgcluster region AWSREGION vpcpublicsubnets DEFAULTFORAZSUBNET withoidc sshaccess sshpublickey ekspublickeypem instancetypes=m5xlarge managed
在Amazon EKS控制台中,选择导航窗格中的集群,检查bpgcluster的成功配置。在接下来的步骤中,我们将对现有的批处理网关代码库进行以下更改:
由于bpg代码库未包含MySQL驱动程序,请在项目对象模型或POM XML文件中更新以包含mysqlconnectorjava更新POM XML以使用所有依赖项的最新版本更新数据访问对象或DAO Java文件中的SQL语法,以符合MySQL语法在Dockerfile中添加下载Apache Maven的说明为方便您起见,我们在batchprocessinggatewayonemroneks仓库中提供了更新后的文件。您可以将这些文件复制到batchprocessinggateway仓库。
替换POM XML文件:bash cp /batchprocessinggatewayonemroneks/bpg/pomxml /batchprocessinggateway/pomxml
替换DAO Java文件:
bash cp /batchprocessinggatewayonemroneks/bpg/LogDaojava /batchprocessinggateway/src/main/java/com/apple/spark/core/LogDaojava
替换Dockerfile:bash cp /batchprocessinggatewayonemroneks/bpg/Dockerfile /batchprocessinggateway/Dockerfile
现在,您已准备好构建Docker镜像。
创建一个私有的Amazon Elastic Container Registry (Amazon ECR)存储库:
bashaws ecr createrepository repositoryname bpg region AWSREGION
获取AWS账户ID:
bashexport AWSACCOUNTID=(aws sts getcalleridentity query Account output text)
对Docker进行身份验证以访问ECR注册表:
bashaws ecr getloginpassword region AWSREGION docker login username AWS passwordstdin AWSACCOUNTIDdkrecrAWSREGIONamazonawscom
构建您的Docker镜像:
蓝鲸加速器苹果版bashcd /batchprocessinggateway/docker build platform linux/amd64 buildarg VERSION=100 buildarg BUILDTIME=(date u YmdTHMSZ) buildarg GITCOMMIT=(git revparse HEAD) progress=plain nocache t bpg100
标记您的镜像:
bashdocker tag bpg100 AWSACCOUNTIDdkrecrAWSREGIONamazonawscom/bpg100
将镜像推送到ECR存储库:
bashdocker push AWSACCOUNTIDdkrecrAWSREGIONamazonawscom/bpg100
批处理网关GitHub存储库中的ImagePullPolicy设置为IfNotPresent。如需更新镜像,请更新镜像标签。
要验证Docker镜像的成功创建和上传,请打开Amazon ECR控制台,选择导航窗格中的存储库下的私有注册表,并找到bpg存储库:设置Amazon Aurora MySQL数据库
完成以下步骤以设置Amazon Aurora MySQL兼容版数据库:
列出特定格式下某个可用区的所有默认子网:bash DEFAULTFORAZSUBNETRFMT=(aws ec2 describesubnets region AWSREGION filters Name=defaultforazValues=true query Subnets[]SubnetId jq c )
创建子网组。有关更多信息,请参考createdbsubnetgroup。bash aws rds createdbsubnetgroup dbsubnetgroupname bpgrdssubnetgroup dbsubnetgroupdescription BPG Subnet Group for RDS subnetids DEFAULTFORAZSUBNETRFMT region AWSREGION
列出默认的VPC:bash export DEFAULTVPC=(aws ec2 describevpcs region AWSREGION filters Name=isDefaultValues=true query Vpcs[0]VpcId output text)
创建安全组:bash aws ec2 createsecuritygroup groupname bpgrdssecuritygroup description BPG Security Group for RDS