Как настроить Celery Worker и Beat для отправки отчетов по электронной почте в Apache Superset, работающем на Docker?

Я запускаю Superset через Docker. Я включил функцию отчета по электронной почте и попробовал:

image

Однако я получаю только тестовый отчет по электронной почте. После этого я не получаю никаких писем.

Это мой CeleryConfig в superset_config.py:

class CeleryConfig(object):
    BROKER_URL = 'sqla+postgresql://superset:superset@db:5432/superset'
    CELERY_IMPORTS = (
        'superset.sql_lab',
        'superset.tasks',
    )
    CELERY_RESULT_BACKEND = 'db+postgresql://superset:superset@db:5432/superset'
    CELERYD_LOG_LEVEL = 'DEBUG'
    CELERYD_PREFETCH_MULTIPLIER = 10
    CELERY_ACKS_LATE = True
    CELERY_ANNOTATIONS = {
        'sql_lab.get_sql_results': {
            'rate_limit': '100/s',
        },
        'email_reports.send': {
            'rate_limit': '1/s',
            'time_limit': 120,
            'soft_time_limit': 150,
            'ignore_result': True,
        },
    }
    CELERYBEAT_SCHEDULE = {
        'email_reports.schedule_hourly': {
            'task': 'email_reports.schedule_hourly',
            'schedule': crontab(minute=1, hour='*'),
        },
    }

В документации написано, что мне нужно запустить сельдерей и взбить.

celery worker --app=superset.tasks.celery_app:app --pool=prefork -O fair -c 4
celery beat --app=superset.tasks.celery_app:app

Я добавил их в 'docker-compose.yml ':

superset-worker:
    build: *superset-build
    command: >
      sh -c "celery worker --app=superset.tasks.celery_app:app -Ofair -f /app/celery_worker.log &&
             celery beat --app=superset.tasks.celery_app:app -f /app/celery_beat.log"
    env_file: docker/.env
    restart: unless-stopped
    depends_on: *superset-depends-on
    volumes: *superset-volumes

Celery Worker действительно работает при отправке первого письма. Также отображается файл журнала. Тем не менее, сельдерей, похоже, не работает. Также не создается celery_beat.log.

Если вам нужна более глубокая информация, вот коммит с полная реализация функционала.

Как правильно настроить ритм сельдерея? Как я могу это отладить?


person Snow    schedule 20.04.2020    source источник


Ответы (3)


Мне удалось решить эту проблему, изменив реализацию CeleryConfig и добавив службу битов в docker-compose.yml.

Новый класс CeleryConfig в superset_config.py:

REDIS_HOST = get_env_variable("REDIS_HOST")
REDIS_PORT = get_env_variable("REDIS_PORT")

class CeleryConfig(object):
    BROKER_URL = "redis://%s:%s/0" % (REDIS_HOST, REDIS_PORT)
    CELERY_IMPORTS = (
        'superset.sql_lab',
        'superset.tasks',
    )
    CELERY_RESULT_BACKEND = "redis://%s:%s/1" % (REDIS_HOST, REDIS_PORT)
    CELERY_ANNOTATIONS = {
        'sql_lab.get_sql_results': {
            'rate_limit': '100/s',
        },
        'email_reports.send': {
            'rate_limit': '1/s',
            'time_limit': 120,
            'soft_time_limit': 150,
            'ignore_result': True,
        },
    }
    CELERY_TASK_PROTOCOL = 1
    CELERYBEAT_SCHEDULE = {
        'email_reports.schedule_hourly': {
            'task': 'email_reports.schedule_hourly',
            'schedule': crontab(minute='1', hour='*'),
        },
    }

Изменения в docker-compose.yml:

  superset-worker:
    build: *superset-build
    command: ["celery", "worker", "--app=superset.tasks.celery_app:app", "-Ofair"]
    env_file: docker/.env
    restart: unless-stopped
    depends_on: *superset-depends-on
    volumes: *superset-volumes

  superset-beat:
    build: *superset-build
    command: ["celery", "beat", "--app=superset.tasks.celery_app:app", "--pidfile=", "-f", "/app/celery_beat.log"]
    env_file: docker/.env
    restart: unless-stopped
    depends_on: *superset-depends-on
    volumes: *superset-volumes
person Snow    schedule 12.05.2020

Я считаю, что Celery должен запускаться внутри вашего контейнера суперсета, поэтому вам нужно изменить свой файл докеров и точку входа.
НО вам действительно нужно сначала демонизировать сельдерей, чтобы вам не приходилось отслеживать и перезапускать сельдерей [см. как обнаружить сбой и автоматически перезапустить celery worker и http://docs.celeryproject.org/en/latest/userguide/daemonizing.html].
См. здесь пример того, как запустить демонизированный процесс сельдерея в докере: ​​Docker - Celery как демон - файлы pidfiles не найдены

person David Tobiano    schedule 21.04.2020

вы также можете добавить флаг -B к команде celery worker для запуска beat

celery worker --app=superset.tasks.celery_app:app --pool=prefork -O fair -c 4 -B
person Ryabchenko Alexander    schedule 12.05.2020
comment
это не рекомендуется в производстве, когда у вас несколько рабочих - person Snow; 12.05.2020
comment
Лучше, чем две отдельные команды / процессы в докере. У меня 1,5 года -Б в прод, все нормально. - person Ryabchenko Alexander; 12.05.2020
comment
сколько рабочих у вас работает? В документах говорится, что вы также можете встроить бит внутри рабочего, включив параметр worker -B, это удобно, если вы никогда не запускаете более одного рабочего узла, но он обычно не используется и по этой причине не рекомендуется для производственного использования - person Snow; 12.05.2020
comment
Если у вас только один воркер, это нормально, но вы не должны использовать -B для нескольких воркеров. - person Snow; 12.05.2020
comment
было 6 контейнеров с разными параметрами для рабочих, и один из них был с опцией -B, и все работает нормально - person Ryabchenko Alexander; 12.05.2020
comment
@RyabchenkoAlexander нужна помощь в настройке почты, вы можете помочь? - person Aditya Verma; 15.12.2020