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

如何在Apache Kyuubi中通过JDBC URL指定Spark配置执行SQL查询?

问题

在使用Apache Kyuubi(基于Apache Spark)执行SQL查询时,希望为每个查询设置不同的Spark配置(包括driver核心数/内存、executor核心数/内存/实例数),且无需重启Kyuubi和Spark生效。计划通过Kyuubi的JDBC连接URL指定配置,为每个查询创建新的Spark应用与Driver,但配置后SQLAlchemy将配置参数识别为Schema名称的一部分,报错如下:

Schema [SALES;#spark.executor.memory=4g;spark.executor.cores=2;spark.executor.instances=2;spark.driver.memory=4g;spark.driver.cores=2;spark.app.name=naming_test_1696497965.1731281] does not exist, or user admin does not have access to it.

其中SALES是Schema名称,出错的Python代码如下:

pool_args = {'connect_args': {'auth': 'LDAP', 'username': self.arguments.kyuubi_username, 'password': self.arguments.kyuubi_password},
             'echo': False, 'echo_pool': True}
spark_config = {
        'spark.executor.memory': '4g',
        'spark.executor.cores': '2',
        'spark.executor.instances': '2',
        'spark.driver.memory': '4g',
        'spark.driver.cores': '2',
        'spark.app.name': 'naming_test_' + str(time.time()),
    }
connection_url = self.arguments.kyuubi_url + ';#' + ';'.join([f'{k}={v}' for k, v in spark_config.items()])
self.engine = sql.create_engine(connection_url, **pool_args)
解决方案

错误原因

你错误地将Kyuubi的Spark配置参数直接用;#拼接在JDBC URL末尾,导致SQLAlchemy把;#后面的所有内容都当成了Schema名称的一部分,而非Kyuubi的配置参数。

正确配置方式

方式1:通过SQLAlchemy的connect_args传递配置(推荐)

SQLAlchemy的Kyuubi/JDBC驱动支持将Spark配置放在connect_args的properties字段中,避免和URL中的Schema信息混淆:

pool_args = {
    'connect_args': {
        'auth': 'LDAP',
        'username': self.arguments.kyuubi_username,
        'password': self.arguments.kyuubi_password,
        'properties': {
            'spark.executor.memory': '4g',
            'spark.executor.cores': '2',
            'spark.executor.instances': '2',
            'spark.driver.memory': '4g',
            'spark.driver.cores': '2',
            'spark.app.name': 'naming_test_' + str(time.time())
        }
    },
    'echo': False,
    'echo_pool': True
}
# 直接使用原始Kyuubi URL,无需拼接配置
self.engine = sql.create_engine(self.arguments.kyuubi_url, **pool_args)

方式2:修正URL拼接格式(不推荐)

如果一定要通过URL传递参数,需使用JDBC标准的?分隔符,用&连接多个配置项,而非;#和;:

spark_config_str = '&'.join([f'{k}={v}' for k, v in spark_config.items()])
connection_url = f"{self.arguments.kyuubi_url}?{spark_config_str}"
self.engine = sql.create_engine(connection_url, **pool_args)

注意:这种方式可能和JDBC原生参数冲突,优先选择第一种方式。

关键说明

  • Kyuubi 1.0+版本支持通过JDBC连接的properties传递Spark配置,这些配置会用于创建新的Spark应用,无需重启Kyuubi服务。
  • 确保配置的参数属于Spark允许在启动时设置的范畴(如driver/executor资源配置),这类参数无法在Driver创建后修改,通过连接参数传递正好匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:43:18