Celeryによる非同期クエリ
Celery
大規模な分析データベースでは、数分から数時間かかるクエリを実行することが一般的です。通常のWebリクエストのタイムアウト(30〜60秒)を超える長時間実行されるクエリをサポートするには、Superset用の非同期バックエンドを構成する必要があります。これは以下で構成されます。
- 1つまたは複数のSupersetワーカー(Celeryワーカーとして実装されます)。これは、celery workerコマンドで開始でき、関連オプションを表示するにはcelery worker --helpを実行します。
- Celeryブローカー(メッセージキュー)。RedisまたはRabbitMQを使用することをお勧めします。
- ワーカーがクエリ結果を永続化する場所を定義する結果バックエンド
Celeryを構成するには、superset_config.pyでCELERY_CONFIGを定義する必要があります。ワーカープロセスとWebサーバープロセスの両方が同じ構成を持つ必要があります。
class CeleryConfig(object):
    broker_url = "redis://:6379/0"
    imports = (
        "superset.sql_lab",
        "superset.tasks.scheduler",
    )
    result_backend = "redis://:6379/0"
    worker_prefetch_multiplier = 10
    task_acks_late = True
    task_annotations = {
        "sql_lab.get_sql_results": {
            "rate_limit": "100/s",
        },
    }
CELERY_CONFIG = CeleryConfig
構成を利用するようにCeleryワーカーを開始するには、次のコマンドを実行します。
celery --app=superset.tasks.celery_app:app worker --pool=prefork -O fair -c 4
定期的なバックグラウンドジョブをスケジュールするジョブを開始するには、次のコマンドを実行します。
celery --app=superset.tasks.celery_app:app beat
結果バックエンドを設定するには、flask_caching.backends.baseから派生したBaseCacheのインスタンスをsuperset_config.pyのRESULTS_BACKEND構成キーに渡す必要があります。Memcached、Redis、S3(https://pypi.python.org/pypi/s3werkzeugcache)、メモリ、またはファイルシステム(シングルサーバータイプのセットアップまたはテスト用)を使用するか、独自のキャッシュインターフェースを作成することができます。superset_config.pyは次のようになる場合があります。
# On S3
from s3cache.s3cache import S3Cache
S3_CACHE_BUCKET = 'foobar-superset'
S3_CACHE_KEY_PREFIX = 'sql_lab_result'
RESULTS_BACKEND = S3Cache(S3_CACHE_BUCKET, S3_CACHE_KEY_PREFIX)
# On Redis
from flask_caching.backends.rediscache import RedisCache
RESULTS_BACKEND = RedisCache(
    host='localhost', port=6379, key_prefix='superset_results')
パフォーマンス向上のため、MessagePackとPyArrowが結果のシリアル化に使用されるようになりました。superset_config.pyでRESULTS_BACKEND_USE_MSGPACK = Falseを設定することにより、問題が発生した場合に無効にできます。既存の環境をアップグレードする際は、既存の結果キャッシュストアをクリアしてください。
重要な注意点
- 
Supersetクラスター内のすべてのワーカーノードとWebサーバーが、共通のメタデータデータベースを共有することが重要です。つまり、SQLiteは同時実行のサポートが限られており、通常はローカルファイルシステムにあるため、このコンテキストでは機能しません。 
- 
設定全体でcelery beatのインスタンスが1つだけ実行されている必要があります。そうしないと、バックグラウンドジョブが複数回スケジュールされ、レポートの重複配信、予想以上の負荷/トラフィックなどの奇妙な動作が発生する可能性があります。 
- 
SQL Labは、データベース設定([ソース] > [データベース] > [レコードの編集])で非同期クエリ実行を有効にした場合にのみ、クエリを非同期で実行します。 
Celery Flower
Flowerは、pipからインストールできるCeleryクラスターを監視するためのWebベースのツールです。
pip install flower
flowerは次を使用して実行できます。
celery --app=superset.tasks.celery_app:app flower