热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:创建并运行EMRonEKS集群

篇首语:本文由编程笔记#小编为大家整理,主要介绍了创建并运行EMRonEKS集群相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了创建并运行 EMR on EKS 集群相关的知识,希望对你有一定的参考价值。








文章目录


    • 0. 前置条件
    • 1. 安装ekscli
    • 2. 安装kubectl
    • 3. 创建EKS集群
    • 4. 查看EKS集群状态
    • 5. 创建Namespace
    • 6. 授权访问Namespace
    • 7. 创建Job Execution Role
    • 8. 创建Role的Trust Relationship
    • 9. 在EKS上创建EMR虚拟集群
    • 10. 向EMR on EKS提交作业
    • 11. 删除与清理
    • 12. 常见错误




EMR on EKS的创建工作完全是命令行驱动的,目前尚无对应的UI界面来完成相关操作。本文将通过命令行演示如何创建并运行一个EMR on EKS集群。创建EMR on EKS的过程可以分为两个阶段:第一阶段是先创建出一个EKS集群,第二阶段是在这个EKS集群之上创建EMR的虚拟集群,以下是具体操作步骤。

注:在操作过程中,我们将会陆续得到一些值,例如EKS集群的名称,虚拟集群的ID,这些变量在后续的操作中会再次使用,为了便于提升文中脚本的可复用性,我们会单独将这些值抽取出来,赋给一个变量,同时用export导出,便于后续的引用。以下是操作过程中将会生成并被引用到的一些变量,以及本例我们将采用的值:


变量名称本例取值描述
REGIONus-east-1当前所处的AWS REGION
ZONESus-east-1a,us-east-1b,us-east-1c分配给将要创建的EKS集群的可用区
EKS_CLUSTER_NAMEit-infrastructure将要创建的EKS集群的名称
DATALAKE_NAMESPACEdatalake将要在EKS上创建的面向数据系统的Kubenetes命名空间,将要创建的EMR on EKS虚拟集群会被置于该空间下
VIRTUAL_CLUSTER_NAMEemr-cluster-1将要创建的EMR on EKS虚拟集群的名字
SSH_PUBLIC_KEY<从EC2->Kye Pairs处查找>将要创建的EKS集群需要指定公钥
EXECUTION_ROLE_ARN<从IAM的Admin Role处查找>用于运行EMR on EKS的IAM Role
VIRTUAL_CLUSTER_ID<过程中产生>将要创建的EMR on EKS虚拟集群的ID

