メインコンテンツへスキップ
GitHubでこのページを編集

Celeryによる非同期クエリ

Celery

大規模な分析データベースでは、数分から数時間かかるクエリを実行することが一般的です。通常のWebリクエストのタイムアウト(30〜60秒)を超える長時間実行されるクエリをサポートするには、Superset用の非同期バックエンドを構成する必要があります。これは以下で構成されます。

  • 1つまたは複数のSupersetワーカー(Celeryワーカーとして実装されます)。これは、celery workerコマンドで開始でき、関連オプションを表示するにはcelery worker --helpを実行します。
  • Celeryブローカー(メッセージキュー)。RedisまたはRabbitMQを使用することをお勧めします。
  • ワーカーがクエリ結果を永続化する場所を定義する結果バックエンド

Celeryを構成するには、superset_config.pyCELERY_CONFIGを定義する必要があります。ワーカープロセスとWebサーバープロセスの両方が同じ構成を持つ必要があります。

class CeleryConfig(object):
broker_url = "redis://localhost:6379/0"
imports = (
"superset.sql_lab",
"superset.tasks.scheduler",
)
result_backend = "redis://localhost: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.pyRESULTS_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')

パフォーマンス向上のため、MessagePackPyArrowが結果のシリアル化に使用されるようになりました。superset_config.pyRESULTS_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