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という名前になる。
コメント