将Superset的元数据库配置为MySQL,配置方法见:Superset配置。配置完成后,在启动Superset的时候,出现以下异常信息:
2024-09-01 16:28:36,614:ERROR:flask_appbuilder.security.sqla.manager:DB Creation and initialization failed: (MySQLdb.OperationalError) (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
(Background on this error at: https://sqlalche.me/e/14/e3q8)
Loaded your LOCAL configuration at [/home/zhangjc/github/superset/superset_config.py]
这个错误跟连接MySQL的方式有关,详细信息见:无法连接本地MySQL-CSDN博客。我的连接配置信息如下:
SQLALCHEMY_DATABASE_URI = 'mysql://superset:superset%4001@localhost/superset'
如果想快速解决问题,可将连接串中的localhost改为127.0.0.1。但作为技术人,还是需要深究下。中的描述,连接MySQL用的是mysqlclient驱动,问题可能出现在该驱动上。用以下方式进行验证:
$ python
Python 3.11.9 (main, Aug 28 2024, 23:13:21) [GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>> from MySQLdb import _mysql
>>> db=_mysql.connect(host="localhost",user="superset", password="superset@01", database="superset")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MySQLdb.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
>>> db=_mysql.connect(host="localhost",user="superset", password="superset@01", database="superset", unix_socket='/tmp/mysql.sock')
>>>
从上面的验证可以看出,问题出在mysqlclient默认使用的Unix socket文件与MySQL服务的不同,在指定正确的Unix socket文件后,问题解决。
如何在superset中配置指定MySQL连接的Unix socket文件呢?查看MySQL官方文档,可以看到在连接串中通过socket参数设置。
修改Superset元数据库连接串配置,如下:
SQLALCHEMY_DATABASE_URI = 'mysql://superset:superset%4001@localhost/superset?socket=(/tmp/mysql.sock)'
启动Superset出现以下错误:
$ superset run -p 8088 --with-threads --reload --debugger
Loaded your LOCAL configuration at [/home/zhangjc/github/superset/superset_config.py]
logging was configured successfully
2024-09-05 11:45:16,426:INFO:superset.utils.logging_configurator:logging was configured successfully
2024-09-05 11:45:16,433:INFO:root:Configured event logger of type <class 'superset.utils.log.DBEventLogger'>
/home/zhangjc/frin/python/venvs/superset/lib/python3.11/site-packages/flask_limiter/extension.py:333: UserWarning: Using the in-memory storage for tracking rate limits as no storage was explicitly specified. This is not recommended for production use. See: https://flask-limiter.readthedocs.io#configuring-a-storage-backend for documentation about configuring the storage backend.
warnings.warn(
2024-09-05 11:45:16,438:ERROR:flask_appbuilder.security.sqla.manager:DB Creation and initialization failed: 'socket' is an invalid keyword argument for connect()
说明mysqlclient模块使用的参数名与MySQL文档中的不一致。但查询mysqlclient文档并未发现Unix socket文件参数的说明😂。没办法,只能使用码农基本能力 - 读源代码了😁。原来mysqlclient中的名称是unix_socket:
修改连接串如下:
SQLALCHEMY_DATABASE_URI = 'mysql://superset:superset%4001@localhost/superset?unix_socket=/tmp/mysql.sock'
再次启动Superset,Done!✌️✌️✌️