关于 migrating-hive-tables-to-s3-tables
Migrating Hive Tables to S3 Tables 指导编码 Agent 使用原生迁移 API,将 Glue Hive Parquet 表迁移到 S3 Tables 存储桶。它涵盖预检、迁移计划审批、进度跟踪、同步及切换前验证,并对变更和数据丢失设有明确防护。
主要功能
- 01检查源表和目标位置
- 02审阅并批准迁移计划
- 03跟踪、同步和完成迁移
- 04验证行数与样本值
- 05权限和数据丢失防护
适用场景
- 01将 Glue Hive Parquet 表迁移到 S3 Tables
- 02切换前保持目标表同步
- 03提升目标表前检查数据一致性
MCP 相关
如果 AWS MCP Server 可用,它可用于加载此技能及其参考文件并执行 AWS 调用。没有该服务时,此技能也可通过 AWS CLI 语法运行。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ aws/ agent-toolkit-for-aws --skill migrating-hive-tables-to-s3-tables安装后在 Claude Code 中输入/migrating-hive-tables-to-s3-tables确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/api-setup.mdiam-roles.mdlifecycle.mdpreflight.mdtroubleshooting.mdvalidation.md详细介绍
将 Hive 表迁移到 S3 Tables
目录
概述
此技能将引导 Agent 使用原生 S3 Tables 迁移 API,将一个 Glue Hive Parquet 表迁移到 S3 表 存储桶中。Amazon S3 Tables 会规划迁移、报告列和对象的兼容性、复制数据,并在你完成迁移之前 让目标端与源端保持同步。遵循此技能的编码 Agent 会运行迁移前检查、启动迁移、提交 迁移计划供审批、监控进度、完成迁移并验证结果。
如果 AWS MCP Server 可用,请使用它加载此技能及其参考资料
(使用 aws___retrieve_skill,并设置 file="references/<name>.md"),并执行 AWS 调用。
迁移前须知
Agent 指令: 在任何会更改表、数据、元数据或目录条目的步骤之前,以及进行任何 IAM、KMS
或 S3 存储桶更改之前(创建或编辑角色或策略、编辑密钥策略、创建报告存储桶),你都必须先
提交迁移计划,并获得用户的明确批准。先展示准确的 JSON 或命令。对于密钥策略,请使用
get-key-policy 读取,添加一条语句,绝不要替换整个策略。计划必须列出:
- 源表以及目标表存储桶、命名空间和表名;
- 将发生变化的写入路径(ETL 作业、流式处理或数据摄取、
INSERT/MERGE、CDC); - 读取该表的查询引擎和下游使用方;
- 引用旧 Glue 表或 S3 前缀的数据集、已保存查询和权限。
用户请求中预先给出的批准(注明源、目标和迁移意图)仅涵盖只读检查,以及在审查计划后执行 Start。
批准计划、接受任何 setNull 或 drop 策略、执行 Complete,以及任何删除操作,始终都需要在对话过程中
获得明确批准。如果实际状态与已批准内容不同(架构、分区布局、行数或资源不同),请停止操作,
说明差异并再次征求批准。
请在制定计划时向用户确认以下限制:
- 所有写入目标端的程序都必须通过支持 Iceberg 的引擎写入(例如 Athena、 EMR 或支持 Iceberg 的 Glue)。直接将 Parquet 文件写入 S3 的程序无法正常工作。
- 所有读取程序都必须支持 Iceberg 和 S3 Tables 目录。
- 作业和查询必须从 Glue Hive 表切换到 S3 Tables 目录引用。
- 不得更改源端。在验证目标端之前,写入程序应继续写入源端。
- 在切换生产流量之前,请验证行数和样本值(references/validation.md)。
支持的源和限制的完整列表,请参阅将表迁移到 S3 Tables。
运行环境: 可在有或没有 AWS MCP Server 的情况下使用;步骤使用 AWS CLI 语法。建议使用 AWS MCP Server 进行沙箱化执行和审计日志记录。迁移命令属于
aws s3tables;如果较旧的 CLI 不包含这些命令,请参阅 references/api-setup.md。
适用场景
当源是 Glue Data Catalog Hive 表,且数据为 Parquet 格式
(TableType=EXTERNAL_TABLE,使用 Hive Parquet SerDe),目标是同一账户和区域中的 S3 表存储桶时,使用此技能:
- 使用原生迁移 API 将该表迁移到 S3 Tables,作为托管式 Iceberg 表。
- 在切换前,使迁移后的表与活动 Hive 源保持同步。
不适用场景(请使用其他技能)
以下名称指其他 Agent 技能。遇到这些请求时,请勿使用此技能,而应加载指定技能。当被问及哪些场景不适用时,请列出所有情况:
- 使用自运行的 CTAS、Glue ETL 或 EMR/Spark 将数据迁移到 Iceberg:使用
ingesting-into-data-lake技能(此技能仅涵盖托管迁移 API)。 - 转换自托管或标准 Iceberg 表:使用
ingesting-into-data-lake技能。 - 加载原始文件(没有 Glue 表的 Parquet、CSV、JSON)或其他来源(JDBC、Snowflake、BigQuery、DynamoDB):使用
ingesting-into-data-lake技能。 - 创建新的空 Iceberg 表:使用
creating-data-lake-table技能。 - 运行或管理 Athena 查询:使用
querying-data-lake技能。 - 查找表或资产:使用
finding-data-lake-assets技能。审计目录:使用exploring-data-catalog技能。 - 设置 Glue 连接:使用
connecting-to-data-source技能。 - 目标不是 S3 Tables 的任何场景。
提示词模式(触发表述)
- “将我的 Glue Hive 表
<db>.<tbl>迁移到我的表存储桶<name>。” - “使用原生迁移 API 将现有 Hive 表导入 S3 Tables。”
- “将我的 Parquet Hive 表迁移到 Iceberg,不运行 CTAS 或 Glue/Spark 作业。”
- “使用 StartTableMigration 转换
<tbl>。” - “在切换前使迁移后的表与源保持同步” → 同步。
- “完成迁移后的表” → 完成。
- “检查迁移
<id>的状态或计划” → 获取。 - “列出我的表迁移” → 列出。
范围和限制
- 源: 与目标表存储桶位于同一账户和区域的 Glue Hive Parquet 表。
- 目标: 现有的 S3 表存储桶和命名空间;迁移过程会创建表。
- 不支持(请在 S3 Tables 迁移指南中确认当前列表): Lake Formation 注册表、位于表位置之外的分区、非 Parquet 格式、Iceberg 源、跨账户、SSE-C 和归档存储类别。请在预检时检查这些情况,若有任何一项适用,则停止操作。对于 Lake Formation 注册表,请告知用户当前不支持,并建议其联系 AWS Support 或其客户团队,提供迁移 ID 以申请支持。切勿更改 Lake Formation 设置。
- 兼容性问题会在规划期间报告。批准前务必检查计划。
- 全有或全无的复制: 如果单个对象失败,整个迁移都会失败。运行状态为
succeeded时,没有失败的对象。 - 三份报告会写入你提供的通用存储桶:表兼容性、对象兼容性和对象迁移报告。
- 成本和耗时: 迁移会写入第二份数据副本;源数据退役前,请按存储量约翻倍做好规划。大型表可能需要数小时。
- 配额: 请参阅 S3 Tables 配额。
- 迁移策略: 默认情况下,不兼容的列会导致运行失败。
incompatibleValuesPolicy: setNull和unmatchedSourceFieldsPolicy: drop会应用于整个列,且运行仍会报告succeeded。任何setNull或dropped列都应视为数据丢失,必须获得明确批准。
6 个迁移 API
| API | 用途 | 阶段 |
|---|---|---|
StartTableMigration | 规划并启动迁移。使用 --review-migration-plan 时,会在 pendingReview 状态暂停。 | 启动 |
GetTableMigration | 返回 state、hasValidPlan、planningStats、migrationStats、migrationOutput、failureReason。 | 跟踪、审核 |
UpdateTableMigration | 批准(--requested-state queued)或取消。 | 批准 |
SyncTableMigration | 应用自上次规划以来的源更改;重复执行,直到同步到最新状态。 | 同步 |
CompleteTableMigration | 将目标提升为可读写状态。需要 --table-arn。返回空响应体;迁移状态保持为 succeeded。使用 get-table 确认(managedByService 为 null)。 | 完成 |
ListTableMigrations | 列出某个表存储桶或表的迁移。 | 发现 |
请求和响应结构见 references/lifecycle.md。
迁移生命周期(阶段)
- 预检 → references/preflight.md、references/iam-roles.md
- 启动并规划:
start-table-migration --review-migration-plan;planning→pendingReview。 - 审核:
get-table-migration;阅读兼容性报告,并提交迁移计划以供批准。 - 批准并迁移:
update-table-migration --requested-state queued;轮询状态,直到从migrating变为succeeded。 - 同步(可选):
sync-table-migration;重复执行,直到同步到最新状态。 - 验证: 在
succeeded状态的表上、完成迁移之前,在 Athena 中查询目标并与源进行比较 → references/validation.md。每次迁移都必须验证:除非用户选择退出,否则无需询问就运行行数和样本检查。如果计数不足,使用sync-table-migration进行协调(完成迁移后无法执行)。 - 完成: 确认数据一致且用户批准后,执行
complete-table-migration --table-arn ...,然后确认get-table显示managedByService为 null。
第 2 至 7 阶段详见 references/lifecycle.md。
迁移前防护检查(每次启动前都要运行)
在所有检查通过之前,不要调用 start-table-migration。命令见
references/preflight.md 和 references/iam-roles.md。
- 计划已获批准。 已展示并批准迁移前准备中的计划。
- 凭证和区域。
sts get-caller-identity执行成功;源和目标位于同一账户和区域。 - 源表为 Glue Hive Parquet。
TableType=EXTERNAL_TABLE,使用 Hive Parquet 格式和 SerDe;不是 Iceberg,不是 ACID/事务表,也没有存储处理程序。记录catalogId。 - 分区位置。 每个分区位置都在表位置之下;位于表位置之外的分区会导致规划失败,并返回
UNSUPPORTED_PARTITIONS。检查分区投影和skip.header.line.count。 - Lake Formation。 如果源表或其位置已在 Lake Formation 中注册,请停止:暂不支持(请在迁移指南中确认当前支持情况)。不要更改 Lake Formation 设置。
- 目标已存在。 表存储桶和命名空间均已存在。命名空间缺失会导致 Start 返回
NotFoundException。 - 迁移角色信任关系。 一个语句,主体为
migration.s3tables.amazonaws.com,条件为aws:SourceAccount和aws:SourceArn。 - 迁移角色权限。 按范围授予源 S3 和 Glue 读取权限、目标写入权限以及报告存储桶写入权限。调用方还需要对该角色拥有
iam:PassRole权限,并将iam:PassedToService条件设为migration.s3tables.amazonaws.com。 - KMS。 如果数据使用客户管理的密钥加密,请授予
kms:Decrypt和kms:GenerateDataKey权限。对于 SSE-KMS 目标,密钥策略还必须允许maintenance.s3tables.amazonaws.com,否则表创建会失败,规划也无法完成(参见 preflight §7 和 IAM roles)。
迁移后防护检查(Complete 前验证成功)
在 succeeded 状态的表上运行检查 1 至 7,再执行 Complete,因为 Complete 后会拒绝 Sync。Complete 后,只需确认 get-table 显示 managedByService 为 null。
- 终止状态:
state: succeeded,failureReason为 null。 - 对象核算:
objectsFailedMigration为 0,且objectsMigrated与计划的对象数量一致。如果数量不一致,请检查源对象数量(较早一次同步留下的额外文件属于正常情况),并通过行数一致性确认后再判定为失败。 - 行数一致性: 目标表的
count(*)等于源表。 - 分区一致性: 每个分区的行数相符(适用于分区表)。
- 抽样检查行: 抽样值相符,包括时间戳等经过转换的列。
- 架构审查: 计划中已接受每列的类型标签(
Lossless、Widened、Converted);没有任何列标记为Incompatible或Unsupported。 - 目录命名: 按
"s3tablescatalog/<table-bucket>"."<namespace>"."<table>"查询。
关键 API 结构
sourceType=glueTable(顶层),source={"glueTable":{"catalogId":"<acct>","databaseName":"<db>","tableName":"<tbl>"}}。catalogId为必填项。角色成员为roleARN。--destination-table={"tableBucketARN":"<arn>","namespace":"<ns>","name":"<tbl>"}。migrationOutput为必填项:{bucket, prefixes},其中bucket是通用存储桶 ARN,prefixes可选,用于设置tableCompatibilityReport、objectCompatibilityReport、objectMigrationReport。- 可选的
dataMigration.migrationPolicies:unmatchedSourceFieldsPolicy(fail|drop)、incompatibleValuesPolicy(fail|setNull)。两者默认值均为fail。 - 不要向信任策略添加
sts:ExternalId;Amazon S3 Tables 不会发送此项。 - 状态:
new → planning → pendingReview → queued → migrating → succeeded,另有failed、cancelling、cancelled。 - 取消或失败时,目标表会保留。如果
hasValidPlan为 true,则使用sync-table-migration恢复;否则删除该表并重新开始。规则见 references/lifecycle.md。 - 仅当迁移状态为
succeeded时才可完成。重复完成会返回409 ConflictException或400 BadRequestException;两者均视为“已完成”。 - Athena 参考格式:
"s3tablescatalog/<table-bucket>"."<namespace>"."<table>"。要求表存储桶已与 Glue Data Catalog 集成。
安全注意事项
- 仅包含说明;不提供随附代码或依赖项。
- **迁移角色:**信任
migration.s3tables.amazonaws.com,并带有aws:SourceAccount和aws:SourceArn条件;权限限定于确切的源、目标和报告资源。 - **加密:**建议对目标表存储桶和报告存储桶使用 SSE-KMS,并采用仅允许 TLS 的存储桶策略。客户管理的目标密钥必须在其密钥策略中允许
maintenance.s3tables.amazonaws.com。 - **日志记录:**为迁移 API 和角色承担操作启用 CloudTrail;为涉及的存储桶启用 S3 数据事件或服务器访问日志记录,并针对失败设置 CloudWatch 警报。加密日志目标。
- 生成的命令、报告或状态文件中不得包含机密信息。
参考资料
| 文件 | 主题 |
|---|---|
| references/api-setup.md | 确认迁移命令已包含在 aws s3tables CLI 中 |
| references/preflight.md | 凭证、源检查、分区位置、Lake Formation、目标 |
| references/iam-roles.md | 调用方策略以及迁移角色的信任关系和权限 |
| references/lifecycle.md | 状态机和各阶段调用:启动、审核、批准、同步、完成 |
| references/validation.md | Athena 行数、聚合和抽样检查;目录命名 |
| references/troubleshooting.md | failureReason 代码和修复方法 |