以下是为上述全局变量赋值的命令(VIRTUAL_CLUSTER_ID将在后续操作中产生&#xff0c;暂不赋值)&#xff1a;

export REGION&#61;"us-east-1"
export ZONES&#61;"us-east-1a,us-east-1b,us-east-1c"
export EKS_CLUSTER_NAME&#61;"it-infrastructure"
export DATALAKE_NAMESPACE&#61;"datalake"
export VIRTUAL_CLUSTER_NAME&#61;"emr-cluster-1"
export SSH_PUBLIC_KEY&#61;""
export EXECUTION_ROLE_ARN&#61;""

0. 前置条件


  • 确保有你有一台Linux主机&#xff0c;并已安装awscli命令行
  • 确保配置给awscli的access_key属于一个Admin账号

1. 安装ekscli

ekscli是用于操作eks的命令行工具&#xff0c;我们需要使用到该工具&#xff0c;须先行安装&#xff0c;安装命令如下&#xff1a;

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin

2. 安装kubectl

kubectl是用于管理kubenetes集群的命令行工具&#xff0c;我们需要使用到该工具&#xff0c;须先行安装&#xff0c;安装命令如下&#xff1a;

curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.20.4/2021-04-12/bin/linux/amd64/kubectl
chmod &#43;x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH&#61;$PATH:$HOME/bin
echo &#39;export PATH&#61;$PATH:$HOME/bin&#39; >> ~/.bashrc

3. 创建EKS集群

接下来&#xff0c;我们要在美东1创建名为ABC_IT_INFRASTRUCTURE的EKS集群&#xff0c;命令如下&#xff1a;

eksctl create cluster \\
--region $REGION \\
--name $EKS_CLUSTER_NAME \\
--zones $ZONES \\
--node-type m5.xlarge \\
--nodes 5 \\
--with-oidc \\
--ssh-access \\
--ssh-public-key $SSH_PUBLIC_KEY \\
--managed

上述命令行需要注意如下几点&#xff1a;


  • $SSH_PUBLIC_KEY为你在AWS上的公钥key的ID&#xff0c;这个字符串可在EC2控制台->Key Pairs处查找&#xff0c;name列即是&#xff1b;
  • --zones并不是必选项&#xff0c;如不指定&#xff0c;会随机选择AZ&#xff0c;但是有时随机选择的AZ在创建时并没有足够的资源支撑请求创建的EKS集群&#xff0c;这时就需要显式地指定zone来避开不可用的zone&#xff1b;
  • --node-type--nodes也不是必选项&#xff0c;如不指定&#xff0c;集群默认部署在2个m5.large节点上&#xff0c;对于EMR来说&#xff0c;这个集群的配置太低了&#xff0c;所以必须显式配置这两项&#xff0c;赋予集群更大的资源&#xff1b;

上述命令行需要执行较长时间&#xff08;约20分钟左右&#xff09;&#xff0c;当最后出现:

EKS cluster "ABC_IT_INFRASTRUCTURE" in "us-east-1" region is ready

表明EKS集群已经建好。需要注意的是&#xff0c;该命令在执行过程中会通过Cloud Formation创建大量的基础设施&#xff0c;包括IAM Role&#xff0c;VPC&#xff0c;EC2等等&#xff0c;中途发生错误的可能性较大&#xff0c;且很多操作是不能自动回滚的&#xff0c;所以需要打开Cloud Formation的控制台并持续关注&#xff0c;如发现未清理的Stack&#xff0c;须手动删除Stack后再重新执行上述命令。

eksctl create cluster还有很多可配置的选项&#xff0c;可以通过如下命令查看详细说明&#xff1a;

eksctl create cluster -h

4. 查看EKS集群状态

EKS集群创建完成后&#xff0c;为确保集群是否健康&#xff0c;可通过命令行查看一下集群状况&#xff08;该步骤非必须&#xff0c;可跳过&#xff09;。


  • 查看集群各物理节点状况

kubectl get nodes -o wide

  • 查看集群POD的状况

kubectl get pods --all-namespaces -o wide

5. 创建Namespace

为便于对资源进行管理&#xff0c;我们可以在Kubenetes集群上为数据相关的系统创建单独的namespace&#xff0c;取名ABC_DATALAKE&#xff0c;后续创建的EMR虚拟集群将被置于该namespace下&#xff1a;

kubectl create namespace $DATALAKE_NAMESPACE

6. 授权访问Namespace

默认情况下&#xff0c;EMR on EKS是无权直接访问和使用EKS上的namespace的&#xff0c;需要我们创建一个Kubernetes role&#xff0c;然后将该Role绑定到一个Kubernetes user上&#xff0c;同时将一个服务角色AWSServiceRoleForAmazonEMRContainers映射到这个user上&#xff0c;这样才能桥接Kubenetes端和EMR on EKS服务端之间的权限认证&#xff0c;幸运的是我们不需要手动逐一完成这些操作&#xff0c;通过一条eksctl命令可以直接实现&#xff1a;

eksctl create iamidentitymapping \\
--region $REGION \\
--cluster $EKS_CLUSTER_NAME \\
--namespace $DATALAKE_NAMESPACE \\
--service-name "emr-containers"

控制台的输出也会印证上面的论述&#xff1a;

2021-06-02 12:39:49 [ℹ] created "datalake:Role.rbac.authorization.k8s.io/emr-containers"
2021-06-02 12:39:49 [ℹ] created "datalake:RoleBinding.rbac.authorization.k8s.io/emr-containers"
2021-06-02 12:39:49 [ℹ] adding identity "arn:aws:iam::1234567898765:role/AWSServiceRoleForAmazonEMRContainers" to auth ConfigMap

7. 创建Job Execution Role

运行EMR on EKS需要一个IAM Role&#xff0c;在这个Role中要配置授权EMR on EKS可以使用的资源有哪些&#xff0c;例如s3上某些桶&#xff0c;cloudwatch等服务&#xff0c;这些被称之为Role Policies&#xff0c;官方文档给出过一份Role Policies的参考配置&#xff0c;可参见&#xff1a;https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/creating-job-execution-role.html

为方便起见&#xff0c;本文将直接使用Admin角色作为job execution role


8. 创建Role的Trust Relationship

如果通过第7步创建了一个role&#xff0c;还需要对这个role进行编辑&#xff0c;添加这个role和EMR服务账号&#xff08;EMR managed service account&#xff09;之间的互信。这里所谓的EMR服务账号&#xff08;EMR managed service account&#xff09;是在job提交时自动创建的&#xff0c;所以在配置中在EMR服务账号部分会使用统配符。

不过幸运的是&#xff0c;我们不需要手动编辑Role的Trust Relationships部分&#xff0c;我们可以如下命令行自动添加这个Trust Relationship&#xff1a;

aws emr-containers update-role-trust-policy \\
--cluster-name $EKS_CLUSTER_NAME \\
--namespace $DATALAKE_NAMESPACE \\
--role-name <Admin or the-job-excution-role-name-you-created>

其中&#xff0c;你需要将替换为Admin或者是在第7步中创建的role的名称。当创建成功之后&#xff0c;可以在Role的Trust Relationships页面看到生成的类似下面的相关配置&#xff1a;

{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::1234567898765:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/1C2DF227CD8E011A693BCF03D7EBD581"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringLike": {
"oidc.eks.us-east-1.amazonaws.com/id/1C2DF227CD8E011A693BCF03D7EBD581:sub": "system:serviceaccount:kube-system:emr-containers-sa-*-*-1234567898765-3l0vgne6"
}
}
}

