我们有一个长时间运行的 EMR 集群,它使用引导操作在其上安装了多个库。其中一些库正在持续开发中,其代码库位于GitHub上。
我一直在寻求以类似于 Travis 和 CodeDeploy 的方式将 Travis CI 与 AWS EMR 插入。这个想法是让 GitHub 上的代码进行测试并自动部署到 EMR,同时使用引导操作在所有 EMR 节点上安装更新的库。
我想出的一个解决方案是在中间使用EC2实例,其中Travis和CodeDeploy可以首先用于在实例上部署代码。之后,将触发实例上的午餐脚本,以使用更新的库创建新的 EMR 集群。
但是,上述解决方案意味着我们每次部署新版本的系统时都需要创建一个新的 EMR 集群。
还有其他建议吗?
您绝对不希望维护 EC2 实例来编排这样的 CI/CD 流程。首先,它引入了许多挑战,因为随后您需要处理整个服务器实例,保持维护,处理网络,应用监视和警报来处理可用性问题,即使这样,您也不会有可用性保证,这可能会导致其他问题。最重要的是,出于此类目的维护 EC2 实例是不必要的。
我建议您调查使用 Amazon CodePipeline 和 Lambda Step Function。 Step 函数可用于在完全无服务器的环境中编排 EMR 集群的预置。使用 CodePipeline,您可以在 Github 存储库中设置一个 Web 挂钩,以便在将更改提交到主 Github 分支(或您指定的任何分支)时自动启动代码并启动新部署。您可以使用 EMRFS 将 S3 存储桶或文件夹同步到集群的 EMR 文件系统,然后获得 IAM 的安全优势以及 EMRFS 附带的其他一致性保证。借助 Lambda,您还可以无缝集成到其他服务(如 Kinesis、DynamoDB 和 CloudWatch 等)中,这将简化许多管理和开发任务,并使您能够以最少的工作量实现更复杂的自动化。
有一些很棒的资源和教程可以将 CodePipeline 与 EMR 一起使用,以及一般的。以下是一些示例:
- https://aws.amazon.com/blogs/big-data/implement-continuous-integration-and-delivery-of-apache-spark-applications-using-aws/
- https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html
- https://chalice-workshop.readthedocs.io/en/latest/index.html
还有一些很棒的教程,用于使用 Lambda Step 函数编排应用程序,包括使用 EMR。以下是一些示例:
- https://aws.amazon.com/blogs/big-data/orchestrate-apache-spark-applications-using-aws-step-functions-and-apache-livy/
- https://aws.amazon.com/blogs/big-data/orchestrate-multiple-etl-jobs-using-aws-step-functions-and-aws-lambda/
- https://github.com/DavidWells/serverless-workshop/tree/master/lessons-code-complete/events/step-functions
- https://github.com/aws-samples/lambda-refarch-imagerecognition
- https://github.com/aws-samples/aws-serverless-workshops
在最坏的情况下,如果所有这些选项都失败了,例如,在 EMR 集群完成其引导后,您需要非常严格地控制 EMR 集群上的启动过程,则始终可以创建作为最后一步加载的 Java JAR,然后使用它来执行 shell 脚本或使用各种 Amazon Java 库来运行您的预置命令。即使在这种情况下,您仍然不需要出于编排目的维护自己的 EC2 实例(在我看来,即使它在 Kubernetes 的 Docker 容器中运行,这仍然很难证明是合理的),因为您可以使用完全无服务器的方法轻松维护该部署过程。
亚马逊 re:Invent 会议中有许多精彩的视频,您可能想在进入研讨会之前观看这些视频以获得快速入门。例如:
- https://www.youtube.com/watch?v=dCDZ7HR7dms
- https://www.youtube.com/watch?v=Xi_WrinvTnM&t=1470s
YouTube上还有更多这样的视频。
Travis CI还支持Lambda部署,如下所述:https://docs.travis-ci.com/user/deployment/lambda/