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

EMR集群中Spark通过Glue Catalog读取Apache Iceberg表失败求助

问题

在AWS EMR的Spark集群中尝试从Glue Catalog读取存储在S3上的Apache Iceberg格式表,该表已通过Athena正常查询。集群创建时已配置:

[{"classification":"iceberg-defaults","properties":{"iceberg.enabled":"true"}}]

Spark可正常执行CSV等格式的SQL查询,但读取Iceberg表时抛出错误:

org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table table_name. StorageDescriptor#InputFormat cannot be null for table: table_name(Service: null; Status Code: 0; Error Code: null; Request ID: null; Proxy: null)

使用的笔记本代码如下:

%%configure -f
{
"conf":{
    "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
    "spark.sql.catalog.dev":"org.apache.iceberg.spark.SparkCatalog",
    "spark.sql.catalog.dev.type":"hadoop",
    "spark.sql.catalog.dev.warehouse":"s3://pyramid-streetfiles-sbx/iceberg_test/"
    }
}

from pyspark.conf import SparkConf
from pyspark.sql import SparkSession
import pyspark.sql.functions as f
import pyspark.sql.types as t

spark = SparkSession.builder.getOrCreate()

# 该查询可正常运行,显示目标Iceberg表
spark.sql("show tables from iceberg_test").show(truncate=False)

# 执行此查询时出现错误
spark.sql("select * from iceberg_test.table_name limit 10").show(truncate=False)

需要解决的问题:如何在EMR集群中通过Spark和Glue Catalog读取Apache Iceberg表?

解决方案

1. 修正Spark Catalog配置

当前配置使用的是Hadoop Catalog,无法对接Glue元数据。需替换为Glue Catalog专属配置:

%%configure -f
{
"conf":{
    "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
    "spark.sql.catalog.glue_catalog":"org.apache.iceberg.spark.SparkCatalog",
    "spark.sql.catalog.glue_catalog.type":"glue",
    "spark.sql.catalog.glue_catalog.warehouse":"s3://pyramid-streetfiles-sbx/iceberg_test/",
    "spark.sql.catalog.glue_catalog.io-impl":"org.apache.iceberg.aws.s3.S3FileIO"
    }
}
  • spark.sql.catalog.glue_catalog.type: 指定使用Glue作为元数据存储
  • spark.sql.catalog.glue_catalog.io-impl: 适配AWS S3的Iceberg文件IO实现,确保能读写S3上的Iceberg数据文件

2. 调整表查询语句

使用配置的Glue Catalog名称来引用表,格式为catalog_name.database_name.table_name:

# 查看Glue Catalog下指定数据库的表
spark.sql("show tables from glue_catalog.iceberg_test").show(truncate=False)

# 查询目标Iceberg表
spark.sql("select * from glue_catalog.iceberg_test.table_name limit 10").show(truncate=False)

3. 确认集群兼容性

确保使用的EMR版本支持Iceberg与Glue Catalog集成(推荐EMR 6.4及以上版本),且集群创建时的iceberg-defaults配置已正确启用Iceberg。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:10:34