Spark版本高于3.2.x时初始化HadoopCatalog遇warehousePath非空错误
解决Spark 3.2.x以上版本Iceberg HadoopCatalog初始化错误(warehousePath不能为空)
问题根源在于Spark 3.2.x以上版本搭配的Iceberg版本对SparkSessionCatalog(即默认的spark_catalog)的配置校验更严格。你的配置中,spark_catalog被指定为hadoop类型,但未配置对应的warehouse路径——高版本Iceberg强制要求所有hadoop类型的catalog必须明确设置warehouse路径,而3.2.x版本的Iceberg未强制执行该校验,因此能正常运行。
解决方案
方案一:为spark_catalog添加warehouse路径配置
给默认的spark_catalog补充warehouse路径配置,使其符合高版本Iceberg的校验要求:
val spark = SparkSession.builder().appName("Spark Iceberg Example") .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") .config("spark.sql.catalog.spark_catalog", "org.apache.iceberg.spark.SparkSessionCatalog") .config("spark.sql.catalog.spark_catalog.type", "hadoop") .config("spark.sql.catalog.spark_catalog.warehouse", "hdfs://your-warehouse-path") // 新增配置 .config("spark.sql.catalog.hadoop_prod.type", "hadoop") .config("spark.sql.catalog.hadoop_prod", "org.apache.iceberg.spark.SparkCatalog") .config("spark.sql.catalog.hadoop_prod.warehouse", "hdfs://xxxx") .getOrCreate()
方案二:恢复spark_catalog为默认会话catalog
如果仅需使用自定义的hadoop_prod作为hadoop类型catalog,可移除spark_catalog的hadoop类型配置,让其保持默认的Spark内置catalog行为:
val spark = SparkSession.builder().appName("Spark Iceberg Example") .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") .config("spark.sql.catalog.spark_catalog", "org.apache.iceberg.spark.SparkSessionCatalog") // 移除 spark.sql.catalog.spark_catalog.type 配置 .config("spark.sql.catalog.hadoop_prod.type", "hadoop") .config("spark.sql.catalog.hadoop_prod", "org.apache.iceberg.spark.SparkCatalog") .config("spark.sql.catalog.hadoop_prod.warehouse", "hdfs://xxxx") .getOrCreate()
方案一适用于需要将默认spark_catalog也作为hadoop类型catalog使用的场景;方案二适用于仅依赖自定义hadoop_prod catalog的场景。
内容的提问来源于stack exchange,提问作者Abdus selam
相关产品推荐
相关产品推荐

