在Amazon EMR的EKS环境中,当面临管理多集群时,使用批处理网关(Batch Processing Gateway, BPG)可以简化作业管理,提高系统的弹性和可扩展性。此解决方案自动化了作业路由,使得在多集群环境间的负载均衡变得更加高效。
AWS的客户通常使用处理PB级数据。在复杂的企业环境中,由于操作需求不同,客户们常常选择多集群架构。这样做的主要好处包括:
但多集群架构的一个劣势是缺乏有效的工作负载分配及负载均衡机制。本文提出了,作为解决此挑战的集中管理网关,它能够自动化作业管理及路由。
在多集群环境中,Amazon EMR on EKS上的Spark作业需要从多个客户端提交给不同的集群。这样的架构带来了以下主要挑战:
BPG通过提供一个提交Spark作业的单一入口来解决这些问题,自动化作业路由至合适的EMR onEKS集群,提供有效的负载均衡、简化的端点管理和提升的弹性。该解决方案对于使用 的多集群Amazon EMR onEKS设置特别有利。
注意: BPG当前仅与Spark Kubernetes Operator兼容,尚未与进行过测试,并且此解决方案不适用于使用的环境。
描述的网关是一种封装对外部系统或资源访问的对象。在这里,这种资源便是运行Spark的EMRon EKS集群。网关作为与该资源对抗的单一入口,所有代码或连接只与网关的接口交互,而网关负责将传入的API请求转换为资源所提供的API。
BPG是专为Spark on Kubernetes提供无缝接口而设计的网关。这是一个服务,可以将底层的Spark onEKS集群细节从用户中抽象出来。该网关在自己的EKS集群中运行,与不同EKS集群的KubernetesAPI服务器通信。Spark用户通过客户端将应用程序提交给BPG,然后BPG将应用程序路由至底层的EKS集群之一。
提交Spark作业的流程如下:
下图展示了BPG的高层细节,更多关于BPG的信息可以在GitHub的中找到。
删除)
该解决方案涉及对多个底层EMR on EKS集群的BPG实现,有效地解决了前面讨论的缺点。以下图展示了解决方案的细节。

您可以在和的GitHub存储库中找到代码库。
在接下来的部分中,我们将介绍实现此解决方案的步骤。
在您部署此解决方案之前,请确保满足以下先决条件:
假设所有存储库都已克隆到主目录(~/
)中。所有提供的相对路径均基于此假设。如果您已将存储库克隆到其他位置,请相应调整路径。
bash cd ~/ git clone git@github.com:aws-samples/batch-processing-gateway-on- emr-on-eks.git
BPG存储库目前正在积极开发中。为了提供与所提供指令一致的稳定部署体验,我们将存储库固定在稳定的提交哈希aa3e5c8be973bee54ac700ada963667e5913c865
上。
在克隆存储库之前,验证任何安全更新,遵循您组织的安全实践。
bash git clone git@github.com:apple/batch-processing-gateway.git cd batch- processing-gateway git checkout aa3e5c8be973bee54ac700ada963667e5913c865
创建EMR on EKS集群并不是本文的主要内容。有关全面的指导,请参考。然而,为了您的方便,我们已在中包含了设置名为spark-cluster-a-v
和spark-cluster-b-v
的EMR onEKS虚拟集群的步骤。请按照这些步骤创建集群。
成功完成步骤后,您应该在EKS集群spark-cluster-a
和spark-cluster-b
上运行两个名为spark-cluster- a-v
和spark-cluster-b-v
的虚拟集群。
要验证集群的成功创建,请打开Amazon EMR控制台,选择导航窗格中的虚拟集群 。

