- 示例工程
- 教程
- 后端
【免费下载链接】aws-doc-sdk-examples
Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.
本指南以 javav2/example_code/glue 目录为核心,系统讲解如何使用 AWS SDK for Java 2.x 操作 AWS Glue 服务。AWS Glue 是一项可扩展的无服务器数据集成服务,帮助开发者轻松完成数据的发现、准备与整合,服务于分析、机器学习和应用开发。阅读本文后,你将掌握使用 Java 代码创建数据库与爬虫(Crawler)、启动爬取任务、在 Data Catalog 中查询表、创建并运行 ETL Job,以及清理资源的完整闭环能力。
概览:AWS Glue 与 SDK for Java 2.x
AWS Glue 的核心价值在于自动发现并编目数据。它可以扫描存储在 Amazon S3、Amazon RDS、Amazon Redshift 等各类数据源中的数据,构建一个统一的元数据仓库——AWS Glue Data Catalog,为组织提供数据资产的全景视图。在此基础上,你可以创建 ETL 任务(Job),按需或按计划调度执行,从而简化数据集成管线的搭建与维护。
javav2/example_code/glue目录下的示例完整覆盖了这一工作流:
| 示例文件 | 相对路径 | 说明 |
|---|---|---|
| 入门示例(Hello AWS Glue) | src/main/java/com/example/glue/HelloGlue.java | 调用ListJobs展示服务基础用法 |
| 完整场景(Learn the basics) | src/main/java/com/example/glue/scenario/GlueScenario.java | 覆盖爬虫、Data Catalog、Job 的 13 步完整流程 |
| 表格搜索(额外补充) | src/main/java/com/example/glue/SearchTables.java | 使用SearchTables全文检索 Data Catalog 表 |
| 集成测试 | src/test/java/GlueTest.java | 以@Order按序驱动 13 个场景步骤 |
| Maven 构建配置 | pom.xml | 声明 AWS SDK BOM、glue 依赖与构建插件 |
运行前置条件
运行本目录示例前,需要满足以下条件(详细说明见 javav2 文件夹 README):
- 在本地通过 clone、fork 或下载 zip 方式获取本仓库;
- 安装 Apache Maven(大于 3.0);
- 确保 Java SDK 能通过默认凭证提供者链(default credentials provider chain)获取 AWS 凭证,例如在
~/.aws/config中配置 IAM Identity Center SSO,或在~/.aws/credentials中配置临时凭证; - 配置默认区域。示例代码硬编码使用
Region.US_EAST_1(美国东部 1 区),如果默认区域未设置,SDK 同样会使用 us-east-1。
此外请注意:运行示例或测试可能会产生 AWS 账户费用,建议遵循最低权限原则(least privilege),只为 IAM 角色授予执行任务所必需的最小权限;示例代码并未在每个 AWS 区域都经过测试。
示例一:Hello AWS Glue —— 用 ListJobs 快速入门
入门示例位于 HelloGlue.java,核心是构建GlueClient并调用listJobs,验证 SDK 配置是否正确。
GlueClient glueClient = GlueClient.builder() .region(Region.US_EAST_1) .build(); public static void listJobs(GlueClient glueClient) { ListJobsRequest request = ListJobsRequest.builder() .maxResults(10) .build(); ListJobsResponse response = glueClient.listJobs(request); List<String> jobList = response.jobNames(); jobList.forEach(job -> { System.out.println("Job Name: " + job); }); }要点解读:
GlueClient.builder().region(...).build()是 SDK for Java 2.x 创建服务客户端的标准方式,凭证由默认凭证链自动解析;ListJobsRequest通过maxResults(10)控制单次返回的任务定义数量上限(1~100 之间),响应体jobNames()返回任务名称列表;- 该示例本身不产生计费资源,是验证环境连通性的理想起点。
示例二:Learn the basics —— 爬虫 + Data Catalog + ETL Job 全流程
这是本目录的核心场景示例,入口为 GlueScenario.java,main方法按 13 个步骤串联完整业务流:
- 创建数据库(database);
- 创建爬虫(crawler);
- 获取爬虫并等待其进入
READY状态; - 启动爬虫;
- 获取数据库信息;
- 列出数据库中的表(table);
- 创建 ETL Job;
- 启动一次 Job run;
- 列出所有 Job;
- 查询 Job run 状态直至结束;
- 删除 Job;
- 删除数据库;
- 删除爬虫。
整个流程实现了一个真实的数据集成任务:爬虫扫描公共 Amazon S3 存储桶并生成 CSV 格式元数据数据库 → 在 Data Catalog 中列出数据库与表 → 创建 Job 从 S3 桶抽取 CSV 数据、执行转换并加载 JSON 格式输出到另一个 S3 桶 → 查看 Job run 信息、验证转换后的数据并清理资源。
命令行参数
GlueScenario运行时需要传入 9 个参数(源码 L88-L103),参数不足时程序会打印用法说明并退出:
Usage: <iam> <s3Path> <cron> <dbName> <crawlerName> <jobName> <scriptLocation> <locationUri> <bucketNameSc> Where: iam - 拥有 AWS Glue 与 S3 权限的 IAM 角色 ARN s3Path - 包含数据的 S3 目标路径(例如 s3://<bucket name>/read) cron - 用于指定调度时间的 cron 表达式(例如 cron(15 12 * * ? *) dbName - 数据库名称 crawlerName - 爬虫名称 jobName - 分配给任务定义的名称 scriptLocation - 执行任务所用脚本的 S3 路径 locationUri - 数据库位置(可参考 resources 文件夹中的文件) bucketNameSc - 创建 Job 时使用的 S3 存储桶名称程序采用交互式驱动:每完成一个步骤会提示输入c回车继续(waitForInputToContinue辅助方法),便于逐步观察每个 API 调用的效果。
步骤 1:创建数据库
createDatabase 通过DatabaseInput描述数据库元信息,再提交createDatabase请求:
DatabaseInput input = DatabaseInput.builder() .description("Built with the AWS SDK for Java V2") .name(dbName) .locationUri(locationUri) .build(); CreateDatabaseRequest request = CreateDatabaseRequest.builder() .databaseInput(input) .build(); glueClient.createDatabase(request);locationUri通常指向数据实际存放的根路径(如s3://bucket/),为后续爬虫和查询提供元数据定位;- 场景代码对
GlueException做了容错处理:若错误信息为Database already exists.则跳过创建,保证示例可重复运行。
步骤 2:创建爬虫(Crawler)
爬虫负责扫描数据源并自动推断 Schema。createGlueCrawler 的核心是组装S3Target与CrawlerTargets:
S3Target s3Target = S3Target.builder() .path(s3Path) .build(); List<S3Target> targetList = new ArrayList<>(); targetList.add(s3Target); CrawlerTargets targets = CrawlerTargets.builder() .s3Targets(targetList) .build(); CreateCrawlerRequest crawlerRequest = CreateCrawlerRequest.builder() .databaseName(dbName) .name(crawlerName) .description("Created by the AWS Glue Java API") .targets(targets) .role(iam) .schedule(cron) .build(); glueClient.createCrawler(crawlerRequest);关键参数说明:
databaseName:爬取结果写入的 Data Catalog 数据库;role:爬虫运行时扮演的 IAM 角色 ARN,必须同时具备读取目标 S3 与写入 Glue 服务的权限;schedule:可选调度表达式(cron),决定爬虫按何种频率自动运行;targets.s3Targets:声明 S3 扫描目标,还可扩展到 JDBC、DynamoDB 等数据源。
步骤 3~4:获取并启动爬虫
getSpecificCrawler 使用轮询模式等待爬虫就绪:
boolean ready = false; while (!ready) { GetCrawlerResponse response = glueClient.getCrawler(crawlerRequest); String status = response.crawler().stateAsString(); if (status.compareTo("READY") == 0) { ready = true; } Thread.sleep(3000); }- 每 3 秒轮询一次,直到
crawler.state变为READY; - 随后 startSpecificCrawler 调用
startCrawler触发首次爬取。
步骤 5~6:查询数据库与表(Data Catalog)
getSpecificDatabase 调用getDatabase获取数据库对象,并将创建时间createTime(Instant类型)格式化为可读日期;getGlueTables 调用getTables遍历数据库内全部表:
GetTablesRequest tableRequest = GetTablesRequest.builder() .databaseName(dbName) .build(); GetTablesResponse response = glueClient.getTables(tableRequest); List<Table> tables = response.tableList();注意时序:爬虫启动后,表需要时间完成编目。场景代码在步骤 6 前显式执行TimeUnit.MINUTES.sleep(5)(等待 5 分钟),确保表可用,这一点在集成测试中同样保留。
如果只想对 Data Catalog 做全文检索,可参考 SearchTables.java:通过SearchTablesRequest的searchText(text)、resourceShareType("ALL")与maxResults(10)参数,跨资源类型模糊匹配表名及数据库名。
步骤 7:创建 ETL Job
createJob 通过JobCommand指定脚本与运行时,再组装CreateJobRequest:
JobCommand command = JobCommand.builder() .pythonVersion("3") .name("glueetl") .scriptLocation(scriptLocation) .build(); CreateJobRequest jobRequest = CreateJobRequest.builder() .description("A Job created by using the AWS SDK for Java V2") .glueVersion("2.0") .workerType(WorkerType.G_1_X) .numberOfWorkers(10) .name(jobName) .role(iam) .command(command) .build(); glueClient.createJob(jobRequest);参数要点:
command.name("glueetl"):任务类型为 Glue ETL;pythonVersion("3")指定脚本语言与版本;scriptLocation:指向 S3 中实际执行的 ETL 脚本(Python)路径;glueVersion("2.0"):Glue 运行时版本,决定 Spark 等组件的版本行为;workerType(WorkerType.G_1_X)与numberOfWorkers(10):定义 Worker 类型与数量,直接影响任务的并发能力与成本。
步骤 8:启动 Job run
startJob 通过argumentsMap 向 ETL 脚本传递输入/输出参数,这是 Java 侧与 Python 脚本交换信息的标准方式:
Map<String, String> myMap = new HashMap<>(); myMap.put("--input_database", inputDatabase); myMap.put("--input_table", inputTable); myMap.put("--output_bucket_url", outBucket); StartJobRunRequest runRequest = StartJobRunRequest.builder() .workerType(WorkerType.G_1_X) .numberOfWorkers(10) .arguments(myMap) .jobName(jobName) .build(); StartJobRunResponse response = glueClient.startJobRun(runRequest); System.out.println("The request Id of the job is " + response.responseMetadata().requestId());- 启动后立即返回本次运行的
requestId,可用于后续追踪; - 这里再次显式指定
workerType与numberOfWorkers,可按单次运行覆盖任务定义中的默认值。
步骤 9~10:列出任务并跟踪运行状态
getAllJobs 调用getJobs(maxResults(10))遍历任务定义;getJobRuns 则轮询任务运行状态,直到进入终态:
String jobState = jobRun.jobRunState().name(); if (jobState.compareTo("SUCCEEDED") == 0) { System.out.println(jobName + " has succeeded"); jobDone = true; } else if (jobState.compareTo("STOPPED") == 0) { ... } else if (jobState.compareTo("FAILED") == 0) { ... } else if (jobState.compareTo("TIMEOUT") == 0) { ... } else { // 运行中:打印状态、run Id 与 Glue 版本 } TimeUnit.SECONDS.sleep(5);轮询逻辑覆盖SUCCEEDED、STOPPED、FAILED、TIMEOUT四种终态,每 5 秒检查一次,其余状态视为运行中并持续输出进度,是观察 ETL 任务生命周期的典型实现。
步骤 11~13:清理资源
场景的最后三步依次调用 deleteJob(DeleteJobRequest)、deleteDatabase(DeleteDatabaseRequest)与 deleteSpecificCrawler(DeleteCrawlerRequest)。删除数据库与爬虫之前,场景会各等待 5 分钟,确保爬虫停止、依赖解除,避免清理失败。
集成测试:以 13 个有序用例驱动场景
GlueTest.java 将场景的 13 个步骤映射为带@Order(1)至@Order(13)注解的 JUnit 5 集成测试,每个用例都调用GlueScenario中的公开静态方法并断言不抛出异常(assertDoesNotThrow)。测试数据不写在代码中,而是从 AWS Secrets Manager 读取名为test/glue的 Secret:
SecretsManagerClient secretClient = SecretsManagerClient.builder() .region(Region.US_EAST_1) .build(); String secretName = "test/glue"; GetSecretValueRequest valueRequest = GetSecretValueRequest.builder() .secretId(secretName) .build(); GetSecretValueResponse valueResponse = secretClient.getSecretValue(valueRequest);- Secret 中通过 Gson 反序列化为
SecretValues内部类,包含IAM、s3Path、cron、locationUri、bucketNameSc等字段; - 部分场景资源名(如
jobNameSc、crawlerNameSc、dbNameSc)会追加UUID.randomUUID(),避免并发测试间的命名冲突; - 测试同样保留了 5 分钟等待逻辑(GlueTest.java 与 L186-L194),与场景主流程时序保持一致。
运行测试前,需在config.properties或 AWS Secrets Manager 中预先配置所需的全部测试值,详见测试类头部注释。测试属于集成测试,会真实调用 AWS 服务并产生费用。
构建与运行示例
示例项目基于 Maven 构建,关键配置见 pom.xml:
- 编译目标:Java 21(
java.version、maven.compiler.source/target); - 依赖管理:通过
software.amazon.awssdk:bom:2.35.10统一 SDK 版本,核心依赖为software.amazon.awssdk:glue,并包含secretsmanager(测试读取密钥)、sso/ssooidc(IAM Identity Center 凭证链路)、Gson(JSON 解析)与 Log4j / SLF4J 日志组件; - 构建插件:
maven-compiler-plugin(编译)与maven-surefire-plugin:3.5.2(执行测试)。
在示例目录下执行:
mvn package即可完成编译与打包。如需将运行所需依赖一并打进可执行 JAR,可参照 javav2 README 中maven-shade-plugin的配置方式(uber JAR)。
随后运行完整场景:
mvn exec:java \ -Dexec.mainClass="com.example.glue.scenario.GlueScenario" \ -Dexec.args="<iam> <s3Path> <cron> <dbName> <crawlerName> <jobName> <scriptLocation> <locationUri> <bucketNameSc>"按程序提示在每一步输入c回车继续,即可观察从建库、爬取、建表到 ETL 执行的完整输出。运行集成测试则使用:
mvn test运行前务必确保test/glueSecret(或config.properties)已正确配置,并知晓测试会产生真实的 AWS 资源与费用。
更多资源
- AWS Glue 开发者指南:了解服务概念、爬虫与 Data Catalog 工作原理;
- AWS Glue API 参考:查询所有操作的请求/响应模型;
- SDK for Java 2.x 的 Glue 包参考:查看
GlueClient及各请求类的完整 API。
总结
通过 javav2/example_code/glue 目录,你可以完整掌握使用 AWS SDK for Java 2.x 驱动 AWS Glue 的核心能力:以GlueClient为统一入口,按「建库 → 建爬虫 → 爬取编目 → 查询 Data Catalog → 建 Job → 运行与监控 → 清理」的顺序组织 ETL 工作流;同时通过轮询模式处理爬虫就绪与任务终态等异步状态,并结合 Secrets Manager 与 JUnit 集成测试实现可重复、可自动化的验证闭环。这套代码模式可直接复用到生产级数据集成应用的开发中。
- 示例工程
- 教程
- 后端
【免费下载链接】aws-doc-sdk-examples
Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.
相关推荐
AWS SDK for C++ 操作 AWS Glue 实战:从 Crawler 数据爬取到 ETL 作业运行的完整示例解析
AWS SDK for C++ 操作 AWS Glue 实战:从 Crawler 数据爬取到 ETL 作业运行的完整示例解析 导读 本文以 cpp/exampl
示例工程教程后端aws-doc-sdk-examples:用 AWS SDK for Java 2.x 操作 AWS Systems Manager 的完整示例精讲
aws doc sdk examples:用 AWS SDK for Java 2.x 操作 AWS Systems Manager 的完整示例精讲 本篇技术指
示例工程教程后端aws-doc-sdk-examples:使用 AWS SDK for Java 2.x 操作 Amazon Timestream 的完整示例与测试指南
aws doc sdk examples:使用 AWS SDK for Java 2.x 操作 Amazon Timestream 的完整示例与测试指南 Ama
示例工程教程后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考