如何使用 Amazon EMR 在 Amazon EKS 上构建可靠、高效、用户友好的 Spark 平台

38873b6a1a2578cd80a1eea37f5cbfcd.gif

这是 SafeGraph 技术主管经理 Nan Zhu 与亚马逊云科技高级解决方案架构师 Dave Thibault 共同撰写的特约文章。

SafeGraph 是一家地理空间数据公司,管理着全球超过 4100 万个兴趣点(POI,Point of Interest),提供品牌隶属关系、高级类别标签、开放时间,以及人们如何与这些场所互动等方面的详细信息。我们使用 Apache Spark 作为主要数据处理引擎,每天有 1000 多款 Spark 应用程序运行海量的数据。这些 Spark 应用程序实施我们的业务逻辑,包括数据转换、机器学习(ML)模型推理和运维任务等广泛的应用。

SafeGraph 发现其现有 Spark 供应商的 Spark 环境并不理想。他们的成本不断上升。在竞价型实例终止时,其作业会频繁重试。开发人员花费太多的时间进行故障排除和更改作业配置,没有足够的时间来开发具有业务价值的代码。SafeGraph 需要控制成本、提高开发人员迭代速度和改进作业可靠性。最终,SafeGraph 选择 Amazon EKS 上的 Amazon EMR 来满足他们的需求,与之前的 Spark 托管服务供应商相比,成本节省了 50%。

所谓“工欲善其事必先利其器”,在为产品构建 Spark 应用程序时,Spark 平台就是这个“器”。下图展示了使用 Spark 时的工程设计工作流,Spark 平台需要支持和优化工作流中的每个操作。工程师通常先编写和构建 Spark 应用程序代码,然后将应用程序提交到计算基础设施,最后调试 Spark 应用程序来结束循环。此外,平台和基础设施团队需要持续运维,并优化工程设计工作流中的三个步骤。

4bdba4407dbb096758aeaf5056134508.png

构建 Spark 平台时,每个操作都涉及多种挑战:

  • 可靠的依赖项管理 – 复杂的 Spark 应用程序通常会引入许多依赖项。要运行 Spark 应用程序,我们需要确定所有依赖项,解决任何冲突,可靠地打包依赖项库,并将它们传输到 Spark 集群。依赖项管理是工程师面临的最大挑战之一,尤其是在他们使用 PySpark 应用程序时。

  • 可靠的计算基础设施 – 托管 Spark 应用程序的计算基础设施必须具有可靠性,这是整个 Spark 平台的基础。不稳定的资源预置不仅会对工程设计效率造成负面影响,而且还会因重新运行 Spark 应用程序而增加基础设施成本。

  • 面向 Spark 应用程序的便捷调试工具 – 工程师能否在 Spark 应用程序上快速进行迭代,调试工具的作用非常关键。要想提高开发人员迭代速度,高性能访问 Spark 历史服务器(SHS,Spark History Server)是一个必要条件。反过来说,糟糕的 SHS 性能会减慢开发人员的速度,并增加软件公司销售产品的成本。

  • 可管理的 Spark 基础设施 – 成功的 Spark 平台工程设计涉及到多个方面,例如 Spark 分发版本管理、计算资源 SKU 管理和优化等。这在很大程度上取决于 Spark 服务供应商是否为平台团队提供了合适的底层供他们使用。例如,对分发版本和计算资源的错误抽象化可能会显著降低平台工程设计的 ROI。

SafeGraph 遇到了上述所有挑战。为了解决这些问题,我们探索了市场,发现依托 Amazon EKS 上的 Amazon EMR 来构建新的 Spark 平台,这种方法可以解决我们面临的障碍。在这篇文章中,我们分享了构建最新 Spark 平台的旅程,以及 EKS 上的 EMR 如何为这个旅程提供了强大而有效的底层。

可靠的 Python 依赖项管理

用户在编写和构建 Spark 应用程序代码时,面临的最大挑战之一是难以可靠地管理依赖项,尤其是对于 PySpark 应用程序。我们大多数与机器学习相关的 Spark 应用程序都是使用 PySpark 构建的。之前的 Spark 服务供应商只支持一种管理 Python 依赖项的方法,那就是使用 wheel 文件。尽管基于 wheel 的依赖项管理得到了广泛的应用,但它其实很脆弱。下图显示了基于 wheel 的依赖项管理面临的两种类型的可靠性问题:

  • 未固定的直接依赖项 – 如果 .whl 文件无法确定某个直接依赖项的版本(在此示例中为 Pandas),它将始终从上游拉取最新版本,其中可能包含破坏性的更改并导致 Spark 应用程序中断。

  • 未固定的传递依赖项– 第二种可靠性问题更是我们无法控制的。即使我们在构建 .whl 文件时固定了直接依赖项版本,但直接依赖项本身可能无法确定传递依赖项版本(在本例中为 MLFlow)。在这种情况下,直接依赖项总是会拉取这些传递依赖项的最新版本,而这些依赖项中可能包含破坏性的更改并可能导致管道中断。

66593c4b1f55c3541ca68eb8b0127c17.png

我们遇到的另一个问题是,在每次 Spark 应用程序初始化时,会不必要地安装 wheel 文件引用的所有 Python 包。在我们之前的设置中,需要在启动时运行安装脚本来为每个 Spark 应用程序安装 wheel 文件,即使依赖项没有变化。此安装将 Spark 应用程序的启动时间从 3 到 4 分钟延长到至少 7 到 8 分钟。这种拖沓的速度非常影响体验,尤其是我们的工程师正在积极迭代变更时。

通过迁移到 EKS 上的 EMR,我们能够使用 pex(Python 可执行文件)来管理 Python 依赖项。.pex 文件考虑到虚拟环境,打包 PySpark 应用程序在可执行 Python 环境中的所有依赖项(包括直接依赖项和传递依赖项)。

下图展示了将上图中的 wheel 文件转换为.pex 文件后的文件结构。与基于 wheel 的工作流相比,我们不再有传递依赖项拉取或自动获取最新版本的操作。构建 .pex 文件时,依赖项的所有版本都固定为 x.y.z、a.b.c 等。对于给定的.pex 文件,所有依赖项都已固定,这样我们就不会再遇到基于 wheel 的依赖项管理中的缓慢或脆弱性问题。构建 .pex 文件的成本也是一次性成本。

7cb76d685e1e73464303967f8853150b.png

可靠、高效的资源预置

资源预置是 Spark 平台为 Spark 应用程序获取计算资源的过程,是整个 Spark 平台的基础。在云中构建 Spark 平台时,使用竞价型实例进行成本优化使得资源预置更具挑战性。竞价型实例是可供您使用的备用计算容量,相比按需价格最多可节省 90%。但是,当对某些实例类型的需求突然增长时,可能会终止竞价型实例以优先满足这些需求。由于这些终止,我们在之前版本的 Spark 平台中遇到了一些挑战:

  • 不可靠的 Spark 应用程序 – 当竞价型实例终止时,由于重试计算阶段,Spark 应用程序的运行时间显著延长。

  • 糟糕的开发人员体验 – 竞价型实例不稳定的供应状态导致 Spark 应用程序的性能遇到不可预测和低成功率的问题,严重影响了工程师的体验并减缓了开发迭代速度。

  • 昂贵的基础设施账单 – 由于作业需要重试,我们的云基础设施账单大幅增加。为了缓解问题,我们不得不购买具有更大容量且在多个可用区中运行的昂贵 Amazon Elastic Compute Cloud(Amazon EC2)实例,但这随之又带来了跨可用区流量的高成本。

