我正在使用开放式语义搜索(OSS),并且我想使用Flower tool来监视其过程。 its website
上应按照OSS的说明提供Celery所需的工作人员工作人员将执行诸如分析和索引排队文件之类的任务。这些工作程序由etl / tasks.py实现,并会在服务opensemanticsearch启动时自动启动。
此task.py文件如下所示:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# Queue tasks for batch processing and parallel processing
#
# Queue handler
from celery import Celery
# ETL connectors
from etl import ETL
from etl_delete import Delete
from etl_file import Connector_File
from etl_web import Connector_Web
from etl_rss import Connector_RSS
verbose = True
quiet = False
app = Celery('etl.tasks')
app.conf.CELERYD_MAX_TASKS_PER_CHILD = 1
etl_delete = Delete()
etl_web = Connector_Web()
etl_rss = Connector_RSS()
#
# Delete document with URI from index
#
@app.task(name='etl.delete')
def delete(uri):
etl_delete.delete(uri=uri)
#
# Index a file
#
@app.task(name='etl.index_file')
def index_file(filename, wait=0, config=None):
if wait:
time.sleep(wait)
etl_file = Connector_File()
if config:
etl_file.config = config
etl_file.index(filename=filename)
#
# Index file directory
#
@app.task(name='etl.index_filedirectory')
def index_filedirectory(filename):
from etl_filedirectory import Connector_Filedirectory
connector_filedirectory = Connector_Filedirectory()
result = connector_filedirectory.index(filename)
return result
#
# Index a webpage
#
@app.task(name='etl.index_web')
def index_web(uri, wait=0, downloaded_file=False, downloaded_headers=[]):
if wait:
time.sleep(wait)
result = etl_web.index(uri, downloaded_file=downloaded_file, downloaded_headers=downloaded_headers)
return result
#
# Index full website
#
@app.task(name='etl.index_web_crawl')
def index_web_crawl(uri, crawler_type="PATH"):
import etl_web_crawl
result = etl_web_crawl.index(uri, crawler_type)
return result
#
# Index webpages from sitemap
#
@app.task(name='etl.index_sitemap')
def index_sitemap(uri):
from etl_sitemap import Connector_Sitemap
connector_sitemap = Connector_Sitemap()
result = connector_sitemap.index(uri)
return result
#
# Index RSS Feed
#
@app.task(name='etl.index_rss')
def index_rss(uri):
result = etl_rss.index(uri)
return result
#
# Enrich with / run plugins
#
@app.task(name='etl.enrich')
def enrich(plugins, uri, wait=0):
if wait:
time.sleep(wait)
etl = ETL()
etl.read_configfile('/etc/opensemanticsearch/etl')
etl.read_configfile('/etc/opensemanticsearch/enhancer-rdf')
etl.config['plugins'] = plugins.split(',')
filename = uri
# if exist delete protocoll prefix file://
if filename.startswith("file://"):
filename = filename.replace("file://", '', 1)
parameters = etl.config.copy()
parameters['id'] = uri
parameters['filename'] = filename
parameters, data = etl.process (parameters=parameters, data={})
return data
#
# Read command line arguments and start
#
#if running (not imported to use its functions), run main function
if __name__ == "__main__":
from optparse import OptionParser
parser = OptionParser("etl-tasks [options]")
parser.add_option("-q", "--quiet", dest="quiet", action="store_true", default=False, help="Don\'t print status (filenames) while indexing")
parser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False, help="Print debug messages")
(options, args) = parser.parse_args()
if options.verbose == False or options.verbose==True:
verbose = options.verbose
etl_delete.verbose = options.verbose
etl_web.verbose = options.verbose
etl_rss.verbose = options.verbose
if options.quiet == False or options.quiet==True:
quiet = options.quiet
app.worker_main()
我阅读了多篇有关Celery的教程,据我了解,这条线应该可以完成
celery -A etl.tasks flower
但不是。结果是语句
错误:无法加载celery应用程序。找不到模块etl。
与
相同celery -A etl.tasks worker --loglevel=debug
所以芹菜本身似乎是在引起麻烦,而不是开花。我也尝试过celery-一个etl.index_filedirectory工人--loglevel = debug,但结果相同。
我想念什么?我是否必须告诉Celery在哪里可以找到etl.tasks?在线研究并没有真正显示出类似的情况,大多数“未找到模块”错误似乎是在导入内容时发生的。因此,这可能是一个愚蠢的问题,但我在任何地方都找不到解决方案。我希望你们能帮助我。不幸的是,我要等到星期一才能回复,请先抱歉。
答案 0 :(得分:0)
我遇到了同样的问题,我按照以下步骤安装并配置了队列,并且可以正常工作。
安装RabbitMQ
MacOS
brew install rabbitmq
sudo vim ~/.bash_profile
在bash_profile
中添加以下行:
PATH=$PATH:/usr/local/sbin
然后更新bash_profile
:
sudo source ~/.bash_profile
Linux
sudo apt-get install rabbitmq-server
配置RabbitMQ
启动队列:
sudo rabbitmq-server
在另一个终端中,配置队列:
sudo rabbitmqctl add_user myuser mypassword
sudo rabbitmqctl add_vhost myvhost
sudo rabbitmqctl set_user_tags myuser mytag
sudo rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*"
启动芹菜
我建议进入包含task.py
的文件夹,并使用以下命令:
celery -A task worker -l info -Q celery
答案 1 :(得分:0)
尝试export PYTHONPATH=<parent directory>
,其中父目录是etl
所在的文件夹。运行Celery worker,看看是否可以解决您的问题。这可能是最常见的Celery“问题”之一(不是真正的Celery,而是Python)。或者,从该文件夹运行Celery worker。
答案 2 :(得分:0)
请注意,此错误意味着两件事:
要检查不是后者,请运行:
python -c "import <myModuleContainingTasksDotPyFile>"
在此问题中:
python -c "import etl"
如果它崩溃了,请先解决此问题(与芹菜不同,您会得到详细的错误消息)。
答案 3 :(得分:0)
MacOS Catalina的答案:
使用pip(pip install celery
)安装celery时,python可以import celery
,但由于终端不知道celery可执行文件,因此无法从终端启动celery。
将芹菜添加到修复路径中:
nano ~/.bash_profile
在文件中添加:export PATH="/Users/gavinbelson/Library/Python/2.7/bin:$PATH"
要将文件保存在nano编辑器中:ctrl + o,然后输入,然后按ctrl + x
要使用您的更改类型更新终端:source ~/.bash_profile
现在您应该可以在终端窗口中输入celery
----请注意,这是针对运行版本2.7的默认python
终端命令的。如果您使用python3
来运行python,则需要相应地更改路径变量