即使我们在第7步选择使用Admin角色作为job execution role&#xff0c;该步操作依然需要执行&#xff0c;–role-name取值Admin, 否则在作业执行过程中无权完成创建Log Group以及在s3上存储日志等操作


9. 在EKS上创建EMR虚拟集群

接下来我们就将创建EMR集群了&#xff0c;其实更准确的叫法应该是“注册”&#xff0c;因为这一步执行完成后并不会在EKS上生成一个EMR集群&#xff0c;这里创建的是一个虚拟的集群&#xff0c;集群要在第一次提交作业时才会创建。创建集群的命令如下&#xff1a;

# create virtual cluster description file
tee $VIRTUAL_CLUSTER_NAME.json <<EOF
{
"name": "$VIRTUAL_CLUSTER_NAME",
"containerProvider": {
"type": "EKS",
"id": "$EKS_CLUSTER_NAME",
"info": {
"eksInfo": {
"namespace": "$DATALAKE_NAMESPACE"
}
}
}
}
EOF

# create virtual cluster
aws emr-containers create-virtual-cluster --cli-input-json file://./$VIRTUAL_CLUSTER_NAME.json

上述命令先创建一个集群描述文件$VIRTUAL_CLUSTER_NAME.json, 这个文件描述了EMR集群的名称以及要建在哪个EKS集群的哪个Namespace上&#xff0c;然后通过aws emr-containers create-virtual-cluster创建出这个文件描述的虚拟集群。

上述命令如果执行成功&#xff0c;会在控制台输出一份描述集群的json数据&#xff0c;其中的id字段较为重要&#xff0c;后续提交作业时都会使用到这个id&#xff0c;如果没有保存下来&#xff0c;也可以通过如下命令随时查询&#xff1a;

aws emr-containers list-virtual-clusters

将获得的id付给全局变量VIRTUAL_CLUSTER_ID&#xff0c;后续操作将会多次引用到该ID&#xff1a;

export VIRTUAL_CLUSTER_ID&#61;&#39;&#39;

10. 向EMR on EKS提交作业

虚拟集群建好之后&#xff0c;就可以提交大数据作业了&#xff0c;EMR on EKS是基于容器的&#xff0c;不同于EMR通过shell登录进行操作&#xff08;可以但不方便&#xff09;&#xff0c;常规的使用方式是将其视为一个计算资源的黑盒&#xff0c;向其提交作业即可。以下是一条向EMR on EKS提交作业的示例命令&#xff0c;它执行的是spark自带的example程序pi.py

