2022년 7월 8일 금요일

개미지옥과 같은 파일 복사 작업, 그리고 8시간 20분이 걸린 KRAKEN 2 standard DB 구축

파일의 수가 많으면 복사하는데 많은 시간이 걸린다. 계산작업용 서버에 보관 중이던 파일을 DAS로 rsync를 하는 중인데, dRep과 같이 pairwase comparison에 의해 만들어진 수많은 파일을 복사하면서 '차라리 tar로 묶어서 보낼 것을..'하는 후회를 하고 있다. 뿐만 아니라 어제부터 시작한 KRAKEN 2 standard database 설치 작업도 꼬박 하루를 넘기고 있다.

KRAKEN 2 standard database를 만드는 스크립트('kraken2-build --standard --db $DBNAME')를 실행하다가 'rsync_from_ncbi.pl: unexpected FTP path (new server?)'라는 에러가 발생하였다. 이는 KRAKEN 2 wiki의 FAQ 문서(링크)에도 나올 정도로 잘 알려져 있는데, 아직 완벽한 해결책이 나오지 않은 것 같다. 검색을 거듭하여 다음의 두 웹문서에 나온 방법을 참고하여 스크립트를 수정하니 겨우 에러 없이 파일 다운로드가 진행되었다.

KRAKEN 2 DB를 만드는 중에 화면에 표시되는 사항을 기록해 보았다. 신통치 못한 리눅스 머신에서 소요된 공식 시간은 8시간 20분이라고 나오지만(Intel Xeon CPU E5-2630 v3 @2.40GHz, 24 thread, 메모리 256GB), 중간에 'y'를 타이핑하기를 기다리는 상태로 밤새도록 진행이 되지 않았기에 실제로는 만 하루가 조금 더 걸렸다. 정말 소중하게 만든 DB라서 꼭꼭 숨겨놓을 것이 아니라 남에게 나누어 주고 싶다.

$ kraken2-build --standard --threads 24 --db MY_KRAKEN2_DB_20220707
Step 1/2: Performing rsync file transfer of requested files
Rsync file transfer complete.
Step 2/2: Assigning taxonomic IDs to sequences
Processed 459 projects (804 sequences, 1.26 Gbp)... done.
All files processed, cleaning up extra sequence files... done, library complete.
Masking low-complexity regions of downloaded library... done.
Step 1/2: Performing rsync file transfer of requested files
Rsync file transfer complete.
Step 2/2: Assigning taxonomic IDs to sequences
Processed 32062 projects (75757 sequences, 133.68 Gbp)... done.
All files processed, cleaning up extra sequence files... done, library complete.
Masking low-complexity regions of downloaded library... done.
Step 1/2: Performing rsync file transfer of requested files
Rsync file transfer complete.
Step 2/2: Assigning taxonomic IDs to sequences
Processed 11665 projects (14554 sequences, 464.18 Mbp)... done.
All files processed, cleaning up extra sequence files... done, library complete.
Masking low-complexity regions of downloaded library... done.
Downloading plasmid files from FTP... done.
Masking low-complexity regions of downloaded library... done.
mv: try to overwrite `assembly_summary.txt', overriding mode 0444 (r--r--r--)? y
Step 1/2: Performing rsync file transfer of requested files
Rsync file transfer complete.
Step 2/2: Assigning taxonomic IDs to sequences
Processed 1 project (705 sequences, 3.30 Gbp)... done.
All files processed, cleaning up extra sequence files... done, library complete.
Downloading UniVec_Core data from server... done.
Adding taxonomy ID of 28384 to all sequences... done.
Masking low-complexity regions of downloaded library... done.
Creating sequence ID to taxonomy ID map (step 1)...
Found 43829/43864 targets, searched through 839137274 accession IDs, search complete.
lookup_accession_numbers: 35/43864 accession numbers remain unmapped, see unmapped.txt in DB directory
Sequence ID to taxonomy ID map complete. [3m7.052s]
Estimating required capacity (step 2)...
Estimated hash table requirement: 62886222992 bytes
Capacity estimation complete. [20m56.119s]
Building database files (step 3)...
Taxonomy parsed and converted.
CHT created with 16 bits reserved for taxid.
Completed processing of 138785 sequences, 142856031428 bp
Writing data to disk...  complete.
Database files completed. [7h56m29.344s]
Database construction complete. [Total: 8h20m32.627s]
$ du -sh MY_KRAKEN2_DB_20220707/
228G	MY_KRAKEN2_DB_20220707/

NCBI BLAST DB 설치 역시 대단한 인내심을 요구한다. nt-nucl-metadata.jason 파일을 가져다가 다운로드할 파일의 FTP full path를 추출하여 전부 wget(parallel)으로 받은 뒤, md5 checksum을 확인해 보았다. 그런데 nt database를 구성하는 69개(2022년 7월 4일 기준) 파일 중 해시 값이 일치하는 것이 거의 없지 않은가? 접속이 원활하지 않아 끊어진 경우, 바로 다음 파일의 전송을 시도해서 그러는 것인지? '-c(--continue)'에 재시도 회수를 지정하면 더 나을지는 모를 일이다. 

파일을 가져오는 더 안전한 방법은 rsync를 쓰는 것이다. 찾아보니 rsync와 parallel을 함께 사용하여 BLAST DB를 다운로드하는 방법(링크)이 있었다. 방법을 소개하자면 다음과 같다. 

$ rsync --list-only rsync://ftp.ncbi.nlm.nih.gov/blast/db/nt*.gz | grep '.tar.gz' | head -n 1
-rw-r--r--  4,310,538,146 2022/07/05 02:51:08 nt.00.tar.gz
$ rsync --list-only rsync://ftp.ncbi.nlm.nih.gov/blast/db/nt*.gz | grep '.tar.gz' | awk '{print "ftp.ncbi.nlm.nih.gov/blast/db/" $NF}' > nt.links.list
$ head -n 1 nt.links.list 
ftp.ncbi.nlm.nih.gov/blast/db/nt.00.tar.gz
$ cat nt.links.list | parallel -j4 'rsync -h --progress rsync://{} .'

awk 명령어에서 '{print $NF}'는 입력물의 마지막 컬럼을 출력하게 해 준다. $1, $2,... $n이 각 컬럼을 가리키는 변수이므로, 컬럼의 수를 나타내는 awk 변수인 NF에 '$'를 씌워서 $NF라고 적으면 마지막 컬럼에 해당한다. 만약 '{print $(NF-1)}'라고 명령하면 마지막 직전의 컬럼을 인쇄한다.  

이를 이용하여 69개 파일을 전부 손쉽게 다운로드하였고, md5 해시도 정상임을 확인하였다. 명령어를 실행하고 있는데 다음과 같은 메시지가 튀어나와서 약간 놀랐다.

흠, 좀 무서운데?

wget이나 curl로 파일을 가져올 때에는 나타나지 않던 경고문이다. 이들 명령어보다 rsync가 네트워크 자원을 더 많이 잡아먹는가? 미안하지만 다음에도 rsync를 쓰게 될 것 같다. NCBI가 공식적으로 제공하는 다운로드 스크립트인 update_blastdb.pl은 접속이 원활하지 않은 상태에서 얼마나 안정적으로 돌아가는지 잘 모르겠다.




댓글 없음: