RDMBSからHDFSヘ一部のテーブルをインポートする必要があり、CLIベースのsqoop1.xを触っていたのでメモする。
Sqoop run process
- sqoopコマンドを実行すると、hadoopコマンドを
org.apache.sqoop.Sqoopとsqoopコマンドに渡される引数をもとに実行される。 sqoop.tool.pluginsで指定されるクラスがロードされる。- 引数で指定されたサブコマンドから実行するToolを決定し、ToolクラスをSqoopクラスでラッブし、Toolを実行する。例えば、
sqoop importでは、ImportToolが実行されるといった具合。
Sqoop Import run process
- Scoop run processにより、ImportToolクラスのrunメソッドが実行される。
- allTablesフラグが
trueの時は(import-all-tablesサブコマンドの時)、エラーメッセージをリターンコード1で戻る。 - JDBCドライバーの初期化を行なう。
- SqoopRecordクラスを継承する取り込み対象のテーブルクラスを含むコンパイル済みjarファイルがなければ(
--jar-fileで指定されるjar)、コード生成プロセスが実行され、Importに使用されるjarファイルが作成される(--bindirで指定されるパス)。 - incrementalモード指定であれば、incrementalモードが実行される。
--delete-target-dirオプション指定があれば、ジョブの出力用ディレクトリを削除する。--tableオプション指定があればimportTableメソッドが、なければimportQueryメソッドが呼ばれる。--appendオプション指定があれば、既存のリソースはそのままで追記される(既存のリソース名に重複しないようファイルの名前がふられる)--hive-importオプション指定があれば、HiveへLOAD DATAされる。- incrementalモードの場合は、import時の状態を保存する。
Import Split
sqoopは、MapReduceを使ってRDMBSからテーブルデータをインポートする。mapperの数は、--num-mappersオプションで指定可能となっている。このオプションを指定しなかった場合は、デフォルトで4つのmapperが指定されている。(Reduceは0)
--split-byオプションの指定がない場合は、テーブルのメタ情報からプライマリーKey指定のカラムを取得し利用する。複合Keyになっている場合は、おそらくソースを見る限り、リストで取得したKeyの最初の値を使う。データの分割には、--boudary-queryオプションが指定されていなければ、以下のSQLが実行される。
|
1 |
SELECT MIN(t1.splitCol),MAX(t1.splitCol) FROM (query) AS t1 |
その後、カラムのデータタイプによって適切なSplitterが選択され、mapperの数で適切に分割される(各種Splitterのsplitメソッド参照)。
Compile
sqoopは、
--bindirオプションで指定されるパスにソースを生成しコンパイルしてjarファイルを生成する。その後、--outdirオプションで指定されるパスにソースをmoveする。両者が同じパスであった場合、デバッグレベルで、renameできない旨のメッセージが出力される。--jar-fileオプションで、適切にjarファイルを指定すると、コンパイルプロセスをスキップすることができる。テーブル構造に変更がない場合は、スキップすることで処理を短縮できる。通常、テーブルに対し生成されるJavaのクラス名は、
--tableオプションで指定された名前となる。--class-nameオプションを指定することで、指定の名前のクラスを生成することができる。--class-nameや--tableオプションなしで、--queryオプションで指定した場合は、QueryResultという名前になる。


コメント