使用 AWS Glue ETL 库在本地开发和测试 ETL 脚本 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 AWS Glue ETL 库在本地开发和测试 ETL 脚本

AWS Glue Scala 库在公共 Amazon S3 存储桶中可用,并且可以由 Apache Maven 构建系统使用。这使您可以在本地开发和测试 Python 和 Scala 提取、转换和加载 (ETL) 脚本,而无需网络连接。

本地开发适用于所有 AWS Glue 版本,包括 AWS Glue 版本 0.9 和 AWS Glue 版本 1.0 及更高版本。有关可与 AWS Glue 配合使用的 Python 和 Apache Spark 版本的信息,请参阅 Glue version job property

该库随 Amazon 软件许可证 (https://aws.amazon.com/asl) 一起发布。

本地开发限制

使用 AWS Glue Scala 库进行本地开发时,请记住以下限制。

  • 避免使用 AWS Glue 库创建程序集 jar(“fat jar”或“uber jar”),因为这将导致以下功能被禁用:

    这些功能仅在 AWS Glue 作业系统内可用。

使用 Docker 映像在本地开发

Docker 映像为您提供了一个两步过程来设置具有 AWS Glue 二进制文件和 Jupyter/Zeppelin 笔记本服务器的容器。有关更多信息,请参阅使用容器在本地开发 AWS Glue ETL 作业

使用 Python 进行本地开发

完成一些先决步骤,然后使用 AWS Glue 实用工具来测试和提交您的 Python ETL 脚本。

本地 Python 开发的先决条件

完成以下步骤以准备本地 Python 开发:

  1. 从 github (AWS Glue) 下载 https://github.com/awslabs/aws-glue-libs Python 库。

  2. 执行以下任一操作:

    • 对于 AWS Glue 版本 0.9,请保持在 master 分支上。

    • 对于 AWS Glue 版本 1.0 及更高版本,请签出分支 glue-1.0。 这些版本支持 Python 3。

  3. 从以下位置安装 Apache Maven:https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-common/apache-maven-3.6.0-bin.tar.gz

  4. 从下列位置之一安装 Apache Spark 分发:

  5. 导出 SPARK_HOME 环境变量,将其设置为从 Spark 归档文件中提取的根位置。例如:

    • 对于 AWS Glue 版本 0.9:export SPARK_HOME=/home/$USER/spark-2.2.1-bin-hadoop2.7

    • 对于 AWS Glue 版本 1.0 及更高版本:export SPARK_HOME=/home/$USER/spark-2.4.3-bin-spark-2.4.3-bin-hadoop2.8

运行您的 Python ETL 脚本

使用可用于本地开发的 AWS Glue jar 文件,您可以在本地运行 AWS Glue Python 程序包。

使用以下实用工具和框架来测试和运行 Python 脚本。下表中列出的命令是从 AWS Glue Python 程序包的根目录运行的。

实用工具 命令 描述
AWS Glue Shell ./bin/gluepyspark 在与 AWS Glue ETL 库集成的 shell 中输入并运行 Python 脚本。
AWS Glue 提交 ./bin/gluesparksubmit 提交完整的 Python 脚本以供执行。
Pytest ./bin/gluepytest 编写并运行 Python 代码的单元测试。必须在 PATH 中安装 pytest 模块并使其可用。 有关更多信息,请参阅 pytest 文档

使用 Scala 在本地开发

完成一些先决步骤,然后发出 Maven 命令以在本地运行 Scala ETL 脚本。

本地 Scala 开发的先决条件

完成这些步骤以准备本地 Scala 开发。

步骤 1:安装软件

在此步骤中,您将安装软件并设置所需的环境变量。

  1. 从以下位置安装 Apache Maven:https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-common/apache-maven-3.6.0-bin.tar.gz

  2. 从下列位置之一安装 Apache Spark 分发:

  3. 导出 SPARK_HOME 环境变量,将其设置为从 Spark 归档文件中提取的根位置。例如:

    • 对于 AWS Glue 版本 0.9:export SPARK_HOME=/home/$USER/spark-2.2.1-bin-hadoop2.7

    • 对于 AWS Glue 版本 1.0 及更高版本:export SPARK_HOME=/home/$USER/spark-2.4.3-bin-spark-2.4.3-bin-hadoop2.8

步骤 2:配置您的 Maven 项目

使用以下 pom.xml 文件作为 AWS Glue Scala 应用程序的模板。它包含所需的 dependenciesrepositoriesplugins 元素。将 Glue version 字符串替换为 1.0.0(对于 AWS Glue 版本 1.0 及更高版本)或 0.9.0(对于 AWS Glue 版本 0.9)。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.amazonaws</groupId> <artifactId>AWSGlueApp</artifactId> <version>1.0-SNAPSHOT</version> <name>${project.artifactId}</name> <description>AWS Glue ETL application</description> <properties> <scala.version>2.11.1</scala.version> </properties> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>AWSGlueETL</artifactId> <version>Glue version</version> </dependency> </dependencies> <repositories> <repository> <id>aws-glue-etl-artifacts</id> <url>https://aws-glue-etl-artifacts.s3.amazonaws.com/release/</url> </repository> </repositories> <build> <sourceDirectory>src/main/scala</sourceDirectory> <plugins> <plugin> <!-- see http://davidb.github.com/scala-maven-plugin --> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.4.0</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.6.0</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <systemProperties> <systemProperty> <key>spark.master</key> <value>local[*]</value> </systemProperty> <systemProperty> <key>spark.app.name</key> <value>localrun</value> </systemProperty> <systemProperty> <key>org.xerial.snappy.lib.name</key> <value>libsnappyjava.jnilib</value> </systemProperty> </systemProperties> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>3.0.0-M2</version> <executions> <execution> <id>enforce-maven</id> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <requireMavenVersion> <version>3.5.3</version> </requireMavenVersion> </rules> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>

运行您的 Scala ETL 脚本

从 Maven 项目根目录运行以下命令以执行 Scala ETL 脚本。

mvn exec:java -Dexec.mainClass="mainClass" -Dexec.args="--JOB-NAME jobName"

Replace mainClass 替换为脚本主类的完全限定类名。Replace jobName 替换为所需的作业名称。

配置测试环境

有关配置本地测试环境的示例,请参阅以下博客文章:

如果要使用开发终端节点或笔记本来测试 ETL 脚本,请参阅使用开发终端节点来开发脚本

注意

不支持将开发终端节点用于 AWS Glue 版本 2.0 作业。有关更多信息,请参阅运行具有较少启动时间的 Spark ETL 作业