访问 Data Catalog - AWS Glue

访问 Data Catalog

您可以使用 AWS Glue Data Catalog (Data Catalog) 来发现和理解您的数据。Data Catalog 提供了一种一致的方法来维护架构定义、数据类型、位置和其他元数据。您可以使用如下方法访问 Data Catalog:

  • AWS Glue 控制台 – 您可以通过 AWS Glue 控制台(基于 Web 的用户界面)访问和管理 Data Catalog。控制台允许您浏览和搜索数据库、表及其关联的元数据,以及创建、更新和删除元数据定义。

  • AWS Glue 爬网程序 – 爬网程序是自动扫描您的数据来源并以元数据填充 Data Catalog 的程序。您可以创建和运行爬网程序来发现来自各种来源的数据并对其进行编目,例如 Amazon S3、Amazon RDS、Amazon DynamoDB、Amazon CloudWatch、兼容 JDBC 的关系数据库(例如 MySQL 和 PostgreSQL)以及一些非 AWS 的来源,例如 Snowflake 和 Google BigQuery。

  • AWS Glue API – 您可以使用 AWS Glue API 以编程方式访问 Data Catalog。这些 API 允许您以编程方式与 Data Catalog 进行交互,从而实现自动化并与其他应用程序和服务集成。

  • AWS Command Line Interface(AWS CLI)– 您可以使用 AWS CLI 从命令行访问和管理 Data Catalog。CLI 提供了用于创建、更新和删除元数据定义以及查询和检索元数据信息的命令。

  • 与其他 AWS 服务集成 – Data Catalog 与其他各种 AWS 服务集成,使您能够访问和使用存储在目录中的元数据。例如,您可以使用 Data Catalog 中的元数据,利用 Amazon Athena 查询数据来源,并使用 AWS Lake Formation 来管理 Data Catalog 资源的数据访问和治理。

使用 AWS Glue Iceberg REST 端点连接到 Data Catalog

AWS Glue 的 Iceberg REST 端点支持 Apache Iceberg REST 规范中指定的 API 操作。使用 Iceberg REST 客户端,您可以将在分析引擎上运行的应用程序连接到 Data Catalog 中托管的 REST 目录。

该端点支持 Apache Iceberg 表规范 v1 和 v2,默认为 v2。当使用 Iceberg 表 v1 规范时,必须在 API 调用中指定 v1。使用 API 操作,您可以访问 Amazon S3 对象存储和 Amazon S3 表存储中存储的 Iceberg 表。

配置详细信息

Endpoint : https://glue.us-east-1.amazonaws.com/iceberg

当使用 Iceberg 客户端将 Spark 等分析引擎连接到服务端点时,您需要指定下面的应用程序配置:

catalog_name = "mydatacatalog"
aws_account_id = "123456789012"
aws_region = "us-east-1"
spark = SparkSession.builder \
    ... \
    .config("spark.sql.defaultCatalog", catalog_name) \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.type", "rest") \
    .config(f"spark.sql.catalog.{catalog_name}.uri", "https://glue.{aws_region}.amazonaws.com/iceberg") \
    .config(f"spark.sql.catalog.{catalog_name}.warehouse", "{aws_account_id}") \
    .config(f"spark.sql.catalog.{catalog_name}.rest.sigv4-enabled", "true") \
    .config(f"spark.sql.catalog.{catalog_name}.rest.signing-name", "glue") \
    .config(f"spark.sql.catalog.{catalog_name}.rest.signing-region", "{aws_region}") \
    .config(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .getOrCreate()
     

使用 AWS Glue Iceberg REST 扩展端点连接到 Data Catalog

AWS Glue Iceberg REST 扩展端点提供了 Apache Iceberg REST 规范中不存在的其他 API,并提供了服务器端扫描规划功能。当您访问存储在 Amazon Redshift 托管存储中的表时,将使用这些附加 API。可以使用 Apache Iceberg AWS Glue Data Catalog 扩展库从应用程序访问该端点。

Endpoint : https://glue.us-east-1.amazonaws.com/extensions
catalog_name = "myredshiftcatalog"
aws_account_id = "123456789012"
aws_region = "us-east-1"
spark = SparkSession.builder \
    .config("spark.sql.defaultCatalog", catalog_name) \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \
    .config(f"spark.sql.catalog.{catalog_name}.client.region", "{aws_region}") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.id", "{aws_account_id}:redshiftnamespacecatalog/redshiftdb") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.endpoint", "https://glue.us-east-1.amazonaws.com/extensions") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.extensions.debug-enabled", "true") \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .getOrCreate()
    

对 AWS Glue 服务端点进行身份验证和授权

对 AWS Glue Data Catalog 端点的 API 请求使用 AWS 签名版本 4 (SigV4) 进行身份验证。请参阅适用于 API 请求的 AWS 签名版本 4 部分以了解有关 AWS SigV4 的更多信息。

访问 AWS Glue 服务端点和 AWS Glue 元数据时,应用程序将代入一个需要 glue:getCatalog IAM 操作的 IAM 角色。

REST 操作 REST 路径 AWS Glue IAM 操作 CloudTrail EventName Lake Formation 权限
GetConfig GET /config GetCatalog 可选
ListNamespaces GET /namespaces GetDatabases GetDatabases ALL、DESCRIBE、SELECT
CreateNamespace POST /namespaces CreateDatabase CreateDatabase ALL、CREATE_DATABASE
LoadNamespaceMetadata GET /namespaces/{ns} GetDatabase GetDatabase ALL、DESCRIBE、SELECT
UpdateProperties POST /namespaces/{ns}/properties UpdateDatabase UpdateDatabase ALL、ALTER
DeleteNamespace DELETE /namespace/{ns} DeleteDatabase DeleteDatabase ALL、DROP
ListTables GET /namespaces/{ns}/tables GetTables GetTables ALL、SELECT、DESCRIBE
CreateTable POST /namespaces/{ns}/tables CreateTable CreateTable ALL、CREATE_TABLE
LoadTable GET /namespaces/{ns}/tables/{tbl} GetTable GetTable ALL、SELECT、DESCRIBE
TableExists HEAD /namespaces/{ns}/tables/{tbl} GetTable GetTable ALL、SELECT、DESCRIBE
UpdateTable POST /namespaces/{ns}/tables/{tbl} UpdateTable UpdateTable ALL、ALTER
DeleteTable DELETE /namespaces/{ns}/tables/{tbl} DeleteTable DeleteTable ALL、DROP

您可以使用 IAM、AWS Lake Formation 或 Lake Formation 混合模式权限来管理对默认 Data Catalog 及其对象的访问。

AWS Glue Data Catalog中的联合目录具有 Lake Formation 注册的数据位置。Lake Formation 与 Data Catalog 集成,并提供数据库样式的权限来管理用户对目录对象的访问。在 Lake Formation 中,必须为用于创建、插入或删除数据的 IAM 用户或角色设置权限。权限与现有 AWS Glue 表的权限相同:

  • CREATE_CATALOG:创建目录所必需的

  • CREATE_DATABASE:创建数据库所必需的

  • CREATE_TABLE:创建表所必需的

  • DELETE:从表中删除数据所必需的

  • DESCRIBE:读取元数据所必需的

  • DROP:删除表或数据库所必需的

  • INSERT:当主体需要将数据插入表中时需要

  • SELECT:当主体需要从表中选择数据时需要

有关更多信息,请参阅《AWS Lake Formation 开发人员指南》中的 Lake Formation permissions reference

从独立 Spark 应用程序连接到 Data Catalog

您可以使用 Apache Iceberg 连接器从独立应用程序连接到 Data Catalog。

  1. 为 Spark 应用程序创建 IAM 角色。

  2. 使用 Iceberg 连接器连接到 AWS Glue Iceberg Rest 端点。

    # configure your application. Refer to https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html for best practices on configuring environment variables. export AWS_ACCESS_KEY_ID=$(aws configure get appUser.aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws configure get appUser.aws_secret_access_key) export AWS_SESSION_TOKEN=$(aws configure get appUser.aws_secret_token) export AWS_REGION=us-east-1 export REGION=us-east-1 export AWS_ACCOUNT_ID = {specify your aws account id here} ~/spark-3.5.3-bin-hadoop3/bin/spark-shell \ --packages org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.6.0 \ --conf "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \ --conf "spark.sql.defaultCatalog=spark_catalog" \ --conf "spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkCatalog" \ --conf "spark.sql.catalog.spark_catalog.type=rest" \ --conf "spark.sql.catalog.spark_catalog.uri=https://glue.us-east-1.amazonaws.com/iceberg" \ --conf "spark.sql.catalog.spark_catalog.warehouse = {AWS_ACCOUNT_ID}" \ --conf "spark.sql.catalog.spark_catalog.rest.sigv4-enabled=true" \ --conf "spark.sql.catalog.spark_catalog.rest.signing-name=glue" \ --conf "spark.sql.catalog.spark_catalog.rest.signing-region=us-east-1" \ --conf "spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO" \ --conf "spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.SimpleAWSCredentialProvider"
  3. 查询 Data Catalog 中的数据。

    spark.sql("create database myicebergdb").show()
    spark.sql("""CREATE TABLE myicebergdb.mytbl (name string) USING iceberg location 's3://bucket_name/mytbl'""")
    spark.sql("insert into myicebergdb.mytbl values('demo') ").show()
           

