当你需要时,按需求提供合适规模的基础设施的想法,从我听说的那一刻起就引起了我的好奇。那是我接触 AWS Lambda 函数的时候。AWS Lambda 服务的设计决定了某些限制。执行超时和可用内存就是很好的例子。就我而言,这些最常见的限制使 Lambda 函数不适合完成任务。
尽管如此,Lambda 服务背后的想法还是很聪明、普遍适用且有用的。其中两个对我来说特别有趣……
按需提供基础设施,因为如果基础设施不被使用,那么它就没有存在的必要。为了强调这一原则,如果基础设施闲置,就没有必要为其付费。
按需扩展,因为有时需要更强的计算能力。
现在,开始将 AWS EMR 作为我们的超级 Lambda……
需要高计算能力的数据处理并不便宜。需要处理的数据越多,存储、扫描和从中推断任何有意义的东西的成本就越高。AWS EMR(Elastic Mapreduce)是我最常用于解决此类问题的工具之一。
我可以告诉你,使用它的成本会很快增加。
关于 AWS EMR
AWS EMR 服务提供计算机集群并为我们提供其计算能力。这也可以告诉我们 EMR 的正确用例是什么。这是一个非常宽泛的定义……当传统数据查询/处理工具无法在合理的时间内给出结果时,它可能是一种选择。
例如,针对 MySQL 触发的 SQL 查询将在十二小时内提供结果。
Apache Spark 应用程序或 Apache Hive 查询都可以在 AWS EMR 上运行,可能是更好的选择。
单个 EMR 集群由几个组件组成:
- 主节点(或最多三个主节点) 主节点管理集群并运行集群资源管理器。正如 AWS 文档所述,它还“运行 HDFS NameNode 服务、跟踪提交到集群的作业状态并监控实例组的运行状况”。
- 核心节点 核心节点作为 HDFS 的一部分执行计算任务并协调数据存储。它们由主节点管理。只能有一个核心节点实例组。
- 任务节点 任务节点是集群计算能力的基础,只执行计算任务,最多可以有48个任务节点实例组,每个任务节点实例组选择统一的实例类型。
最小的 EMR 集群将有一个主节点和两个核 购买批量短信服务 心节点。合理的主节点可以是 m5.xlarge 类型的实例。核心节点可以是 r5.xlarge 类型的实例。
与 AWS Lambda 函数相比,这已经不是一个简单的设置,更不用说它的成本了。
我们可以向其中添加一个任务节点实例组……r5.2xlarge 或 r5.4xlarge 实例。这很快就会变得非常昂贵!
这是我们可以从 AWS Lambda “窃取” 海湾电子邮件列表 的地方。我们可以采用这两个原则并将其融入到我们对 AWS EMR 的使用中。
按需 EMR 基础设施
集群创建
我们可以仅在需要时创建 EMR 集群,并在不再需要时将其关闭。
如上图所示,EMR 集群可以在需要时 30 多种顶级初创企业营销工具助您打造和扩展业务 动态创建。这可以由任何类型的事件或来自任何 AWS 服务的消息触发。
例如,我们要创建一个 EMR 集群。当一些数据到达 AWS S3 时,即当 AWS S3 中创建一个对象时,它应该发生。
另一个用例是创建 EMR 集群作为计划处理的一部分。这可以通过 AWS CloudWatch cron 事件触发。
无论我们决定对哪个事件做出反应,我们都需要一个工具来运行我们的创建机制。例如,它可以是 Step 函数、批处理作业或 Lambda 函数。
工作负载提交
创建 EMR 集群后,可以以 EMR 步骤数组的形式提交工作负载。例如,使用 Python Boto3 库,可以在集群创建时完成
emr_response = emr.run_job_flow(…,步骤=steps_definition,…)
或者通过单独调用 AWS EMR 服务
emr . add_job_flow_steps ( JobFlowId = ‘string’ , Steps = […] )
集群破坏
当集群完成工作后会发生什么?我们可能希望让它保持运行,以便将来提交可能的工作负载。但让我们假设情况并非如此 — — 我们想关闭它。
在这种情况下,在创建集群时需要注意一个细节:
emr_response = emr.run_job_flow(…,ScaleDownBehavior =“TERMINATE_AT_TASK_COMPLETION”)
通过向 EMR 指定这种缩减行为,集群将在完成所有工作后被销毁。
步骤失败
如果单个 EMR 步骤失败会发生什么情况?
我们不想因为集群没有到达最后一步并正常关闭而让它处于空闲状态。
我们想要的是,通过为提交的每个步骤指定以下信息来定义步骤失败时的行为:
“actionOnFailure”:“TERMINATE_CLUSTER”
通过采取所有这些措施,我们可以确保不会受到 AWS 成本攀升的影响。此外,还可以考虑实施“按需基础设施”原则。
按需扩展
如何实现按需扩展原则?
通过使用 EMR 的内置自动扩展功能。
将自动扩展策略附加到 EMR 集群,使其能够根据需要进行扩展。
自动扩展策略至少应包含两条规则,但可以包含多条规则。一条规则应指示集群何时扩展,另一条规则应指示集群何时收缩。
扩展规则可能是这样的:“如果可用集群内存变得低于 15% 并且保持这种状态超过 5 分钟,则该集群应该将其一个任务实例组增加 5 个实例”。
规则中的尺度可能是这样的:“如果可用集群内存超过 75%,并且保持这种状态超过 3 分钟,则该集群应该将相同的任务实例组缩小 3 个实例”。
下面可以看到EMR 集群的适当自动扩展策略定义。
实施这一原则使我们能够拥有以下工作流程:
- 从最小规模的集群开始
- 当集群的工作负载增加,并且超出其当前规模时,集群就会增长
- 当集群上的负载消失时,它会关闭一些工作实例并缩小规模
EMR 总结
这两个原则结合起来几乎使 EMR 集群成为一种 AWS Lambda 函数。Lambda 启动缓慢,但计算能力、内存和处理时间几乎无限。
和所有事情一样,有些事情需要相当长的启动时间。配置一个集群大约需要十分钟。
如果引导时间不是问题,EMR 方法允许您释放自动扩展和配置的处理能力,同时绕过 Lambda 的内存和超时限制。