You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Glue PySpark作业查询Iceberg表报错:找不到目录插件类

问题解决方案

1. 修正Catalog类配置

报错核心原因是配置的Catalog类不正确,将原配置中的:

.set("spark.sql.catalog.glue_catalog", "org.apache.iceberg.spark.SparkSessionCatalog")

替换为:

.set("spark.sql.catalog.glue_catalog", "org.apache.iceberg.spark.SparkCatalog")

SparkSessionCatalog是Spark内置会话目录的Iceberg包装类,在Glue环境中直接使用SparkCatalog配合GlueCatalog实现类才能正常加载。

2. 确认Iceberg依赖配置

  • 若使用Glue 4.0及以上版本:已内置Iceberg支持,需在作业配置的「数据湖格式」选项中勾选Iceberg;
  • 若使用低版本Glue:需手动添加匹配版本的Iceberg AWS依赖JAR包,包括:
    • iceberg-spark-runtime-<Spark版本>-<Iceberg版本>.jar
    • iceberg-aws-glue-catalog-<Iceberg版本>.jar
    • iceberg-aws-s3-<Iceberg版本>.jar
      版本需与Glue绑定的Spark版本兼容(例如Glue 4.0对应Spark 3.3,Iceberg建议用1.3.x+)。

3. 简化S3凭证配置(可选)

Glue作业默认会使用执行角色的权限访问S3和Glue Catalog,手动配置凭证易引发冲突,建议移除以下配置项:

.set("spark.hadoop.fs.s3a.access.key", aws_access_key_id)
.set("spark.hadoop.fs.s3a.secret.key", aws_secret_access_key)
.set("spark.hadoop.fs.s3a.session.token", aws_session_token)
.set("spark.hadoop.fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider")

仅保留S3端点配置即可:

.set("spark.hadoop.fs.s3a.endpoint", f"s3.{AWS_REGION}.amazonaws.com")

4. 修正后的完整配置示例

conf = (
    SparkConf()
    .set("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
    .set("spark.hadoop.fs.s3a.endpoint", f"s3.{AWS_REGION}.amazonaws.com")
    .set('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions')
    .set("spark.sql.catalog.glue_catalog", "org.apache.iceberg.spark.SparkCatalog")
    .set("spark.sql.datalake-formats", "iceberg") 
    .set("spark.sql.catalog.glue_catalog.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog")
    .set("spark.sql.catalog.glue_catalog.io-impl", "org.apache.iceberg.aws.s3.S3FileIO")
    .set('spark.sql.catalog.glue_catalog.warehouse', 's3://path/to/database/folder')
)
sc = SparkContext(conf=conf)
glueContext = GlueContext(sc)
spark = glueContext.spark_session

if __name__ == "__main__":
    DATABASE = 'iceberg_db'
    TABLE = 'iceberg_table'
    df = spark.sql(f"SELECT * FROM glue_catalog.{DATABASE}.{TABLE} LIMIT 10")
    df.show()

5. 权限检查

确保Glue作业执行角色拥有以下权限:

  • glue:GetDatabase、glue:GetTable:用于访问Glue Catalog中的Iceberg库表;
  • s3:ListBucket、s3:GetObject:用于读取S3中存储的Iceberg表数据和元文件。

内容的提问来源于stack exchange,提问作者Vladyslav Chornyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:09:51