Sqoopでimportやexportする際にどんなSQLを実行しているのか調べてみた。
importに関しては、ダイレクトモード以外は特別な事はしてなさそう。
exortに関しては、MySQLやPostgreSQLはデフォルトではマルチVALUESインサート、バッチモードでは通常のINSERT文を使う。
で、Oracleにはマルチインサートの構文が無いので、代わりに「SELECT 値,~,値 FROM DUAL」をUNIONでつないでひとつのSQLにしている。したがって、Oracleのデフォルトモードとバッチモードでは実行されるSQLが異なる…
と思っていたのだが、どうやら違っていたようだ。
そういうSQLを生成するOutputFormatを用意しているくせに、それを呼び出している箇所が無い。つまり、Oracleのデフォルトではバッチモードと同じクラスを使っている。
(UNIONでつないだSELECTは実行速度が遅いということだろうか。いずれにしても、Oracle Loader for Hadoopの方が速そうだが)
あと、MySQLのダイレクトモードは各Mapタスクでmysqldumpやmysqlimportコマンドを使っている。
(つまり、全スレーブノードにMySQLをインストールしないといけないということか?)
PostgreSQLのimportのダイレクトモードはMapReduceになっていない。psqlを使ってデータを出力し、HDFSへ転送しているイメージ。
(つまり、Sqoopを実行するサーバー上にPostgreSQLクライアントをインストールしないといけないということか?)