배경
나는 거대한 텍스트 파일 (~ 30GB)을 처리하기 위해 셀러리 (3.1.8)를 사용하려고합니다. 이 파일들은 fastq 형식으로 약 118M 시퀀싱 "읽기"를 포함하며, 본질적으로 헤더, DNA 시퀀스 및 품질 문자열의 조합입니다. 또한, 이러한 시퀀스는 paired-end sequencing run에서 발생하므로 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 백엔드와 피클을 사용하여 선택한 성능을위한 직렬화뿐만 아니라 은 'transient'대기열 (delivery_mode를 통해)에 디스크에 아무 것도 쓰지 않습니다.
셀러리 시작
셀러리 프레임 워크를 설정하려면, 내가 먼저 고속/tmp를 디스크에 로그 파일을 작성하는 64 방법 상자에서 rabbitmq 서버 (3.2.3, 얼랑 R16B03-1)를 시작합니다. 위와 같은 작업자 프로세스는 클러스터의 각 노드 (약 34 개)에서 총 688 개의 코어에 대해 8-way에서 64-way SMP까지 실행됩니다. 따라서 작업자가 대기열을 처리하는 데 사용할 수있는 많은 CPU가 있습니다. 셀러리가 실행되면
작업 제출/성능
, I는 아래 ipython 노트북을 통해 작업을 제출 :이 읽기의 약 1.5 초 만에 쌍을합니다
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")
. 그럼, 아래와 같이, 20 대 정도 걸립니다 노동자에 제출 그룹에 지연 전화 :
result = g.delay()
이 rabbitmq 콘솔 모니터링, 내가 아니라 거의 충분히 빨리 확인을하고있어 것을 알 수있다.
질문 그래서
이 속도를 높일 수있는 방법이 있나요? 적어도 500 개가 아닌 500,000 개의 읽기 쌍이 초당 처리되는 것을보고 싶습니다. 셀러리 구성에서 내가 빠진 것이 분명합니까? 내 작업자와 토끼 로그는 본질적으로 비어 있습니다. 내 실적을 높이는 방법에 대한 조언을 많이 듣겠다. 각 개인도 꽤 빨리 쌍의 프로세스를 읽어
[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
업이 시점에
이 시점에, 나는 모든 봤 한 최대그래서 내가 셀러리, 성능, 라우팅, rabbitmq 등으로 생각할 수 셀러리 웹 사이트와 문서를 살펴 봤습니다. 성능을 더 높일 수 없다면이 방법을 포기해야합니다. 기본적으로 작업을 여러 개의 작은 실제 파일로 나눠서 다중 처리 등으로 각 계산 노드에서 직접 처리합니다.하지만이로드를 클러스터에 퍼뜨릴 수없는 것은 수치 스럽습니다. 게다가, 이것은 절묘하게 우아한 해결책처럼 보입니다.
미리 도움을 청하십시오! 당신이
해야한다. 연결을 다시 사용하기 시작하면 게시 속도가 2 배 증가했습니다. 사용중인 라이브러리에 익숙하지 않지만 연결을 다시 사용하는지 확인하십시오. – Basic
셀러리에는 [기본 브로커 풀] (http://docs.celeryproject.org/en/latest/configuration.html#std)이 있습니다. : 설정 -BROKER_POOL_LIMIT). 나는 그것을 증가시키고 어떤 일이 일어나는지 보려고 노력할 것이다. –
'BROKER_POOL_LIMIT = 1000'을 추가하고 직원들을 반송했습니다. 불행히도, 어떤 차이를 만들지 않았다. –