在本地为 AWS 开发和测试 ETL 管道
通常,ETL 管道的开发和测试是在真实环境/集群上完成的,设置起来很耗时且需要维护。 本文重点介绍在 Docker 和 LocalStack 的帮助下在本地开发和测试 ETL 管道。 该解决方案提供了在本地环境中进行测试的灵活性,而无需在云上设置任何服务。
By 苏巴什·斯里尼瓦萨查尔, Epsilon 软件工程师技术主管
介绍
AWS 在帮助工程师、数据科学家专注于构建解决方案和解决问题而无需担心需要设置基础设施方面发挥着关键作用。 借助无服务器和即用即付的定价方法,AWS 可以轻松地动态创建服务。
AWS Glue 被数据工程师广泛用于构建无服务器 ETL 管道。 PySpark 是用于开发的常用技术堆栈之一。 然而,尽管提供了服务,但仍有一些挑战需要解决。
无论是 ETL 脚本 (PySpark) 还是任何其他服务,在 AWS 环境中调试代码都是一个挑战。
- 持续监控 AWS 服务使用情况是控制成本因素的关键
- AWS 确实提供安装了所有 Spark 库的 Dev Endpoint,但考虑到价格,它不适用于大型开发团队
- AWS 服务的可访问性可能是 有限 对于某些用户
解决方案
AWS 的解决方案可以在本地环境中开发和测试,而无需担心可访问性或成本因素。 通过这篇文章,我们正在解决两个问题——
- 在不使用 AWS 开发终端节点的情况下在本地调试 PySpark 代码。
- 在本地与 AWS 服务交互
这两个问题都可以通过使用 Docker 镜像来解决。
- 首先,我们不需要在 AWS 环境中使用服务器,取而代之的是在机器上运行的 docker 镜像作为执行代码的环境。
AWS 提供了一个沙盒镜像,可用于 PySpark 脚本。 可以设置 Docker 镜像来执行 PySpark 代码。 https://aws.amazon.com/blogs/big-data/developing-aws-glue-etl-jobs-locally-using-a-container/
- 有了可用于执行代码的 docker 机器,就需要像 S3 这样的服务来存储(读/写)文件,同时构建 ETL 管道。
与 S3 的交互可以替换为 本地堆栈 它为开发云应用程序提供了一个易于使用的测试/模拟框架。 它在您的本地机器上启动一个测试环境,提供与真正的 AWS 云环境相同的功能和 API。
到目前为止,本文涉及构建 ETL 管道和使用可用服务。 但是,在使用 SNS、SQS、CloudFormation、Lambda 函数等 AWS 服务时,类似的方法可以适用于任何用例。
途径
- 使用 docker 容器作为远程解释器
- 在容器上运行 PySpark 会话
- 使用 LocalStack 在本地启动 S3 服务
- 使用 PySpark 代码从运行在 LocalStack 上的 S3 存储桶读取和写入
先决条件
您的机器上必须安装以下工具
- 码头工人
- PyCharm Professional/VisualStudio 代码
设置
- 下载或拉取 docker 镜像(docker pull )
- 库:glue_libs_1.0.0_image_01
- 本地堆栈/本地堆栈
- Docker 容器可以在 PyCharm 专业版中用作远程解释器。
SAP系统集成计划实施
安装 Docker 并将图像拉到本地计算机后,开始使用配置来设置 PyCharm 以启动容器。
- 创建一个 docker-compose.yml 文件
- 创建一个 DockerFile
https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-dockerfile
- 使用带有要安装的软件包的需求文件
- 设置 Python 远程解释器
- 使用 docker-compose 文件设置 Python 解释器。
- 在 PyCharm Docker Compose 设置中选择 `glue-service`。
- Docker-compose 文件为两个镜像创建并运行容器
- 默认情况下,LocalStack 在端口 4566 上运行,并在其上启用了 S3 服务
代码
- 需要导入的库
https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-imports
- 将文件添加到在 LocalStack 上运行的 S3 存储桶
https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-add_to_bucket
http://host.docker.internal:4566 是在 docker 容器内本地运行的 S3
- 设置 PySpark 会话以从 S3 读取
- PySpark 会话通过提供的模拟凭据连接到 S3
- 您可以使用创建的 PySpark 会话直接从 S3 读取
https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-read_from_s3
- 最后,可以以任何首选格式写入 S3
https://gist.github.com/subhash-sreenivasachar/526221a4ede6053b1d576e666db8ec87#file-write_to_s3
完成上述步骤后,我们可以创建一个带有模拟数据的虚拟 csv 文件进行测试,您应该很高兴
- 将文件添加到 S3(在 LocalStack 上运行)
- 从 S3 读取
- 作为镶木地板写回 S3
您应该能够运行 .py 文件来执行并创建 PySpark 会话,该会话可以从使用 LocalStack API 本地运行的 S3 存储桶中读取。
此外,您还可以检查 LocalStack 是否正在运行 http://localhost:4566/health
LocalStack 也让您能够使用 AWS CLI 运行命令。
结论
Docker 和 Localstack 的使用提供了一种快速简便的方法来运行 Pyspark 代码、在容器上调试以及写入本地运行的 S3。 所有这一切都无需连接到任何 AWS 服务。
参考文献:
- 胶水端点: https://docs.aws.amazon.com/glue/latest/dg/dev-endpoint.html
泊坞窗: https://docs.docker.com/get-docker/ - PyCharm: https://www.jetbrains.com/pycharm/
- PyCharm 远程解释器: https://www.jetbrains.com/help/pycharm/using-docker-compose-as-a-remote-interpreter.html
- 本地堆栈: https://localstack.cloud
简介: 苏巴什·斯里尼瓦萨查尔 是 Epsilon 数字体验团队的首席软件工程师,构建工程解决方案以解决数据科学问题,特别是个性化,并帮助提高客户的投资回报率。
相关新闻:
来源:https://www.kdnuggets.com/2021/08/development-testing-etl-pipelines-aws-locally.html