如何在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

