AWS EMR 上的持续集成

Continuous Integration on AWS EMR

我们有一个很长的 运行 EMR 集群,上面使用 bootstrap 操作安装了多个库。其中一些库正在持续开发中,它们的代码库位于 GitHub.

我一直在寻找以类似于 Travis 和 CodeDeploy 的方式将 Travis CI 与 AWS EMR 相结合。这个想法是让 GitHub 上的代码经过测试并自动部署到 EMR,同时使用 bootstrap 操作在所有 EMR 的节点上安装更新的库。

我想到的一个解决方案是在中间使用EC2实例,可以先使用Travis和CodeDeploy在实例上部署代码。之后,实例上的午餐脚本被触发,以使用更新的库创建一个新的 EMR 集群。

但是上面的方案意味着我们每次部署新版本的系统都需要创建一个新的EMR集群

还有其他建议吗?

您绝对不想维护 EC2 实例来编排这样的 CI/CD 进程。首先,它带来了很多挑战,因为你需要处理整个服务器实例,保持它的维护,处理网络,应用监控和警报来处理可用性问题,即使那样,你也不会有可用性保证,这可能会导致其他问题。最重要的是,为了这样的目的而维护 EC2 实例是完全没有必要的。

我建议您调查使用 Amazon CodePipeline 和 Lambda Step Function。 Step Function 可用于在完全无服务器环境中编排 EMR 集群的配置。使用 CodePipeline,您可以在您的 Github 存储库中设置一个网络挂钩,以便在将更改提交到主 Github 分支(或您指定的任何分支)时自动提取代码并启动新部署。您可以使用 EMRFS 将 S3 存储桶或文件夹同步到集群的 EMR 文件系统,然后获得 IAM 的安全优势,以及 EMRFS 附带的额外一致性保证。借助 Lambda,您还可以无缝集成到其他服务,例如 Kinesis、DynamoDB 和 CloudWatch 等,这将简化许多管理和开发任务,并使您能够以最小的努力实现更复杂的自动化。

有一些关于将 CodePipeline 与 EMR 以及一般情况结合使用的重要资源和教程。以下是一些示例:

还有关于使用 Lambda Step Functions 编排应用程序的精彩教程,包括 EMR 的使用。以下是一些示例:

在最坏的情况下,如果所有这些选项都失败了,比如在 EMR 集群完成引导后,您需要非常严格地控制 EMR 集群的启动过程,您总是可以创建一个 Java 作为最后一步加载的 JAR,然后使用它来执行 shell 脚本或使用各种亚马逊 Java 库来 运行 您的配置命令。即使在这种情况下,您仍然不需要出于编排目的维护自己的 EC2 实例(在我看来,即使它在 Docker 容器中 运行ning 仍然很难证明是合理的在 Kubernetes 中),因为您可以使用完全无服务器的方法轻松维护该部署过程。

Amazon re:Invent 会议中有许多精彩视频,您可能希望观看这些视频,以便在进入研讨会之前快速入门。例如:

YouTube 上还有更多此类视频。

Travis CI 也支持 Lambda 部署,如下所述:https://docs.travis-ci.com/user/deployment/lambda/