aws emr-containers start-job-run \\
--virtual-cluster-id $VIRTUAL_CLUSTER_ID \\
--name sample-job-name \\
--execution-role-arn $EXECUTION_ROLE_ARN \\
--release-label emr-6.2.0-latest \\
--job-driver &#39;{"sparkSubmitJobDriver": {"entryPoint": "local:///usr/lib/spark/examples/src/main/python/pi.py","sparkSubmitParameters": "--conf spark.executor.instances&#61;2 --conf spark.executor.memory&#61;2G --conf spark.executor.cores&#61;2 --conf spark.driver.cores&#61;1"}}&#39; \\
--configuration-overrides &#39;{"monitoringConfiguration": {"cloudWatchMonitoringConfiguration": {"logGroupName": "/emr-on-eks/$VIRTUAL_CLUSTER_NAME", "logStreamNamePrefix": "pi"}}}&#39;

start-job-run这条命令最需要关注的是--job-driver这个参数&#xff0c;所有关于作业本身的相关信息都在这个参数里了。基于文档可知&#xff0c;目前的EMR on EKS仅支持sparkSubmitJobDriver一种形式的作业提交&#xff0c;即只能是以spark-submit可接受的形式提交作业&#xff0c;也就是通过jar包&#43;class或pyspark脚本的形式提交作业。jar包及其依赖jar文件可部署在s3上。

一种更加优雅的作业提交方式是提供一份job run的json描述文件&#xff0c;把所有集群、作业和作业配置相关的信息集中配置在这份json文件中&#xff0c;然后通过命令执行&#xff0c;如下所示&#xff1a;

# create job description file
tee start-job-run-request.json <<EOF
{
"name": "sample-job-name",
"virtualClusterId": "$VIRTUAL_CLUSTER_ID",
"executionRoleArn": "$EXECUTION_ROLE_ARN",
"releaseLabel": "emr-6.2.0-latest",
"jobDriver": {
"sparkSubmitJobDriver": {
"entryPoint": "local:///usr/lib/spark/examples/src/main/python/pi.py",
"sparkSubmitParameters": "--conf spark.executor.instances&#61;2 --conf spark.executor.memory&#61;2G --conf spark.executor.cores&#61;2 --conf spark.driver.cores&#61;1"
}
},
"configurationOverrides": {
"applicationConfiguration": [
{
"classification": "spark-defaults",
"properties": {
"spark.driver.memory":"2G"
}
}
],
"monitoringConfiguration": {
"persistentAppUI": "ENABLED",
"cloudWatchMonitoringConfiguration": {
"logGroupName": "/emr-on-eks/$VIRTUAL_CLUSTER_NAME",
"logStreamNamePrefix": "pi"
},
"s3MonitoringConfiguration": {
"logUri": "s3://glc-emr-on-eks-logs/"
}
}
}
}
EOF

# start job
aws emr-containers start-job-run --cli-input-json file://./start-job-run-request.json

关于json文件的编写&#xff0c;可以参考&#xff1a;https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/emr-eks-jobs-CLI.html#emr-eks-jobs-submit

最后是关于EMR集群的配置&#xff0c;与纯EMR集群类似&#xff0c;集群配置也是通过json文件提交的&#xff0c;写到applicationConfiguration里面&#xff0c;例如上述配置中的"classification": "spark-defaults"部分。由于EMR on EKS目前仅支持Spark&#xff0c;所以也只有如下几类classification可配置


ClassificationsDescriptions
core-siteChange values in Hadoop’s core-site.xml file.
emrfs-siteChange EMRFS settings.
spark-metricsChange values in Spark’s metrics.properties file.
spark-defaultsChange values in Spark’s spark-defaults.conf file.
spark-envChange values in the Spark environment.
spark-hive-siteChange values in Spark’s hive-site.xml file.
spark-log4jChange values in Spark’s log4j.properties file.

11. 删除与清理

删除与清理集群的顺序应与创建过程相反&#xff0c;先删除ERM虚拟集群&#xff0c;然后再删除EKS集群&#xff1a;

