如何在 Docker 上的 Apache Superset 运行 中为电子邮件报告配置 Celery Worker 和 Beat?
How to configure Celery Worker and Beat for Email Reporting in Apache Superset running on Docker?
我通过 Docker 运行宁超集。我启用了电子邮件报告功能并尝试了一下:
但是,我只收到测试邮件报告。之后我没有收到任何电子邮件。
这是我在 superset_config.py 中的 CeleryConfig:
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='*'),
},
}
documentation 说我需要 运行 芹菜工人并击败。
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'。
如果您想要更深入的了解,here's the commit 功能的完整实施。
如何正确配置celery beat?我该如何调试?
我认为 Celery 需要 运行 在您的超集容器中 - 因此您需要修改 docker 文件和入口点。
但是你真的应该首先守护芹菜,这样你就不必监视和重启芹菜[见how to detect failure and auto restart celery worker and http://docs.celeryproject.org/en/latest/userguide/daemonizing.html]。
请参阅此处的示例,了解如何 运行 docker 中的守护进程芹菜进程:
您还可以将 -B
标志添加到 celery worker 命令以 运行 beat
celery worker --app=superset.tasks.celery_app:app --pool=prefork -O fair -c 4 -B
我设法通过更改 CeleryConfig
实现并向 'docker-compose.yml'
添加节拍服务来解决它
CeleryConfig
class 'superset_config.py' 中的新 CeleryConfig
:
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
我通过 Docker 运行宁超集。我启用了电子邮件报告功能并尝试了一下:
但是,我只收到测试邮件报告。之后我没有收到任何电子邮件。
这是我在 superset_config.py 中的 CeleryConfig:
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='*'),
},
}
documentation 说我需要 运行 芹菜工人并击败。
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'。
如果您想要更深入的了解,here's the commit 功能的完整实施。
如何正确配置celery beat?我该如何调试?
我认为 Celery 需要 运行 在您的超集容器中 - 因此您需要修改 docker 文件和入口点。
但是你真的应该首先守护芹菜,这样你就不必监视和重启芹菜[见how to detect failure and auto restart celery worker and http://docs.celeryproject.org/en/latest/userguide/daemonizing.html]。
请参阅此处的示例,了解如何 运行 docker 中的守护进程芹菜进程:
您还可以将 -B
标志添加到 celery worker 命令以 运行 beat
celery worker --app=superset.tasks.celery_app:app --pool=prefork -O fair -c 4 -B
我设法通过更改 CeleryConfig
实现并向 'docker-compose.yml'
CeleryConfig
class 'superset_config.py' 中的新 CeleryConfig
:
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