Skip to main content

缓存

Superset 使用 Flask-Caching 来处理缓存需求。 Flask-Caching 支持多种缓存后端,包括 Redis(推荐)、Memcached、 SimpleCache(内存中)或本地文件系统。 自定义缓存后端 也得到支持。

可以通过在 superset_config.py 文件中提供字典来配置缓存, Flask-Caching 的配置规范

以下缓存配置可以以这种方式进行定制:

  • 仪表板过滤状态(必需):FILTER_STATE_CACHE_CONFIG
  • 探索图表表单数据(必需):EXPLORE_FORM_DATA_CACHE_CONFIG
  • 元数据缓存(可选):CACHE_CONFIG
  • 从数据集查询的图表数据(可选):DATA_CACHE_CONFIG

例如,使用 Redis 配置过滤状态缓存:

FILTER_STATE_CACHE_CONFIG = {
'CACHE_TYPE': 'RedisCache',
'CACHE_DEFAULT_TIMEOUT': 86400,
'CACHE_KEY_PREFIX': 'superset_filter_cache',
'CACHE_REDIS_URL': 'redis://localhost:6379/0'
}

依赖项

为了使用专用缓存存储,必须安装额外的 Python 库。

  • 对于 Redis:我们推荐使用 redis Python包
  • 对于 Memcached:我们建议使用 pylibmc客户端库, 因为 python-memcached 不能正确处理存储二进制数据。

这些库可以使用pip进行安装。

备用元存储缓存

请注意,某种程度上的 Filter State 和 Explore 缓存是必需的。如果这些缓存中的任何一个未定义, Superset 会回退到使用内置缓存,该缓存在元数据库中存储数据。虽然推荐使用专用缓存, 但内置缓存也可以用于缓存其他数据。

例如,要使用内置缓存来存储图表数据,可以使用以下配置:

DATA_CACHE_CONFIG = {
"CACHE_TYPE": "SupersetMetastoreCache",
"CACHE_KEY_PREFIX": "superset_results", # make sure this string is unique to avoid collisions
"CACHE_DEFAULT_TIMEOUT": 86400, # 60 seconds * 60 minutes * 24 hours
}

图表缓存超时

图表的缓存超时可以通过单个图表、数据集或数据库的设置进行覆盖。在回退到在 DATA_CACHE_CONFIG 中定义的默认值之前, 将检查所有这些配置。

请注意,通过将缓存超时设置为 -1,可以禁用图表数据的缓存,无论是针对每个图表、数据集或数据库,还是作为默认值在 DATA_CACHE_CONFIG 中设置。

SQL Lab 查询结果

当启用异步查询时,SQL Lab 查询结果的缓存是使用的,并且使用 RESULTS_BACKEND 进行配置。

请注意,此配置不使用 flask-caching 字典进行配置,而是需要一个 cachelib 对象。

详细信息请参阅通过 Celery 的异步查询

缓存缩略图

这是一个可选功能,可以通过在配置中激活其功能标志来开启:

FEATURE_FLAGS = {
"THUMBNAILS": True,
"THUMBNAILS_SQLA_LISTENERS": True,
}

默认情况下,缩略图按用户渲染,并且对于匿名用户将回退到 Selenium 用户。 要始终以固定用户(例如admin)渲染缩略图,请使用以下配置:

from superset.tasks.types import ExecutorType

THUMBNAIL_SELENIUM_USER = "admin"
THUMBNAIL_EXECUTE_AS = [ExecutorType.SELENIUM]

对于此功能,您需要一个 cache system 和 celery workers。 所有缩略图都存储在缓存中,并由 workers 异步处理。

一个示例配置,其中 images 存储在 S3 上可能是:

from flask import Flask
from s3cache.s3cache import S3Cache

...

class CeleryConfig(object):
broker_url = "redis://localhost:6379/0"
imports = (
"superset.sql_lab",
"superset.tasks.thumbnails",
)
result_backend = "redis://localhost:6379/0"
worker_prefetch_multiplier = 10
task_acks_late = True


CELERY_CONFIG = CeleryConfig

def init_thumbnail_cache(app: Flask) -> S3Cache:
return S3Cache("bucket_name", 'thumbs_cache/')


THUMBNAIL_CACHE_CONFIG = init_thumbnail_cache
# Async selenium thumbnail task will use the following user
THUMBNAIL_SELENIUM_USER = "Admin"

使用上述示例,仪表板的缓存键将是 superset_thumb__dashboard__{ID}。您可以 使用以下方式覆盖 Selenium 的基本 URL:

WEBDRIVER_BASEURL = "https://superset.company.com"

selenium web driver 的额外配置可以使用 WEBDRIVER_CONFIGURATION 设置。您可以 实现一个自定义函数来认证 Selenium。默认函数使用 flask-login 会话 cookie。 这里有一个自定义函数签名的例子:

def auth_driver(driver: WebDriver, user: "User") -> WebDriver:
pass

然后在配置中:

WEBDRIVER_AUTH_FUNC = auth_driver