Amazon Redshift 与 Apache Iceberg 之间的数据映射

Redshift 和 Iceberg 支持各种数据类型。以下兼容性矩阵概括介绍了在这两个数据系统之间映射数据时的支持和限制。有关相应数据系统中支持的数据类型的更多详细信息,请参阅 Amazon Redshift 数据类型Apache Iceberg Table Specifications

Redshift 数据类型 别名 Iceberg 数据类型
SMALLINT INT2 int
INTEGER INT、INT4 int
BIGINT INT8 long
DECIMAL NUMERIC decimal
REAL FLOAT4 float
REAL FLOAT4 float
DOUBLE PRECISION FLOAT8、FLOAT double
CHAR CHARACTER、NCHAR 字符串
VARCHAR CHARACTER VARYING、NVARCHAR 字符串
BPCHAR 字符串
TEXT 字符串
DATE date
TIME TIME WITHOUT TIMEZONE 时间
TIME TIME WITH TIMEZONE 不支持
TIMESTAMP TIMESTAMP WITHOUT TIMEZONE TIMESTAMP
TIMESTAMPZ TIMESTAMP WITH TIMEZONE TIMESTAMPZ
INTERVAL YEAR TO MONTH 不支持
INTERVAL DAY TO SECOND 不支持
BOOLEAN BOOL 布尔
HLLSKETCH 不支持
SUPER 不支持
VARBYTE VARBINARY,BINARY VARYING binary
GEOMETRY 不支持
GEOGRAPHY 不支持

使用 AWS Glue Glue Iceberg REST 目录 API 时的注意事项和限制

下面是使用 Apache Iceberg REST 目录数据定义语言 (DDL) 操作行为时的注意事项和限制。

注意事项
  • DeleteTable API 行为:DeleteTable API 支持清除选项。当清除设置为 true 时,表数据会被删除,否则数据不会被删除。对于 Amazon S3 中的表,操作不会删除表数据。当表存储在 Amazon S3 中且 purge = TRUE, 时,操作会失败。

    对于存储在 Amazon Redshift 托管存储中的表,该操作将删除表数据,类似于 Amazon Redshift 中的 DROP TABLE 行为。当表存储在 Amazon Redshift 中且 purge = FALSE 时,操作会失败。

  • CreateTable API 行为CreateTable API 操作不支持选项 state-create = TRUE

  • RenameTable API 行为:Amazon Redshift 中的表支持 RenameTable 操作,但 Amazon S3 中不支持。

  • Amazon Redshift 中命名空间和表的 DDL 操作:Amazon Redshift 中命名空间和表的创建、更新、删除操作是异步操作,因为它们依赖于 Amazon Redshift 托管工作组何时可用以及是否有冲突的 DDL 和 DML 事务正在进行,并且操作必须等待锁定,然后再尝试提交更改。

    在创建、更新或删除操作期间,端点会返回具有以下有效载荷的 202 响应。

    {
      "transaction-context": "operation/resource", 
      "transaction-id": "data-api-request-id:crypto-hash-signature(operation, resource, data-api-uuid)"
    }        

    例如,端点将对 UpdateTable 操作提供以下响应:

    {
      "transaction-context": "UpdateTable/arn:aws:glue:us-east-1:123456789012:table/123456789012/cat1/db1/tbl1", 
      "transaction-id": "b0033764-20df-4679-905d-71f20a0cdbe7:ca8a95d54158793204f1f39b4971d2a7"
    }        

    要跟踪此事务的进度,您可以使用 CheckTransactionStatus API,如下所示:

    POST /transactions/status
    
    Request:
    {
      "transaction-context": "UpdateTable/arn:aws:glue:us-east-1:123456789012:table/123456789012/cat1/db1/tbl1", 
      "transaction-id": "transaction-id": "b0033764-20df-4679-905d-71f20a0cdbe7:ca8a95d54158793204f1f39b4971d2a7"
    }
    
    Response:
    {
       "status": "IN_PRORESS|SUCCEEDED|FAILED|CANCELED",
      "error": "message" // if failed
    }
            
限制
  • AWS Glue Glue Iceberg REST 目录不支持 Apache Iceberg REST 规范中的视图 API。