在Amazon EKS上设置BPG,完成以下步骤:
bash cd ~/batch-processing-gateway-on-emr-on-eks/bpg/
bash export AWS_REGION="<AWS_REGION>"
`bash aws ec2 create-key-pair \ --region "$AWS_REGION" \ --key-name ekskp
--key-type ed25519 \ --key-format pem \ --query "KeyMaterial" \ --output text
ekskp.pem chmod 400 ekskp.pem ssh-keygen -y -f ekskp.pem > eks_publickey.pemchmod 400 eks_publickey.pem`
现在您已准备好创建EKS集群。
默认情况下,eksctl
会在专用虚拟私有云(VPC)中创建EKS集群。为了避免达到账户中VPC数量的默认软限制,使用--vpc-public- subnets
参数在现有VPC中创建集群。在本文中,我们使用默认VPC进行解决方案部署。根据您组织的最佳实践修改以下代码,以在适当的VPC中部署解决方案。有关官方指导,请参见。
bash export DEFAULT_FOR_AZ_SUBNET=$(aws ec2 describe-subnets --region "$AWS_REGION" --filters "Name=default-for-az,Values=true" --query "Subnets[?AvailabilityZone != 'us-east-1e'].SubnetId" | jq -r '. | map(tostring) | join(",")')
bash eksctl create cluster \ --name bpg-cluster \ --region "$AWS_REGION" \ --vpc-public-subnets "$DEFAULT_FOR_AZ_SUBNET" \ --with-oidc \ --ssh-access \ --ssh-public-key eks_publickey.pem \ --instance-types=m5.xlarge \ --managed
bpg-cluster
的成功配置。
在接下来的步骤中,我们将对现有的代码库进行以下更改:
为方便您起见,我们在batch-processing-gateway-on-emr-on- eks
仓库中提供了更新后的文件。您可以将这些文件复制到batch-processing-gateway
仓库。
bash cp ~/batch-processing-gateway-on-emr-on-eks/bpg/pom.xml ~/batch- processing-gateway/pom.xml
bash cp ~/batch-processing-gateway-on-emr-on-eks/bpg/LogDao.java ~/batch- processing-gateway/src/main/java/com/apple/spark/core/LogDao.java
bash cp ~/batch-processing-gateway-on-emr-on-eks/bpg/Dockerfile ~/batch- processing-gateway/Dockerfile
现在,您已准备好构建Docker镜像。
bash aws ecr create-repository --repository-name bpg --region "$AWS_REGION"
bash export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
bash aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$AWS_ACCOUNT_ID".dkr.ecr."$AWS_REGION".amazonaws.com
bash cd ~/batch-processing-gateway/ docker build \ --platform linux/amd64 \ --build-arg VERSION="1.0.0" \ --build-arg BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \ --build-arg GIT_COMMIT=$(git rev-parse HEAD) \ --progress=plain \ --no-cache \ -t bpg:1.0.0 .
bash docker tag bpg:1.0.0 "$AWS_ACCOUNT_ID".dkr.ecr."$AWS_REGION".amazonaws.com/bpg:1.0.0
bash docker push "$AWS_ACCOUNT_ID".dkr.ecr."$AWS_REGION".amazonaws.com/bpg:1.0.0
批处理网关GitHub存储库中的ImagePullPolicy
设置为IfNotPresent
。如需更新镜像,请更新镜像标签。
bpg
存储库:![Amazon删除)
完成以下步骤以设置数据库:
`bash DEFAULT_FOR_AZ_SUBNET_RFMT=$(aws ec2 describe-subnets --region "$AWS_REGION" --filters "Name=default-for-az,Values=true" --query "Subnets。
bash aws rds create-db-subnet-group \ --db-subnet-group-name bpg-rds- subnetgroup \ --db-subnet-group-description "BPG Subnet Group for RDS" \ --subnet-ids "$DEFAULT_FOR_AZ_SUBNET_RFMT" \ --region "$AWS_REGION"
bash export DEFAULT_VPC=$(aws ec2 describe-vpcs --region "$AWS_REGION" --filters "Name=isDefault,Values=true" --query "Vpcs[0].VpcId" --output text)
\--description "BPG Security Group for RDS" \
Leave a Reply