ライフサイエンスにおけるApache Spark利用 (1)
今年もあと残すことろひと月あまりとなりました、みなさんいかがお過ごしでしょうか。
今回はライフサイエンス分野におけるApache Spark利用について、何回かにわけてお送りしようと思います。
読まれている方には計算機に明るい方が多いと思いますが、みなさんは計算機の制限に慣れてしまってはいませんか?新しい機能に期待を募らせたり、現実をみてがっかりしたり、いつの間にか周囲の人たちが流行の先を行っていたり。計算機の発展は目まぐるしいものの、常々従来の環境との互換性や、本当に流行るのかどうかの疑念などと闘いながら今の姿をつくってきたと言えます。IA32が64bit対応になったときも、シングルコアだったCPUに2コア以上載るようになったときも、過去の資産との互換性や、それを本当に活かせるものなのかとも考えられたものです。
科学技術向け計算ではどうでしょう。大規模計算では多数の計算機を使用することが当たり前になっています。1000CPUでの並列計算も可能ですし、10万個ある計算ジョブを分散実行することも可能です。ですがこれらはMPIなどのライブラリを用いて計算機の今ある制限や前提にあわせて並列化したり、普通のLinux計算機で普通に走るプログラムを普通のファイルシステム上に載せ、それをそれぞれ独立した形で実行させたり、何らかのチェックポイントをつくり要所で結果を手動で同期させたりすることにより実現しています。ゲノムのパイプラインはいくつものツールをその都度ファイルを閉じ、中間結果を出しながら実行していきます。このように、私たちは計算機の前提や制限をうまく回避しながら利用しているわけですが、もしかするといつの間にか、「こんなにたくさんのデータは計算機に入らないから」という理由で諦めてしまっているアイデアも、あるかもしれません。
前置きが長かったのですが、近年、Apache Spark上でライフサイエンス分野の計算を行う事例が出てきています。Apache Sparkとは、2014年にカリフォルニア大学バークレー校で開発された、オープンソースのクラスターコンピューティングフレームワークです。
ひとことで言いますと、従来の計算機利用の枠を一度取り払い、です。多数の計算機で巨大なデータを取り扱うのに都合が良いようにつくられたフレームワークです。構築の方法により若干は異なるのではありますが、ざっくりと特徴を挙げると、
- 従来型のHPCクラスタより、計算機の事情を汲まなくてよい設計になっている
- 分散ファイルシステムHDFSを使用する
- データはできるだけメモリ内で処理される
- データの分割や分散処理はSparkがやってくれる
- 多数の計算機をひとつの計算機として利用可能であり、100TBや1PBものデータをsortするような大規模データ処理が可能になっている
- ファイルシステム構成に従来型のようなボトルネックを持たず、数千ノードまでスケールする
- サンプル毎や染色体別にファイルを分けるなどの手動のデータ分割は必要ない
- Spark core 各種並列分散処理を実行するための基盤。
- Spark SQL 大規模構造化データを処理するためのSparkモジュール。その名の通り、巨大なデータに対するSQLクエリを実行することができます。
- Spark Streaming 連続して入力されるデータに対してデータ処理を行うことができます。
- ML Machine Learning Library 機械学習と統計処理のライブラリが実装されています。
- Graph X 分散グラフ処理フレームワークです
- GATK
Version4.0よりSpark対応がなされており、bwaからGermlineパイプラインやSomaticパイプラインが実行可能です。
具体的には、FastqToSam -> BwaSpark -> MarkDuplicateSpark -> BaseRecalibrateSpark -> ApplyBQSRSpark -> HaplotypeCallerSpark
といったもので、いくつかあるGATK高速化手段の有力なひとつです。
ファイルシステムからして非常にスケーラブルなSpark上に載りますので、大量実行に向いていると言えます。 - Hail
大量のvcfファイルを利用したGWAS解析ができます。社内では1TBを超えるvcfファイルを4ノードの試験機で扱えることを確認しています。(その辺はまた後ほど)