3. AWS Glue Catalog 实战:从架构到权限管理
Glue Data Catalog 是 AWS 湖仓体系里的「元数据中心」。说白了,它就是一个托管版的 Hive Metastore,但跟 EMR、Redshift、Athena 这些服务做了深度绑定。我最早接触它的时候,觉得不就是个表结构存储吗?后来踩了几个坑才发现,它的爬网程序、权限模型和集成方式,每个环节都有不少讲究。
3.1 Glue Data Catalog 架构
Glue Catalog 的核心组件其实不复杂,但理解它的分层结构很重要。我个人习惯把它拆成三层来看:
- 存储层:底层用 Amazon Aurora 存元数据,包括数据库、表、分区、表属性、Schema 版本等。这部分对用户透明,你不需要关心具体存在哪。
- API 层:提供标准的 Hive Metastore 兼容接口(Thrift API),也提供 Glue 自己的 REST API。EMR、Athena、Redshift Spectrum 都是通过这层来读写元数据。
- 治理层:包括爬网程序(Crawler)、数据目录同步(Catalog Sync)、基于 Lake Formation 的细粒度权限控制。这部分是 Glue Catalog 区别于自建 Hive Metastore 的关键。
关键点:Glue Catalog 是 Region 级别的服务,每个 Region 独立。跨 Region 访问元数据需要额外配置,我建议尽量把计算和 Catalog 放在同一个 Region,延迟会低很多。
下面这张图展示了 Glue Catalog 在 AWS 湖仓体系中的位置:
3.2 爬网程序配置
爬网程序(Crawler)是 Glue Catalog 的「自动扫描仪」。它会遍历你的数据源,推断 Schema,然后把表结构写入 Catalog。我在项目中见过很多人直接跑默认配置,结果分区表没识别出来,或者数据类型推断错了。
3.2.1 核心配置项
| 配置项 | 说明 | 我的建议 |
|---|---|---|
| 数据源类型 | S3、JDBC、DynamoDB 等 | S3 最常用,注意选对路径前缀 |
| 包含/排除模式 | 支持 glob 模式过滤文件 | 一定要配排除模式,避免扫描临时文件 |
| 分区策略 | 按目录结构自动推断分区 | 建议开启,但注意分区层级别超过 5 层 |
| Schema 更新 | 追加新列、更新类型等 | 生产环境选「追加新列」,别选覆盖 |
| 输出目标 | 指定 Catalog 数据库 | 每个 Crawler 对应一个库,别混用 |
小技巧:如果数据是 Parquet 格式,Crawler 会从文件元数据中读取 Schema,比从 CSV 推断准确得多。我一般建议数据入湖时统一转成 Parquet,这样 Crawler 几乎不会出错。
3.2.2 爬网程序配置示例
下面是一个通过 AWS CLI 创建 Crawler 的示例。注意我加了 Exclusions 参数,用来跳过临时文件和隐藏目录:
aws glue create-crawler \
--name "sales-data-crawler" \
--role "arn:aws:iam::123456789012:role/GlueCrawlerRole" \
--database-name "sales_db" \
--targets '{
"S3Targets": [
{
"Path": "s3://my-data-lake/sales/",
"Exclusions": ["**_tmp/**", "**_SUCCESS", "**.crc"]
}
]
}' \
--schema-change-policy '{
"UpdateBehavior": "LOG",
"DeleteBehavior": "LOG"
}' \
--configuration '{
"Version": 1.0,
"CrawlerOutput": {
"Partitions": { "AddOrUpdateBehavior": "InheritFromTable" }
}
}'
避坑指南:我曾经因为没配 Exclusions,Crawler 把 Spark 作业的临时文件也扫进去了,结果表里多出几百个无意义的分区。后来我养成了习惯——每个 Crawler 必须配排除模式,至少把 _tmp、_SUCCESS、.crc 排除掉。
3.3 与 EMR 集成
EMR 集成 Glue Catalog 是最常见的场景。你只需要在创建 EMR 集群时指定 --use-glue-catalog,或者把 hive.metastore.glue.catalogid 配好就行。
3.3.1 配置方式
用 EMR 命令行创建集群时,加上这个参数:
aws emr create-cluster \
--name "EMR with Glue Catalog" \
--release-label emr-6.15.0 \
--applications Name=Spark Name=Hive \
--ec2-attributes SubnetId=subnet-xxx \
--instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m5.xlarge \
--configurations '[{
"Classification": "hive-site",
"Properties": {
"hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
}
}]'
配好之后,你在 Spark SQL 或 Hive 里建表,元数据直接写到 Glue Catalog。其他 EMR 集群、Athena 都能看到同一张表。
经验之谈:我建议把 Glue Catalog 作为 EMR 的默认 Metastore,而不是用自带的 Derby 或 MySQL。这样你换集群、扩缩容,表结构不会丢。之前有个项目因为用了 EMR 自带的 Metastore,集群终止后元数据全没了,重建表花了两天。
3.4 与 Redshift 集成
Redshift 通过 Redshift Spectrum 查询 Glue Catalog 里的外部表。说白了,就是 Redshift 只负责计算,数据还在 S3 上,元数据走 Glue。
3.4.1 创建外部 Schema
CREATE EXTERNAL SCHEMA spectrum_sales
FROM DATA CATALOG
DATABASE 'sales_db'
IAM_ROLE 'arn:aws:iam::123456789012:role/RedshiftSpectrumRole'
CREATE EXTERNAL DATABASE IF NOT EXISTS;
创建成功后,你就可以在 Redshift 里直接查询 Glue Catalog 里的表了:
SELECT region, SUM(amount)
FROM spectrum_sales.orders
WHERE dt >= '2024-01-01'
GROUP BY region;
注意:Redshift Spectrum 查询会扫描 S3 数据,费用按扫描量算。我建议在 Glue Catalog 里做好分区裁剪,查询时带上分区条件,能省不少钱。
3.5 与 Athena 集成
Athena 是 Glue Catalog 的「原生搭档」。你不需要任何额外配置,Athena 默认就用 Glue Catalog 作为元数据存储。建表、查询、删除,全走 Glue。
举个例子,在 Athena 里创建一张基于 S3 的外部表:
CREATE EXTERNAL TABLE IF NOT EXISTS sales_db.orders (
order_id STRING,
customer_id STRING,
amount DOUBLE,
dt STRING
)
PARTITIONED BY (dt)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://my-data-lake/sales/orders/';
表创建后,Athena、EMR、Redshift Spectrum 都能看到它。这就是 Glue Catalog 的「一次建表,多处查询」能力。
避坑指南:Athena 查询超时或报错时,先检查 Glue Catalog 里的表分区是否和 S3 路径一致。我曾经遇到一个情况:Crawler 跑完后分区路径写错了,Athena 查出来全是空结果。排查了半天才发现是分区元数据的问题。
3.6 权限管理
Glue Catalog 的权限管理有两种方式:传统 IAM 策略和 Lake Formation 细粒度权限。我建议新项目直接用 Lake Formation,控制粒度更细。
3.6.1 IAM 策略基础
最基本的,你需要给计算引擎(EMR、Athena)授予 Glue Catalog 的读取权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetTable",
"glue:GetTables",
"glue:GetPartition",
"glue:GetPartitions"
],
"Resource": "*"
}
]
}
3.6.2 Lake Formation 细粒度权限
Lake Formation 可以控制到「某个用户只能查某张表的某几列」。配置步骤大致如下:
- 在 Lake Formation 里注册 Glue Catalog 的数据湖位置(S3 路径)。
- 创建 Lake Formation 权限策略,指定数据库、表、列级别权限。
- 将策略附加到 IAM 角色或用户。
- 在计算引擎(如 Athena)中,通过该角色查询,自动应用权限过滤。
关键点:Lake Formation 的列级权限是「透明过滤」的。用户查不到没授权的列,但查询语法不需要改。我有个金融客户就用这个功能,不同团队只能看到自己负责的字段,效果很好。
3.6.3 权限模型对比
| 维度 | IAM 策略 | Lake Formation |
|---|---|---|
| 粒度 | 库/表级别 | 库/表/列/行级别 |
| 配置复杂度 | 低 | 中 |
| 审计能力 | 弱 | 强(自带审计日志) |
| 适用场景 | 小团队、简单权限 | 多团队、合规要求高 |
我的建议:如果团队少于 10 人,权限需求简单,用 IAM 策略就够了。如果涉及跨部门、合规审计,直接上 Lake Formation。别想着先凑合用 IAM 以后再迁移——我见过一个项目迁移 Lake Formation 时,因为历史权限策略太乱,花了三周才理清楚。
嗯,Glue Catalog 的实战内容差不多就这些。从架构到爬网程序配置,再到与三大计算引擎的集成,最后是权限管理——每个环节都有一些「看起来简单但容易踩坑」的地方。你只要把 Crawler 的排除模式、分区策略、权限模型这几个关键点抓好,Glue Catalog 用起来会顺手很多。