使用批处理网关在多集群 Amazon E

使用批处理网关自动化多集群下的工作管理

关键要点

在Amazon EMR的EKS环境中,当面临管理多集群时,使用批处理网关(Batch Processing Gateway, BPG)可以简化作业管理,提高系统的弹性和可扩展性。此解决方案自动化了作业路由,使得在多集群环境间的负载均衡变得更加高效。

AWS的客户通常使用处理PB级数据。在复杂的企业环境中,由于操作需求不同,客户们常常选择多集群架构。这样做的主要好处包括:

  • 更好的弹性与无单点故障 – 一旦某个集群发生故障,其他集群仍可继续处理关键工作,保持业务连续性
  • 更好的安全性与隔离 – 增加作业之间的隔离,提升了安全性并简化了合规性
  • 更好的可扩展性 – 在集群间分配工作量,使横向扩展更为便捷,以应对高峰期的需求
  • 性能收益 – 最小化Kubernetes调度延迟及网络带宽争用,提高作业运行时间
  • 更高的灵活性 – 轻松进行实验与成本优化,在多个集群间孤立工作负载

但多集群架构的一个劣势是缺乏有效的工作负载分配及负载均衡机制。本文提出了,作为解决此挑战的集中管理网关,它能够自动化作业管理及路由。

多集群环境面临的挑战

在多集群环境中,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作业的流程如下:

  1. 用户使用客户端将作业提交给BPG。
  2. BPG解析请求,将其转换为自定义资源定义(CRD),并根据预定义规则提交该CRD至EMR on EKS集群。
  3. Spark Kubernetes Operator解释作业规范并在集群中启动作业。
  4. Kubernetes调度程序调度并管理作业的运行。

下图展示了BPG的高层细节,更多关于BPG的信息可以在GitHub的中找到。

删除)

该解决方案涉及对多个底层EMR on EKS集群的BPG实现,有效地解决了前面讨论的缺点。以下图展示了解决方案的细节。

