大規模GWASやPRS研究を可能にするHail(5)
Takeru Elysia news!
大規模GWASやPRS研究を可能にするHail(5)
Takeru ElysiaはApache Sparkが利用可能な大規模計算プラットフォームです。従来のジョブスケジューラーを用いたものと異なり、複数台の計算機を使う同じcluster構成でも、次のような特徴を持っています。- 自分でデータ分割をする必要がない
- 並列処理を自動実行してくれる
- 計算にnfsを使用しないため、ファイルI/Oがボトルネックになりにくい
- 高い拡張性を持っており、数ノードからスタートして数百ノード以上にスケールすることができる
今日の内容:
HailのMatrixTableやTableをPandasやSparkのDataFrameへexportする
Hailで扱ったり分析をしたデータをPandasやSparkのDataFrame上へ変換することで様々な分析ができるようになることを想定しています。 まず最初に16MBの小さなデータをつかって試してみます。 PandasはSpark上で動作するわけではないので自ずと扱えるデータ量やパフォーマンスの課題がでると思われますので、 そのあたりを1.3TBのvcfファイルを使って試してみます。使用するvcfファイルについて:
使用するvcfファイルは、Hailのサンプルデータです。 圧縮した状態で合計16.1MBの小さなものです。 HailはPython上で動作します。まず、notebook上でHailを動作させます。 この試験ではkubernetes上にspark clusterをデプロイしています。テストデータ(16MB)の読み込み
まずは小さなvcfファイルとannotationファイルを読み込み, 1塩基多型のみに絞り込み, 両者を結合しておきます。In [2]:
テーブルの確認
mtはMatrixTable, tableはHailのTableとして扱われています。In [3]:
Out[3]:
In [4]:
Out[4]:
MatrixTableの中にはColumn fieldsやRow fieldsなど、さらにいくつかのtableが含まれています。
In [5]:
tableは次のようにRow fieldsを基本としたものです。
In [6]:
HailのTableをPandasやSparkのDataFrameへexport
PandasのDataFrameへ変換
次のようにto_pandas()を実行することでHailのTableをPandasのDataFrameに変換することができます。In [7]:
In [8]:
Out[8]:
In [9]:
meanで平均値を出してみます
In [10]:
Out[10]:
SparkのDataFrameへ変換
次のようにto_spark()を実行することでHailのtableをSparkのDataFrameに変換することができます。In [11]:
In [12]:
Out[12]:
In [13]:
MatrixTableをPandasやSparkのDataFrameへexport
MatrixTableはいくつかのfieldを内包しています。 以下ではそれぞれのfield単位でexportしてみます。
MatrixTableにあるfieldをHailのTableとして扱うためには次のようにします。
In [14]:
Out[14]:
In [15]:
Out[15]:
In [16]:
Out[16]:
SparkのDataFrameへ変換
In [17]:
PandasのDataFrameへ変換
In [18]:
In [19]:
Out[19]:
どちらもうまくいきました。
テストデータ(1.3TB)の読み込み
次に大きなvcfファイルとannotationファイルを読み込み, 1塩基多型のみに絞り込み, 両者を結合しておきます。In [20]:
SparkのDataFrameへ変換
Sparkは複数のノードに自動で分散されるのでより大きなデータを扱うことができます。 今回のテストでは384GBのメモリを持ったマシンが4台あるので、合計1.5TBのメモリを使うことができます。In [21]:
PandasのDataFrameへ変換
読み込んだvcfファイルが1.3TBあるため、こちらはうまくいくかどうか少し不安です。 PandasはSpark上では動作できないので、できるかどうかはこのnotebookが載っているサーバーのメモリ次第です。In [22]:
In [23]:
384GBのメモリを持っていましたが途中でkernelが落ちてしまいました。
まとめ
今回は次のような操作を行いました。 ・HailのTable, MatrixTableをPandasやSparkのDataFrameへ変換 ・1.3TBのvcfファイルはPandasのDataFrameへ読み込むことができませんでしたが、SparkのDataFrameなら可能でした。
このようにSparkでは、巨大なデータでも自分で分割することなく自動的に複数のノードを使った分散処理を行うことができます。
ノードは拡張可能で、メモリやCPUだけではなくSSDを足すことでファイルI/Oの能力も拡張することができます。
今後増加が見込まれるBiobankのデータを扱うのに最適なシステムです。
次回はSpark上でPandas風にデータ分析ができるライブラリ、Koalasを使ってみたいと思います。
In [ ]: