如何配置Spark SQL对接Moto模拟的AWS Glue Catalog进行本地测试?
我正在使用Moto模拟AWS Glue进行Spark本地测试,已成功通过moto_server -p9999启动Moto并在Glue中创建数据库和表。但执行Spark SQL命令如ss.sql("SELECT * FROM db.table")时,似乎指向默认Spark catalog而非Moto模拟的Glue catalog。
以下是我的简化Spark Session配置:
implicit val ss: SparkSession = SparkSession .builder() .appName("test spark session") .master("local[*]") .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") .config("spark.hadoop.glue.catalog.enabled", "true") .config("spark.hadoop.glue.catalog.catalog-endpoint", "http://localhost:9999") .config("spark.hadoop.glue.catalog.region", "us-west-1") .config("spark.hadoop.hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") .enableHiveSupport() .getOrCreate()
我的glueClient配置为使用Moto进行本地测试:
val glueClient: AWSGlue = { AWSGlueClientBuilder.standard().withEndpointConfiguration( new AwsClientBuilder.EndpointConfiguration( "http://localhost:9999", "us-west-1") ).withCredentials( new AWSStaticCredentialsProvider( new BasicAWSCredentials("accessKey", "secretKey") ) ).build() }
我能查看通过Moto创建的数据库和表,但Spark SQL查询无法识别它们。请问如何配置Spark以使用Moto Glue catalog,从而直接执行SHOW DATABASES或查询表?
解决方案
1. 替换默认Catalog实现
当前配置将spark.sql.catalog.spark_catalog设为DeltaCatalog,覆盖了默认的Glue Catalog绑定。需改为Glue对应的Catalog类:
.config("spark.sql.catalog.spark_catalog", "com.amazonaws.glue.catalog.spark.GlueCatalog")
修改后Spark的默认catalog会直接指向Moto模拟的Glue实例。
2. 补充Glue必要配置项
添加缺失的AWS凭证和SSL禁用配置,确保Spark能正确访问本地Moto服务:
// 配置AWS凭证,与glueClient保持一致 .config("spark.hadoop.aws.accessKeyId", "accessKey") .config("spark.hadoop.aws.secretAccessKey", "secretKey") // 本地Moto无需SSL,禁用避免连接失败 .config("spark.hadoop.glue.catalog.ssl.enabled", "false")
3. 调整Delta Lake配置(可选)
若保留Delta Lake功能,建议不替换默认catalog,而是新增独立的Delta catalog,避免与Glue Catalog冲突:
// 移除原DeltaCatalog替换默认的配置,新增独立的delta_catalog .config("spark.sql.catalog.delta_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")
4. 验证连接有效性
启动Spark Session后,执行以下命令确认是否成功连接到Moto Glue:
ss.sql("SHOW DATABASES").show()
若仍无法识别库表,需检查Moto服务是否正常运行、端口9999是否可访问,同时确认Glue客户端创建的资源确实存在于Moto实例中。
内容的提问来源于stack exchange,提问作者Praveen Bhansali

