我能在本地测试AWS Glue代码吗?

42

阅读了亚马逊文档后,我的理解是运行/测试Glue脚本的唯一方法是将其部署到开发终端并在必要时进行远程调试。同时,如果(Python)代码由多个文件和包组成,则除主脚本外的所有内容都需要进行压缩。所有这些让我感觉Glue不适用于任何复杂的ETL任务,因为开发和测试都很繁琐。我可以在本地测试我的Spark代码,而无需每次将代码上传到S3,并且可以在CI服务器上验证测试,而无需支付开发Glue终端的费用。


1
@Ifk - 你能解决这个问题吗?我正在使用Glue并在dev-endpoints上测试代码。我在寻找更好的替代方案。 - Deep
似乎没有更好的选择。最终我决定不使用Glue。 - lfk
1
Yuva提到的Zeppelin工作流在2018年8月仍然似乎是可行的方式,因为没有一种基于IDE的体验可以立即使用,除非有某种公开可用的运行时来进行本地构建/测试。如果你的Glue主要用例只是源和汇聚,并且实际的ETL可以使用Spark编写,那么考虑在本地构建一个Spark ETL,将其部署为jar文件,并使你的Glue脚本成为一个“哑”的包装器,只是从ETL作业中提取/收集数据。 - Kyle
9个回答

12

从2019年8月28日开始,亚马逊允许您下载二进制文件并在本地使用Scala和Python开发、编译、调试和单步处理Glue ETL脚本和复杂的Spark应用程序。

请访问此链接


你使用它有什么好运气吗? - SirKometa
是的,但只有在禁用Hive支持后才能这样做(参见此处未被接受的答案:https://dev59.com/Z6Dia4cB1Zd3GeqPADdG#45545595)。然后我从aws glue repo重新运行了bin/setup.py,使用Maven构建jars。 - Brian

8

我和一位AWS销售工程师交谈,他说不行,你只能通过运行云中的Glue转换来测试Glue代码。他提到他们正在测试一个叫做Outpost的东西,以允许本地操作,但它尚未公开发布。所以这似乎是一个坚定的“否”,这很遗憾,因为它看起来相当不错。但是没有单元测试,对我来说就不行。


它似乎不适合生产和业务关键任务。我认为它主要是针对数据科学家运行临时作业和分析的。尽管如此,我们的AWS顾问非常努力地说服我们使用Glue而不是EMR上的Spark。 - lfk
1
过时的答案 - BRad

8

您可以将粘合剂和Pyspark代码保存在不同的文件中,并可以在本地对Pyspark代码进行单元测试。为了压缩依赖文件,我们编写了一个Shell脚本,该脚本可压缩文件并上传到S3位置,然后应用CF模板以部署Glue作业。 为了检测依赖项,我们创建了(粘合剂作业)_dependency.txt文件。


7

AWS的全面指南:https://aws.amazon.com/blogs/big-data/develop-and-test-aws-glue-version-3-0-jobs-locally-using-a-docker-container/ - selle

2

据我所知,如果您有大量远程资产,这将是棘手的问题。在Windows上,我通常在编写作业时运行开发端点和本地zeppelin笔记本电脑。每天关掉它。

您可以使用作业编辑器>脚本编辑器来编辑、保存和运行作业。不确定成本差异。


2

我认为这里的关键是要定义您想在本地进行哪种类型的测试。如果您正在进行单元测试(即仅测试一个独立于支持该脚本的AWS服务的pyspark脚本),那么您可以在本地执行该操作。在测试您已编写在pyspark脚本中的逻辑时,使用像pytest-mockmonkeypatchunittest这样的模拟模块来模拟外部的 AWS 和 Spark 服务。
对于模块测试,您可以使用类似AWS EMR NotebooksZeppelinJupyter的工作簿环境。在这里,您将能够针对测试数据源运行Spark代码,但可以模拟AWS服务。
对于集成测试(即测试与其依赖的服务集成的代码,但不是生产系统),您可以从CI/CD流程启动系统的测试实例,然后让计算资源(如pytest脚本或AWS Lambda)自动化实现脚本的工作流程。

1

针对CedricB的问题,

为了开发/测试目的,不必将代码上传到S3,您可以在本地设置一个Zeppelin笔记本,建立SSH连接,这样就可以访问数据目录/爬虫等以及存储数据的S3存储桶。

完成所有测试后,可以打包您的代码,上传到S3存储桶。然后创建一个作业,指向S3存储桶中的ETL脚本,以便可以运行和调度该作业。一旦完成所有开发/测试,请确保删除dev端点,因为即使处于空闲状态,我们也会收取费用。

敬礼


值得注意的是,当Glue编译您的Scala作业时,它可能与开发端点中的spark shell有所不同(即,至少警告被视为致命错误,在spark-shell中并非如此)。 - Kyle

1
您可以按照以下步骤进行操作:

  1. Install PySpark using

     >> pip install pyspark==2.4.3
    
  2. Prebuild AWS Glue-1.0 Jar with Python dependencies: Download_Prebuild_Glue_Jar

  3. Copy the awsglue folder and Jar file into your pycharm project from github

  4. Copy the Python code from my git repository

  5. Run the following on your console; make sure to enter your own path:

     >> python com/mypackage/pack/glue-spark-pycharm-example.py
    

来自 我自己的博客


5
下次在链接到自己的博客时,请非常清楚地表明这是你自己的博客,否则你有被删除视为垃圾邮件的风险。 - Adriaan

0

你能解释一下如何使用Docker来启动本地的Glue脚本吗?或者可以给我们指点一些相关文档吗?谢谢! - Servadac
这些是非官方的Docker。也有一个官方版本:https://aws.amazon.com/blogs/big-data/building-an-aws-glue-etl-pipeline-locally-without-an-aws-account/ - selle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接