背景
我正在研究使用芹菜(3.1.8)處理每個巨大的文本文件(〜30GB)。這些文件格式爲fastq,包含大約118M測序「讀取」,基本上它們是標題,DNA序列和質量字符串的組合。此外,這些序列來自雙端測序運行,所以我同時迭代兩個文件(通過itertools.izip)。我希望能夠做的就是讀取每一對讀取數據,將它們發送到一個隊列,然後讓它們在我們集羣中的一臺機器上處理(不關心它們)以返回已清理的版本如果清潔需要發生(例如,基於質量)。使用芹菜來處理巨大的文本文件
我已經成立了芹菜和RabbitMQ的,和我的工作人員都推出如下:
celery worker -A tasks --autoreload -Q transient
和配置,如:
from kombu import Queue
BROKER_URL = 'amqp://[email protected]'
CELERY_RESULT_BACKEND = 'rpc'
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'pickle'
CELERY_ACCEPT_CONTENT=['pickle', 'json']
CELERY_TIMEZONE = 'America/New York'
CELERY_ENABLE_UTC = True
CELERYD_PREFETCH_MULTIPLIER = 500
CELERY_QUEUES = (
Queue('celery', routing_key='celery'),
Queue('transient', routing_key='transient',delivery_mode=1),
)
我選擇使用的RPC後端和鹹菜序列化的性能,以及不在 寫入任何內容到'瞬時'隊列中的磁盤(通過delivery_mode)。
芹菜啓動
要設置芹菜框架,我首先發動對64路框中的RabbitMQ服務器(3.2.3,二郎R16B03-1),寫入日誌文件,以快速的/ tmp磁盤。在羣集上的每個節點(大約34個)上啓動工作進程(如上所述),範圍從8路到64路SMP,總共688個內核。所以,我有大量可用的CPU供工作人員用來處理隊列。
作業提交/性能
芹菜一旦啓動並運行,我通過如下一個IPython的筆記本電腦提交作業:
files = [foo, bar]
f1 = open(files[0])
f2 = open(files[1])
res = []
count = 0
for r1, r2 in izip(FastqGeneralIterator(f1), FastqGeneralIterator(f2)):
count += 1
res.append(tasks.process_read_pair.s(r1, r2))
if count == 10000:
break
t.stop()
g = group(res)
for task in g.tasks:
task.set(queue="transient")
這需要大約1.5秒的一對萬雙讀取。然後,我呼籲延遲對集團提交給工人,大約需要20秒,如下圖所示:
result = g.delay()
與RabbitMQ的控制檯監視,我知道我在做的不錯,但幾乎沒有足夠快。
問題
那麼,有沒有什麼辦法可以加快這個嗎?我的意思是,我希望每秒處理至少50000個讀取對,而不是500個。在我的芹菜配置中是否有什麼明顯的缺失?我的工人和兔子日誌本質上是空的。會喜歡一些關於如何提升我的表現的建議。每個人對閱讀的過程相當快,太:
[2014-01-29 13:13:06,352: INFO/Worker-1] tasks.process_read_pair[95ec7f2f-0143-455a-a23b-c032998951b8]: HWI-ST425:143:C04A5ACXX:3:1101:13938:2894 1:N:0:ACAGTG HWI-ST425:143:C04A5ACXX:3:1101:13938:2894 2:N:0:ACAGTG 0.00840497016907 sec
到目前爲止
所以到這一點,我GOOGLE了所有我能想到的有芹菜,性能,路由,RabbitMQ的,等我已經瀏覽了芹菜網站和文檔。如果我不能獲得更高的性能,我將不得不放棄這種方法,轉而使用另一種解決方案(基本上將工作劃分爲許多較小的物理文件,並使用多處理或其他方式直接在每個計算節點上處理它們)。但是,如果不能在集羣上傳播這些負載,那將是一件令人遺憾的事情。另外,這看起來像是一個精緻優雅的解決方案。
在此先感謝您的幫助!你有
我用的RabbitMQ,發現我的性能瓶頸,從一個封閉的法案開始/重啓每個消息隊列的連接。一旦我開始重新使用連接,發佈率提高了2個數量級。我不熟悉你正在使用的庫,但檢查它是否重用連接 – Basic
是的,芹菜有一個[默認代理池](http://docs.celeryproject.org/en/latest/configuration.html#std :設置 - BROKER_POOL_LIMIT)。我會嘗試增加它,看看會發生什麼。 –
增加了'BROKER_POOL_LIMIT = 1000'並彈跳了我的工人。不幸的是,沒有任何區別。 –