如何在单个Presto Catalog中配置多数据库适配Apache Superset?
解决Presto 0.216 + Apache Superset 单Catalog多MySQL数据库查询问题
我之前刚好处理过类似的Presto与Superset集成的场景,你的核心问题是Superset强制使用单个Catalog文件,但你需要在这个Catalog里访问多个MySQL数据库,下面是具体的解决方案:
关键思路
Presto的MySQL连接器其实支持在单个Catalog内挂载同一个MySQL实例下的多个数据库,无需创建多个Catalog文件。你之前的误区在于把每个数据库单独做成一个Catalog,以及错误地使用SHOW SCHEMAS FROM mysql(这里的mysql不是连接器类型,而是Catalog名称)。
具体步骤
1. 修改Superset要求的hive.properties文件
把原来的hive.properties改成MySQL连接器配置,连接到整个MySQL实例而非单个数据库,配置如下:
# 替换hive连接器为mysql连接器 connector.name=mysql # 连接到MySQL实例,不要指定单个数据库,加上必要的JDBC参数 connection-url=jdbc:mysql://myurl:3306/?useSSL=false&useInformationSchema=true # 你的MySQL账号密码 connection-user=your_mysql_username connection-password=your_mysql_password # 开启自动发现数据库(默认可能为true,显式配置更稳妥) auto-discovery.enabled=true # 可选:指定要同步的数据库列表,逗号分隔;不配置的话会同步所有你有权限访问的数据库 schemas=db1,db2,db3
注意:
connection-url末尾不要加单个数据库名,这样Presto才能读取MySQL实例的元数据,把每个数据库识别为该Catalog下的Schema。
2. 重启Presto服务
在AWS Ubuntu实例上,根据你的Presto部署方式重启服务,比如用systemd管理的话:
sudo systemctl restart presto
3. 在Superset中验证查询
- 配置好Presto数据源后,你会看到
hiveCatalog下有多个Schema(对应你的多个MySQL数据库) - 执行跨库查询时,直接用
Schema.Table的格式即可,比如:
SELECT t1.id, t2.name FROM db1.table1 t1 JOIN db2.table2 t2 ON t1.id = t2.foreign_id
解释你之前的错误
你执行SHOW SCHEMAS FROM mysql报错,是因为Presto的Catalog名称是你定义的.properties文件名(比如hive.properties对应Catalog名hive),而connector.name=mysql只是说明该Catalog使用MySQL连接器,不是Catalog的名称。正确的命令应该是SHOW SCHEMAS FROM hive,就能看到所有挂载的数据库了。
额外注意事项
- 确保你的MySQL账号拥有访问所有目标数据库的权限,包括读取
information_schema的权限,否则Presto无法自动发现数据库。 - 如果你的多个MySQL数据库属于不同的MySQL实例,单个Catalog无法直接连接,这时可以在Presto中创建其他Catalog,然后在
hiveCatalog中创建视图映射其他Catalog的表,这样Superset就能通过单个Catalog访问所有数据。
内容的提问来源于stack exchange,提问作者J Selecta
相关产品推荐
相关产品推荐

