実際に構築するHadoopのシステムでは(a)インポートや(d)エクスポートのように、扱うデータ量に依存し、Hadoopのノード数を増やしても性能が向上しない処理があり、そこがボトルネックになり得る。いかに効率良くRDBMSからデータをインポート/エクスポートするかが非常に重要だ。

 ここでは、(a)インポートに焦点を当て、「JDBCドライバを使用して標準SQLでアクセス」「米Clouderaが提供するデータ転送ツールsqoopを使用」「MySQLの独自機能を利用したダンプ」の3通りの方法を試した(図4)。

図4●インポートで検証した三つの方法<br>JDBCを使用する方法は汎用的だが性能が低い傾向がある。RDBMSに依存してしまうがダンプ系のコマンドを使用すると良好な結果が得られることが多い
図4●インポートで検証した三つの方法
JDBCを使用する方法は汎用的だが性能が低い傾向がある。RDBMSに依存してしまうがダンプ系のコマンドを使用すると良好な結果が得られることが多い
[画像のクリックで拡大表示]

 検証結果を見ると、データ量1000万件ではsqoopを使用する方法が、同100万件ではMySQLの独自機能を利用したダンプが最速である(図5)。

図5●インポート処理の性能<br>データ量が1000万件の場合はsqoopが、100万件の場合はMySQL独自機能のダンプ系コマンドがそれぞれ最も高速である
図5●インポート処理の性能
データ量が1000万件の場合はsqoopが、100万件の場合はMySQL独自機能のダンプ系コマンドがそれぞれ最も高速である
[画像のクリックで拡大表示]

 sqoopが速いのは、MySQLのデータファイルに直接アクセスするためだ。また、DBサーバー上にテンポラリファイルを作成せずにHadoopのHDFS上にファイルを直接生成する。

 一方で、データ量が少ないときにsqoopの性能が出ないのは、同ツールがHadoopのジョブとして実行されることが理由だ。検証(1)で述べたように、ジョブの初期化といったオーバーヘッドが本来の処理より大きくなる。

 経験的にはインポートに最適な方法は、データ量のほかRDBMSの種類によって異なるが、JDBCドライバを使用して標準SQLでアクセスするのは一般に性能が悪い。実用的な性能を得るには、RDBMSのダンプ系コマンドを試すのが基本である。

 なお、sqoopにはJDBCドライバを用いた仕組みも用意されているが、この検証では利用していない。