Sqoop1.x Import Process

hadoop
この記事は約3分で読めます。

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が実行される。

その後、カラムのデータタイプによって適切なSplitterが選択され、mapperの数で適切に分割される(各種Splitterのsplitメソッド参照)。

Compile

sqoopは、--bindirオプションで指定されるパスにソースを生成しコンパイルしてjarファイルを生成する。その後、--outdirオプションで指定されるパスにソースをmoveする。両者が同じパスであった場合、デバッグレベルで、renameできない旨のメッセージが出力される。--jar-fileオプションで、適切にjarファイルを指定すると、コンパイルプロセスをスキップすることができる。テーブル構造に変更がない場合は、スキップすることで処理を短縮できる。
通常、テーブルに対し生成されるJavaのクラス名は、--tableオプションで指定された名前となる。--class-nameオプションを指定することで、指定の名前のクラスを生成することができる。--class-name--tableオプションなしで、--queryオプションで指定した場合は、QueryResultという名前になる。

コメント

タイトルとURLをコピーしました