![批处理网关的端到端架构图](https://d2908q01vomqb2.cloudfront.net/b6692ea5df920cad691c20319a6fffd7a4a766b8/2024/09/05/BDB-4164-2-bpg- 删除)

源代码

您可以在和的GitHub存储库中找到代码库。

在接下来的部分中,我们将介绍实现此解决方案的步骤。

先决条件

在您部署此解决方案之前,请确保满足以下先决条件:

  • 访问有效的AWS账户
  • 在本地计算机上安装(AWS CLI)
  • 在本地计算机上安装、、、、、和工具
  • 有权限创建AWS资源
  • 熟悉Kubernetes、Amazon EKS和Amazon EMR on EKS

克隆存储库到本地计算机

假设所有存储库都已克隆到主目录(~/)中。所有提供的相对路径均基于此假设。如果您已将存储库克隆到其他位置,请相应调整路径。

  1. 通过以下命令克隆BPG在EMR上的EKS GitHub仓库:

bash cd ~/ git clone git@github.com:aws-samples/batch-processing-gateway-on- emr-on-eks.git

BPG存储库目前正在积极开发中。为了提供与所提供指令一致的稳定部署体验,我们将存储库固定在稳定的提交哈希aa3e5c8be973bee54ac700ada963667e5913c865上。

在克隆存储库之前,验证任何安全更新,遵循您组织的安全实践。

  1. 通过以下命令克隆BPG GitHub仓库:

bash git clone git@github.com:apple/batch-processing-gateway.git cd batch- processing-gateway git checkout aa3e5c8be973bee54ac700ada963667e5913c865

创建两个EMR on EKS集群

创建EMR on EKS集群并不是本文的主要内容。有关全面的指导,请参考。然而,为了您的方便,我们已在中包含了设置名为spark-cluster-a-vspark-cluster-b-v的EMR onEKS虚拟集群的步骤。请按照这些步骤创建集群。

成功完成步骤后,您应该在EKS集群spark-cluster-aspark-cluster-b上运行两个名为spark-cluster- a-vspark-cluster-b-v的虚拟集群。

要验证集群的成功创建,请打开Amazon EMR控制台,选择导航窗格中的虚拟集群

![Amazon EMR onEKS设置图](https://d2908q01vomqb2.cloudfront.net/b6692ea5df920cad691c20319a6fffd7a4a766b8/2024/09/05/BDB-4164-3-emr- 删除)

在Amazon EKS上设置BPG

在Amazon EKS上设置BPG,完成以下步骤:

  1. 切换到合适的目录:

bash cd ~/batch-processing-gateway-on-emr-on-eks/bpg/

  1. 设置AWS区域:

bash export AWS_REGION="<AWS_REGION>"

  1. 。确保遵循您组织的最佳实践进行密钥对管理。

`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中部署解决方案。有关官方指导,请参见。

  1. 获取您的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(",")')

  1. 创建集群:

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

  1. 在Amazon EKS控制台中,选择导航窗格中的集群 ,检查bpg-cluster的成功配置。

![基于AmazonEKS的BPG集群设置图](https://d2908q01vomqb2.cloudfront.net/b6692ea5df920cad691c20319a6fffd7a4a766b8/2024/09/05/BDB-4164-4-bpg- 删除)

在接下来的步骤中,我们将对现有的代码库进行以下更改:

  • 由于bpg代码库未包含MySQL驱动程序,请在或POM XML文件中更新以包含
  • 更新POM XML以使用所有依赖项的最新版本
  • 更新或DAO Java文件中的SQL语法,以符合MySQL语法
  • 在中添加下载的说明

为方便您起见,我们在batch-processing-gateway-on-emr-on- eks仓库中提供了更新后的文件。您可以将这些文件复制到batch-processing-gateway仓库。

  1. 替换POM XML文件:

bash cp ~/batch-processing-gateway-on-emr-on-eks/bpg/pom.xml ~/batch- processing-gateway/pom.xml

  1. 替换DAO Java文件:

bash cp ~/batch-processing-gateway-on-emr-on-eks/bpg/LogDao.java ~/batch- processing-gateway/src/main/java/com/apple/spark/core/LogDao.java

  1. 替换Dockerfile:

bash cp ~/batch-processing-gateway-on-emr-on-eks/bpg/Dockerfile ~/batch- processing-gateway/Dockerfile

现在,您已准备好构建Docker镜像。

  1. 创建一个私有的 (Amazon ECR)存储库:

bash aws ecr create-repository --repository-name bpg --region "$AWS_REGION"

  1. 获取AWS账户ID:

bash export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)

  1. 对Docker进行身份验证以访问ECR注册表:

bash aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$AWS_ACCOUNT_ID".dkr.ecr."$AWS_REGION".amazonaws.com

  1. 构建您的Docker镜像:

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 .

  1. 标记您的镜像:

bash docker tag bpg:1.0.0 "$AWS_ACCOUNT_ID".dkr.ecr."$AWS_REGION".amazonaws.com/bpg:1.0.0

  1. 将镜像推送到ECR存储库:

bash docker push "$AWS_ACCOUNT_ID".dkr.ecr."$AWS_REGION".amazonaws.com/bpg:1.0.0

批处理网关GitHub存储库中的ImagePullPolicy设置为IfNotPresent。如需更新镜像,请更新镜像标签。

  1. 要验证Docker镜像的成功创建和上传,请打开Amazon ECR控制台,选择导航窗格中的存储库 下的私有注册表 ,并找到bpg存储库:

![Amazon删除)

设置Amazon Aurora MySQL数据库

完成以下步骤以设置数据库:

  1. 列出特定格式下某个可用区的所有默认子网:

`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"

  1. 列出默认的VPC:

bash export DEFAULT_VPC=$(aws ec2 describe-vpcs --region "$AWS_REGION" --filters "Name=isDefault,Values=true" --query "Vpcs[0].VpcId" --output text)

  1. 创建安全组:
\--description "BPG Security Group for RDS" \

Leave a Reply

Required fields are marked *