Hadoop には大量のテストがある.中には疑似分散環境を用いたテストが存在するため,その実行には多くの時間を必要とする.本稿では,開発を効率化するために,どのようにしてテストを効率的に行うかについて述べる.
実行するテスト数の削減
明らかに関係のないテストをスキップする方法である.ただし,この方法を用いることができるのは,自分の変更したソースコードの影響範囲が,ある程度把握できる場合にのみに限られる.
特定のテストのみの実行
maven には,特定のテストクラスのみを実行する機能が備わっている.この機能を利用するには,以下のようにして実行したいテストクラスを指定する.
$ mvn test -Dtest=TestClass
さらに,特定のメソッドのみを実行するには以下のようにしてテストメソッドを指定する.
$ mvn test -Dtest=TestClass#testMethod
依存関係のないプロジェクトのテストを飛ばすには,プロジェクトのルートディレクトリでテストを実行する代わりに,各ディレクトリの下でテストを実行する.
# hadoop-yarn-project のテストのみを実行する場合
$ cd hadoop-yarn-project
$ mvn test
テスト実行の並列化
自分の行った変更の影響範囲が未知数である場合,全体のテストを行う必要がある.この場合には,並列にテストを実行することでテストの実行効率を高めることができる.
サブプロジェクト単位の実行並列化
Hadoop はいくつかのサブプロジェクトに分割されているため,個別に実行することでテストの実行を効率化できる.例えば hadoop-yarn-project の場合,以下の 6 つのサブプロジェクトが存在するため,並列実行を行うことができる.
- hadoop-yarn-api
- hadoop-yarn-client
- hadoop-yarn-server
- hadoop-yarn-applications
- hadoop-yarn-common
- hadoop-yarn-site
実際に並列実行するにはどうすればよいだろうか.ソースコードに変更を加えるたびに,6つのコンソールに向かって mvn test
を実行することでも実行可能だが,面倒である.そこで,Jenkins などの CI ツールを用いて,git push されたら上記のテストを並列に実行するように設定しておくと便利である.なお,Jenkins を用いる場合は,同時Job実行数を CPU の数に合わせると実行効率が高い(経験則).
テストメソッド単位の実行並列化
trunk では parallel-tests という並列実行用のプロファイルが追加されているため,以下のプロジェクトのテストは並列実行が可能である.
- hadoop-common-project/hadoop-common
- hadoop-hdfs-project/hadoop-hdfs
並列実行を有効にするには,以下のコマンドを利用する.
$ mvn test -Pparallel-tests
ビルドマシンの見直し
当然のことだが,ビルドマシンの性能はテスト実行時間を大きく左右する.AWS の m1.xlarge と 3.2xlarge を用いて mvn install -DskipTests
を実行したときの処理時間の比較を以下に示す.
|インスタンスタイプ|実行時間|
|:-----------|------------:|:------------:|
| m1.xlarge | 3:30 |
| m3.2xlarge | 1:30 |