在 AWS EMR 上使用 pyspark
Posted
技术标签:
【中文标题】在 AWS EMR 上使用 pyspark【英文标题】:Using pyspark on AWS EMR 【发布时间】:2020-01-14 20:16:12 【问题描述】:我是 PySpark 和 AWS EMR 的新手。我有一个小项目,我需要每小时清理大量数据文件并基于它们构建聚合数据集。这些数据文件存储在 S3 上,我可以利用 Spark 中的一些基本功能(如过滤器和映射)来导出聚合数据。为了节省出口成本并在执行了一些 CBA 分析之后,我决定创建一个 EMR 集群并进行 pypark 调用。使用由 S3 存储桶中创建的文件触发的 Lambda 函数,该概念运行良好。我正在将输出文件写回 S3。
-
但我无法理解对我创建的 3 节点 EMR 集群的需求及其对我的用途。如何在此处使用 Hadoop 文件系统和节点上可用的所有存储来发挥我的优势?
如何查看(如果可能)集群中从/核心节点的利用率?我怎么知道它们被使用、使用频率等?我正在主节点上执行 pyspark 代码。
我可以在 pyspark 中使用 EMR 的替代品吗?
是否有任何好的文档可用于更好地理解。
谢谢
【问题讨论】:
【参考方案1】:Spark 是一个分布式计算框架。它可以处理比内存更大的数据集,并将工作负载分块拆分到多个并行工作人员上。默认情况下,EMR 创建 1 个主节点和 2 个工作节点。 spark节点上的磁盘空间通常不直接使用。 Spark 可以使用该空间来缓存临时结果。 要使用 Hadoop 文件系统,您需要在 aws 中启动 hdfs 服务。 但是 s3 也是分布式存储。 Hadoop 库支持它。 Spark EMR 附带 Hadoop 驱动程序并开箱即用地支持 S3。将 Spark 与 S3 结合使用是非常有效的存储解决方案,并且足以完成许多基本的数据处理任务。
这是 AWS EMR 中的 Spark 管理器 UI。您可以看到每个正在运行的 Spark 应用程序会话和当前作业。通过单击作业,您可以查看使用了多少执行器。这些执行器是否在所有节点上运行取决于您的 spark 内存和 cpu 配置。调整这些是一个非常大的话题。 SO上有goodhints。 还有一个硬件监控选项卡,显示每个节点的 cpu 和内存使用情况。 火花代码始终在主节点上执行。但它只是在该节点上创建一个 DAG 计划,并根据计划将实际工作转移到工作节点。因此,指南谈到提交 spark 应用程序而不是执行。
是的。您可以在普通的 ec2 实例上启动自己的 spark 集群。甚至还有一个 standalone mode ,只允许在一台机器上启动 spark。这是相当多的足迹,然后安装。而且您仍然需要调整内存、cpu 和执行程序设置。因此,与仅在 python 中实现一些多处理或使用 dask 相比,这是相当复杂的。然而,这样做是有正当理由的。它允许在一台机器上使用所有内核。它允许您使用众所周知的、有良好文档记录的 api。同一个,可用于处理 PB 级数据。上面的链接文章解释了动机。
另一种可能性是使用 AWS Glue。它是无服务器火花。这 服务会将您的作业提交到 AWS 上的一些按需 Spark 节点, 你无法控制的地方。类似于 lambda 函数的运行方式 在随机 AWS EC2 实例上。然而,胶水有一些限制。和 胶水上的pyspark,你不能安装带有c-extensions的python库 例如 numpy、pandas、大多数 ml 库。胶水也强迫你创造 Athena 目录中数据的架构映射。但独立火花 可以即时处理这些。
Databricks 还在 AWS 之外提供单独的 serverless spark solution。在我看来,它更复杂。它还允许自定义 c 扩展。
官方文档的很大一部分是关注不同的数据处理 api,而不是 apache spark 的内部。 github 上有一些关于 spark 内部结构的很好的注释。我认为每本好书都会涵盖 Spark 的一些内部工作原理。 AWS EMR 只是一个带有纱线编排器的自动化 Spark 集群。 (不幸的是,从来没有读过一些关于 spark 的好书,在这里和那里得到了一些信息,所以不能推荐一个)
【讨论】:
以上是关于在 AWS EMR 上使用 pyspark的主要内容,如果未能解决你的问题,请参考以下文章
在不使用 aws 凭据的情况下连接 Redshift 和 Python(在 emr 上运行)
Apache Hudi在AWS Glue和AWS EMR上同步元数据的异同
Apache Hudi在AWS Glue和AWS EMR上同步元数据的异同
在 AWS EMR 上的 PySpark 脚本上找不到 com.amazon.ws.emr.hadoop.fs.EmrFileSystem