Spark 服务提供商(SSP,Spark Service Provider),如 EKS 上的 EMR 或其他第三方软件产品,是用户和竞价型实例池之间的中间人,在确保竞价型实例的充足供应方面发挥着关键作用。如下图所示,用户通过 SSP 使用作业编排工具、笔记本或服务启动 Spark 作业。SSP 实施自己的内部功能,以访问亚马逊云科技等云服务的竞价型实例池中未使用的实例。使用竞价型实例的最佳实践之一是使用多样化的实例类型(有关更多信息,请参阅使用 EC2 竞价型实例进行成本优化:https://aws.github.io/aws-emr-containers-best-practices/cost-optimization/docs/cost-optimization/)。具体而言,SSP 可以通过两个关键功能实现实例多样化:

  • SSP 应该能够访问亚马逊云科技的竞价型实例池中所有类型的实例

  • SSP 应为用户提供相应的功能,让他们能够在启动 Spark 应用程序时使用尽可能多的实例类型

8127544c956432919967c9a48a12f0b1.png

我们的上一个 SSP 没有针对这两点提供所需的解决方案。他们只支持一组有限的竞价型实例类型,并且默认情况下,在启动 Spark 作业时,只允许选择一种竞价型实例类型。因此,每个 Spark 应用程序只能运行容量较小的竞价型实例,并且容易受到竞价型实例终止的影响。

EKS 上的 EMR 使用 Amazon Elastic Kubernetes Service(Amazon EKS)访问亚马逊云科技中的竞价型实例。Amazon EKS 支持所有可用的 EC2 实例类型,为我们带来了更高的容量池。我们使用 Amazon EKS 托管节点组、节点选择器以及污点等功能,将每个 Spark 应用程序分配到一个由多种实例类型组成的节点组。在迁移到 EKS 上的 EMR 后,我们看到了以下好处:

  • 减少了竞价型实例终止的频率,缩短了 Spark 应用程序的运行时间并且保持稳定。

  • 工程师发现应用程序行为的可预测性得到改善,因此能够更快地进行迭代。

  • 基础设施成本大幅下降,因为我们不再需要昂贵的解决方法,同时,我们在 Amazon EKS 的每个节点组中都有精打细算的实例选择。我们能够节省大约 50% 的计算成本,而无需采用在多个可用区中运行之类的解决方法,同时提供预期的可靠性水平。

流畅的调试体验

对于工程设计工作流循环的结束环节来说,有一个能够支持工程师方便地调试 Spark 应用程序的基础设施至关重要。Apache Spark 使用事件日志记录 Spark 应用程序的活动,例如任务开始和完成。这些事件采用 JSON 格式,由 SHS 用来重新呈现 Spark 应用程序的 UI。工程师可以访问 SHS 来调查任务故障原因或调试性能问题。

SafeGraph 工程师面临的主要挑战是 SHS 中的可扩展性问题。如下图左侧所示,我们之前的 SSP 强制所有工程师共享同一个 SHS 实例。结果,由于许多工程师同时进行访问以调试应用程序,或者如果 Spark 应用程序需要渲染大型事件日志,SHS 面临着巨大的资源压力。在迁移到 EKS 上的 EMR 之前,我们经常遇到 SHS 缓慢或 SHS 彻底崩溃的情况。

如下图所示,对于每个查看 Spark 历史记录 UI 的请求,EKS 上的 EMR 都会在亚马逊云科技管理的环境中启动一个独立的 SHS 实例容器。此架构的好处有两方面:

  • 不同的用户和 Spark 应用程序不再争夺 SHS 资源。因此,我们再也没有遇到 SHS 缓慢或崩溃的情况。

  • 所有 SHS 容器均由亚马逊云科技管理;用户无需支付额外的财务或运维成本,就能享受到可扩展的架构。

62ee9ae6da98cf1e585954003ac874bf.png

易于管理的 Spark 平台

如工程设计工作流所示,构建 Spark 平台不是一次性的工作,平台团队需要管理 Spark 平台并不断优化工程师开发工作流中的每个步骤。SSP 的作用是提供适当的便利,来尽可能减轻运维负担。尽管运维任务有很多类型,但在本文中我们重点介绍其中的两个:计算资源 SKU 管理和 Spark 发行版版本管理。

计算资源 SKU 管理是指 Spark 平台在允许用户选择不同大小的计算实例方面,进行的设计和处理。这样的设计和处理在很大程度上依赖于 SSP 实施的相关功能。

下图显示了我们之前 SSP 的 SKU 管理。

c8d269d68813a7b78c90f6894795be4b.png

下图显示了 EKS 上的 EMR 中的 SKU 管理。

3540ee3fd1a40961dc24545018cba49b.png

在与我们之前的 SSP 合作时,作业配置仅允许明确指定单个竞价型实例类型,如果该类型没有可用的竞价容量,则作业会切换到按需实例,或者出现可靠性问题。这让平台工程师要么选择更改 Spark 作业实例集的设置,要么需要承担预算和售出产品的成本意外飙升的风险。

EKS 上的 EMR 使平台团队可以更轻松地管理计算 SKU。在 SafeGraph,我们在用户与 EKS 上的 EMR 之间嵌入了 Spark 服务客户端。Spark 服务客户端仅向用户公开不同层级的资源(例如小型、中型和大型)。每一层级都映射到在 Amazon EKS 中配置的特定节点组。这种设计带来了以下好处:

  • 在价格和容量发生变化时,我们很容易更新节点组中的配置,而用户并不会知道。用户不用执行任何更改,甚至不会有任何感觉,就可以继续享受稳定的资源配置,同时我们还能尽可能降低成本和运维开销。

  • 在为 Spark 应用程序选择合适的资源时,最终用户无需进行任何猜测,因为通过简化的配置可以轻松进行选择。

我们从 EKS 上的 EMR 中获得的另一个好处是改进了 Spark 发行版管理。在使用 EKS 上的 EMR 之前,我们的 SSP 存在不透明发布 Spark 发行版的问题。每隔 1-2 个月,Spark 发行版就会向用户发布一个新的补丁版本。这些版本都通过 UI 向用户公开。这导致工程师选择了各种版本的发行版,其中一些版本未经过我们的内部工具测试。这大幅增加了我们的管道和内部系统的中断率,并对平台团队带来了很大的支持负担。我们希望在使用 EKS 上的 EMR 架构后,Spark 发行版的风险可降至最低,并且对用户透明。

EKS 上的 EMR 遵循最佳实践,使用包含固定版本的 Spark 发行版的稳定基础 Docker 映像。对于 Spark 发行版的任何更改,我们都必须明确地重建并推出 Docker 映像。借助 EKS 上的 EMR,在使用内部工具和系统对新版本的 Spark 发行版进行测试并正式发布之前,我们可以对用户隐藏该版本。

总结

在这篇文章中,我们分享了依托 EKS 上的 EMR 构建 Spark 平台的过程。将 EKS 上的 EMR 作为 SSP,为我们的 Spark 平台奠定了坚实的基础。借助 EKS 上的 EMR,我们得以解决了依赖项管理、资源预置和调试体验等各种挑战,并且得益于可用性更高的竞价型实例类型和大小,我们还显著降低了计算成本,削减达到 50%。

我们希望这篇文章能够在社区中分享一些见解,帮助企业选择合适的 SSP。详细了解 EKS 上的 EMR(https://aws.amazon.com/emr/features/eks/),包括其益处、功能和入门方法。

Original URL: 

https://aws.amazon.com/blogs/big-data/how-safegraph-built-a-reliable-efficient-and-user-friendly-spark-platform-with-amazon-emr-on-amazon-eks/

本篇作者

ec85564a432d2c66775da3af8eb31dbf.jpeg

Nan Zhu

SafeGraph 平台团队的技术主管经理。他领导团队构建广泛的基础设施和内部工具,以提高 SafeGraph 工程设计流程的可靠性、效率和生产力,例如内部 Spark 生态系统、指标存储和大型单一存储库的 CI/CD 等。他还参与了多个开源项目,如 Apache Spark、Apache Iceberg、Gluten 等。

f09a8a6dfdb067f906c4a748c0df8d43.jpeg

Dave Thibault

一位资深解决方案架构师,为亚马逊云科技的独立软件供应商(ISV)客户提供服务。他热衷于使用无服务器技术和机器学习进行构建,推动亚马逊云科技客户加快实现业务成功。加入 亚马逊云科技之前,Dave 在生命科学公司工作了 17 年,为研究、开发和临床制造部门开展 IT 和信息学工作。他的爱好包括滑雪、户外油画写生,还喜欢与家人共度时光。

002baca49f80c2d8a289c7718ed69bd7.gif

39f6147064849ace19acf2ed1fbfcba0.gif

听说,点完下面4个按钮

就不会碰到bug了!

53267dc0d4598985a7f2e5a216e2b134.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/101709.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机-芯片怎么看图连接

单片机连接数码管 硬件连接线路图 单片机中的IO口连接端子 J25 ,J25 连接 2个电阻 PR14 ,引出管脚 P22 ,P23,P24 P22 、P23、P24 连接 3-8 译码器 三输入、8输出 8 输出 ,连接8个LED1~LED8 用到三个芯片&#xff…

如何将 PDF 转换为 Word:前 5 个应用程序

必须将 PDF 转换为 Word 才能对其进行编辑和自定义。所以这里有 5 种很棒的方法 PDF 文件被广泛使用,因为它非常稳定且难以更改。这在处理法律合同、财务文件和推荐信等重要文件时尤其重要。但是,有时您可能需要编辑 PDF 文件。最好的方法是使用应用程序…

回归拟合 | 灰狼算法优化核极限学习机(GWO-KELM)MATLAB实现

这周有粉丝私信想让我出一期GWO-KELM的文章,因此乘着今天休息就更新了(希望不算晚) 作者在前面的文章中介绍了ELM和KELM的原理及其实现,ELM具有训练速度快、复杂度低、克服了传统梯度算法的局部极小、过拟合和学习率的选择不合适等优点,而KEL…

OceanBase安全审计之传输加密

上一期我们讲了关于 OceanBase 安全审计的《身份鉴别》和《用户管理与访问控制》 两个部分,OceanBase 的安全机制介绍其支持传输加密,今天我们主要来实践一下如何配置传输加密以及验证是否真的加密。 作者:金长龙 爱可生测试工程师&#xff0…

【Stable Diffusion安装】支持python3.11 window版

前言 主要的安装步骤是参考B站播放量第一的视频,但是那位阿婆主应该是没有编程经验,只强调使用3.10,而python最新版本是3.11。 理论上来说,只是一个小版本的不同,应该是可以安装成功了。自己摸索了下,挺费…

【LeetCode-中等题】199. 二叉树的右视图

文章目录 题目方法一&#xff1a;层序遍历取每一层最后一个元素方法二&#xff1a;深度优先搜索 题目 方法一&#xff1a;层序遍历取每一层最后一个元素 // 方法一 &#xff1a;层序 集合(取每层子集合最后一个元素)// List<List<Integer>> Rlist new ArrayList…

搭建Python开发环境

开发环境 Python是一种跨平台 的编程语言&#xff0c;这意味着它能够在所有的主流操作系统中运行&#xff0c;开发者可以Windows、Linux、Mac中开发和学习Python&#xff0c;甚至在Android手机中也可以运行Python代码。 在所有安装了Pythonr现代计算机上&#xff0c;都能够运…

816. 模糊坐标

816. 模糊坐标 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;错误经验吸取 原题链接&#xff1a; 模糊坐标 完成情况&#xff1a; 解题思路&#xff1a; 参考代码&#xff1a; package 西湖算法题解___中等题;import java.util.Arra…

sqlibs安装及复现

sqlibs安装 安装phpstudy后&#xff0c;到github上获取sqlibs源码 sqli-labs项目地址—Github获取&#xff1a;GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based. 在phpstudy本地文件中的Apache目录中解压上方下载的源码。 将sq…

leetcode - 360周赛

一&#xff0c;2833. 距离原点最远的点 这道题的意思是&#xff0c;遇到 "L" 向左走&#xff0c;遇到 "R" 向右走&#xff0c;遇到 "_" 左右都可以走&#xff0c;那么要想找到距离原点最远的点&#xff0c;就是在找 | "L" "R&qu…

ZooKeeper与Paxos

Apache ZooKeeper是由Apache Hadoop的子项目发展而来&#xff0c;于2010年11月正式成为了Apache的顶级项目。ZooKeeper为分布式应用提供了高效且可靠的分布式协调服务&#xff0c;提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。在解决分布式数据一致性方面&a…

jmeter 常数吞吐量定时器

模拟固定吞吐量的定时器。它可以控制测试计划中各个请求之间的时间间隔&#xff0c;以达到预期的吞吐量。 参数包括&#xff1a; Target Throughput&#xff1a;目标吞吐量&#xff08;每分钟请求数&#xff09;Calculate Throughput based on&#xff1a;吞吐量计算基准&…

[管理与领导-66]:IT基层管理者 - 辅助技能 - 4- 职业发展规划 - 乌卡时代(VUCA )的团队管理思维方式的转变

目录 一、乌卡时代人与公司的关系的转变 二、乌卡时代管理方式的转变 三、乌卡时代的管理与传统时代的管理比较 四、乌卡时代管理者的挑战 五、乌卡时代如何做好管理 六、个人能力要求 一、乌卡时代人与公司的关系的转变 在乌卡时代&#xff08;指虚拟办公、远程工作等数…

RocketMQ 安装与入门

文章目录 简介下载下载目录地址 安装部署环境要求下载二进制包解压即可启动 NameServer 启动BrokerProxy单组节点单副本模式启动 使用Java客户端发布订阅消息1. 创建主题 topic2. 创建Java工程使用Maven引入Java SDK包生产者代码 ProducerDemo消费者代码 ConsumerDemo RocketMQ…

文件及Java中File类详解

目录 一, 文件 1,什么是文件 2,路径 二, File类 1,File类的构造方法 签名 说明 2,File类的方法 修饰符及返回值类型 方法签名 说明 2.1,get方法的使用 2.2,普通文件的创建以及删除 2.3,普通目录文件的创建以及删除 3,代码示例 示例1 示例2 一, 文件 1,什么是文…

详细教程:Stegsolve的下载,jdk的下载、安装以及环境的配置

最近在学习隐写术&#xff0c;下载stegsolve 以及使用stegsolve倒腾了很久&#xff0c;避免朋友们和我一样倒腾了很久&#xff0c;希望此文可以帮到刚在学习隐写的朋友们(win7下使用stegsolve) 文章目录 一、下载stegsolve链接二、jdk的下载三、jdk的安装四、配置环境变量五、检…

更改SVG矢量图片的颜色

问题:我从网上找的svg图片,颜色一直是黑色的,和下边的用户管理模块、卷题管理等模块的图标对不起来,看起来很怪。 办法: 1.直接在你的编程软件中 ctrl + alt +F,全局搜索“组织管理” 找到组织管理对应的文件,然后双击点进去 2.找到icon 这里对应的icon的属性值就是矢…

响应式图片与 CSS image-set

响应式图片 前置知识 art direction problem光栅图像与矢量图像 raster image and vector images img 能否担此重任 sizessrcset实际看一看 picture: img 的好姐妹 source实际看一看 CSS image-set 语法兼容性 其他注意事项 响应式图片 图片在网页中占据了 超过 60% 的浏览带…

WordPress(5)在主题中添加文章字数和预计阅读时间

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 样式图一、添加位置二、找到主题文件样式图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 二、找到主题文件 在主题目录下functions.php文件把下面的代码添加进去: // 文章字数…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书江西师范大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书江西师范大学图书馆