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版本>.jariceberg-aws-glue-catalog-<Iceberg版本>.jariceberg-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
相关产品推荐
相关产品推荐

