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
相关产品推荐
相关产品推荐