# 1. list all jobs
aws emr-containers list-job-runs --virtual-cluster-id $VIRTUAL_CLUSTER_ID
# 2. cancel running jobs
aws emr-containers cancel-job-run --id <job-run-id> --virtual-cluster-id $VIRTUAL_CLUSTER_ID
# 3. delete virtual cluster
aws emr-containers delete-virtual-cluster --id $VIRTUAL_CLUSTER_ID
# 4. delete eks cluster
eksctl delete cluster --region $REGION --name $EKS_CLUSTER_NAME

注意&#xff1a;第4步在删除EKS集群时&#xff0c;须找到对应Cloud Formation模板里的一项资源NodeInstanceRole&#xff0c;手动dettach 该Role上的所有policies&#xff0c;命令才能执行成功。


12. 常见错误


  • 通过eksctl create cluster创建的eks集群默认是两个m5.large节点&#xff0c;这个配置很难支撑一个EMR集群&#xff0c;所以务必要指定一下节点数量和节点类型&#xff1a;

  • 如果在第3步创建EKS集群遇到类似如下的错误&#xff1a;

AWS::EKS::Cluster/ControlPlane: CREATE_FAILED – "Cannot create cluster &#39;my-bigdata-infra-cluster&#39; because us-east-1e, the targeted availability zone, does not currently have sufficient capacity to support the cluster. Retry and choose from these availability zones: us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1f (Service: AmazonEKS; Status Code: 400; Error Code: UnsupportedAvailabilityZoneException; Request ID: 61028748-0cc1-4100-9152-aab79a475fe6; Proxy: null)"

说明自动分配或指定的某一个AZ目前不可用&#xff0c;可在--zones参数列表中取其他AZ替换。

关于作者&#xff1a;架构师&#xff0c;15年IT系统开发和架构经验&#xff0c;对大数据、企业级应用架构、SaaS、分布式存储和领域驱动设计有丰富的实践经验&#xff0c;热衷函数式编程。对Hadoop/Spark 生态系统有深入和广泛的了解&#xff0c;参与过Hadoop商业发行版的开发&#xff0c;曾带领团队建设过数个完备的企业数据平台&#xff0c;个人技术博客&#xff1a;https://laurence.blog.csdn.net/ 作者著有《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书&#xff0c;该书已在京东和当当上线。
在这里插入图片描述






推荐阅读
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 在安装 iOS 开发所需的 CocoaPods 时,用户可能会遇到多种问题。其中一个常见问题是,在执行 `pod setup` 命令后,系统无法连接到 GitHub 以更新 CocoaPods/Specs 仓库。这可能是由于网络连接不稳定、GitHub 服务器暂时不可用或本地配置错误等原因导致。为解决此问题,建议检查网络连接、确保 GitHub API 限制未被触发,并验证本地配置文件是否正确。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 本文介绍了 Vue 开发的入门指南,重点讲解了开发环境的配置与项目的基本搭建。推荐使用 WebStorm 作为 IDE,其下载地址为 。安装时请选择适合您操作系统的版本,并通过 获取激活码。WebStorm 是前端开发者的理想选择,提供了丰富的功能和强大的代码编辑能力。 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 如何在任意浏览器中轻松安装并使用VSCode——Codeserver简易指南
    code-server 是一款强大的工具,允许用户在任何服务器上部署 VSCode,并通过浏览器进行访问和使用。这一解决方案不仅简化了开发环境的搭建过程,还提供了高度灵活的工作方式。用户只需访问 GitHub 上的官方仓库(GitHub-coder/code-server),即可获取详细的安装和配置指南,快速启动并运行 code-server。无论是个人开发者还是团队协作,code-server 都能提供高效、便捷的代码编辑体验。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • Docker镜像加载优化:开发者的高效实践指南
    Docker镜像加载优化:开发者的高效实践指南 ... [详细]
  • 在Ubuntu 20.04 Linux系统中部署Git的详细步骤与最佳实践
    在Ubuntu 20.04 Linux系统中部署Git时,首先确保您的操作系统版本正确,并已以具备sudo权限的用户身份登录。推荐使用APT软件包管理器进行安装,这是最简便且可靠的方法。此外,遵循最佳实践,如定期更新Git版本和配置全局设置,可以进一步提升使用体验和安全性。 ... [详细]
author-avatar
手机用户2502929415
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有