• Save
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
Upcoming SlideShare
Loading in...5
×
 

Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)

on

  • 5,294 views

Hadoopソースコードリーディング第12回 発表資料 ...

Hadoopソースコードリーディング第12回 発表資料
http://hadoop-scr12th.eventbrite.com/

『Sqoopコネクタを書いてみた』
NTTデータ 基盤システム事業本部 岩崎 正剛
http://oss.nttdata.co.jp/hadoop/

NTT DATA CORPORATION
OSS Professional Services, System Platforms Sector
Masatake Iwasaki

・Sqoopの概要
・pg_bulkloadコネクタ
・開発プロセス
・Sqoop2

Statistics

Views

Total Views
5,294
Views on SlideShare
5,056
Embed Views
238

Actions

Likes
10
Downloads
0
Comments
0

3 Embeds 238

http://pandazx.hatenablog.com 184
https://twitter.com 53
https://si0.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料) Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料) Presentation Transcript

  • Sqoopコネクタを書いてみた 28/08/2012 NTT DATA Corporation Masatake IwasakiCopyright © 2012 NTT DATA Corporation
  • Index 01 Sqoopの概要 02 pg_bulkloadコネクタ 03 開発プロセス 04 Sqoop2Copyright © 2012NTT DATA Corporation 2
  • Sqoopの概要Copyright © 2012 NTT DATA Corporation 3
  • Sqoopの役割HadoopとRDBとの間のデータの移動。 Hadoopにデータを移動するのがImport。 RDBにデータを移動するのがExport。データの移動は(ほとんどの場合)MapReduceジョブで行う。 Import Sqoop HDFS/Hive/HBase RDB Export Copyright © 2012 NTT DATA Corporation 4
  • Export jobHDFS File Split File Split File Split Map Task Map Task Map Task INSERT INTO stg VALUES (?, ?), (?, ?), ... INSERT INTO stg VALUES (?, ?), (?, ?), ... ... Staging Table OptionalRDB Destination Table INSERT INTO dest ( SELECT * FROM stg) Copyright © 2012 NTT DATA Corporation 5
  • SqoopRecordデータレコードに対応するオブジェクト。MapReduceタスクの入出力となる。 Importの場合、入力がSqoopRecord。 Exportの場合、出力がSqoopRecord。 Text Data toString (CSV, TSV, ...) parse readFields SqoopRecord write RDB write readFields SequenceFile Copyright © 2012 NTT DATA Corporation 6
  • SqoopRecordの生成SqoopRecordはテーブルのスキーマに応じて変わる。sqoopコマンド実行時にコード生成、コンパイル、jar作成が行われる。public String generateORM(SqoopOptions options, String tableName) throws IOException { String existingJar = options.getExistingJarName(); LOG.info("Beginning code generation"); CompilationManager compileMgr = new CompilationManager(options); ClassWriter classWriter = new ClassWriter(options, manager, tableName, compileMgr); classWriter.generate(); compileMgr.compile(); compileMgr.jar(); String jarFile = compileMgr.getJarFilename(); this.generatedJarFiles.add(jarFile); return jarFile; Copyright © 2012 NTT DATA Corporation 7
  • テーブル情報の取得テーブルのスキーマ情報はResultSetから取得。JDBC経由でSELECT文を実行し、ResultSet#getMetaDataを使う。JDBCで取れない情報は取れない。protected Map<String, Integer> getColumnTypesForRawQuery(String stmt) { ResultSet results; results = execute(stmt); int cols = results.getMetaData().getColumnCount(); ResultSetMetaData metadata = results.getMetaData(); for (int i = 1; i < cols + 1; i++) { int typeId = metadata.getColumnType(i); // If we have an unsigned int we need to make extra room by // plopping it into a bigint if (typeId == Types.INTEGER && !metadata.isSigned(i)){ Copyright © 2012 NTT DATA Corporation 8
  • SqoopRecordのコードの例public void parse(Text __record) throws RecordParser.ParseError { if (null == this.__parser) { this.__parser = new RecordParser(__inputDelimiters); } List<String> __fields = this.__parser.parseRecord(__record); __loadFromFields(__fields); } public int write(PreparedStatement __dbStmt, int __off) throws SQLException { JdbcWritableBridge.writeInteger(id, 1 + __off, 4, __dbStmt); JdbcWritableBridge.writeString(txt, 2 + __off, 12, __dbStmt); return 2; } Copyright © 2012 NTT DATA Corporation 9
  • SqoopコネクタRDBMSに応じて切り替えて使われるモジュール。SQLの方言などの差分を吸収する。org.apache.sqoop.manager.ConnManagerを継承して実装する。public String toJavaType(int sqlType) {public String toHiveType(int sqlType) {public Type toAvroType(int sqlType) {...public abstract void importTable( com.cloudera.sqoop.manager.ImportJobContext context) throws IOException, ImportException;public void exportTable(com.cloudera.sqoop.manager.ExportJobContext context) throws IOException, ExportException { throw new ExportException("This database does not support exports");}... Copyright © 2012 NTT DATA Corporation 10
  • Sqoopコネクタの切り替え デフォルトではJDBC接続文字列によって選ばれる。 $ sqoop export --connect jdbc:postgresql://localhost:5432/test ...) sqoopコマンドの--connection-managerオプションで直接指定も可能。 $ sqoop export --connection-managerif (scheme.equals("jdbc:mysql:")) { if (options.isDirect()) { org.apache.sqoop.manager.PostgresqlManager return new DirectMySQLManager(options); } else { return new MySQLManager(options); }} else if (scheme.equals("jdbc:postgresql:")) { if (options.isDirect()) { return new DirectPostgresqlManager(options); } else { return new PostgresqlManager(options); }} else if (scheme.startsWith("jdbc:hsqldb:")) { return new HsqldbManager(options);} else if (scheme.startsWith("jdbc:oracle:")) { return new OracleManager(options);} else if (scheme.startsWith("jdbc:sqlserver:")) { return new SQLServerManager(options);} else if (scheme.startsWith("jdbc:db2:")) { return new Db2Manager(options); Copyright © 2012 NTT DATA Corporation 11
  • pg_bulkloadコネクタCopyright © 2012 NTT DATA Corporation 12
  • pg_bulkloadの概要http://pgbulkload.projects.postgresql.org/pg_bulkload-ja.htmlから引用:pg_bulkload は、大量のデータを高速に投入する目的のためのツールです。データベース制約のチェックの有無や、エラーデータをスキップして投入を継続するか否かを制御でき、入力データに応じた柔軟なデータができます。たとえば、あるデータベースに格納されている情報を別のデータベースへ移送するような状況では、データの整合性は既に確認済みですので、細かなチェックは省いてとにかく高速にデータをロードできます。一方、別のツールの出力など整合性が怪しい場合には、制約をチェックしながら投入できます。pg_bulkload は元々は PostgreSQL 組み込みのデータロード用コマンドである COPY を上回る性能を目指して開発されました。バージョン 3.0以降はさらに入力データの検証機能やフィルタによる変換機能を備え、ETL ツールの T (Transform) と L (Load) を強力にサポートします。 Copyright © 2012 NTT DATA Corporation 13
  • pg_bulkloadコネクタ SQOOP-390 exportをpg_bulkloadを利用して実行。 importはデフォルトのPostgreSQLコネクタと同じ動作。public class PGBulkloadManager extends PostgresqlManager { public static final Log LOG = LogFactory.getLog(PGBulkloadManager.class.getName());...@Override public void exportTable(ExportJobContext context) throws IOException, ExportException { context.setConnManager(this); options.setStagingTableName(null); PGBulkloadExportJob jobbase = new PGBulkloadExportJob(context, null, ExportInputFormat.class, NullOutputFormat.class); jobbase.runExport(); } Copyright © 2012 NTT DATA Corporation 14
  • pg_bulkloadコネクタの挙動MapReduceジョブでデータをexport。Mapタスクが外部プロセスとしてpg_bulkloadコマンドを実行。Mapタスクはそれぞれ自分用の一時テーブルを作成。 pg_bulkloadはテーブルロックを取るため。 テーブル名はtask attempt IDを元に決定。 ジョブが成功したら一時テーブルは削除される。Reduceタスクで一時テーブルから行先のテーブルにデータを移動。 この段階でジョブが失敗しても、一時テーブルは消えない。 ユーザが手動でリトライするか削除するか判断する。 Copyright © 2012 NTT DATA Corporation 15
  • Export job of pg_bulkload connectorHDFS File Split File Split File Split Map Task Map Task Map Task CREATE TABLE tmp3(LIKE dest INCLUDING CONSTRAINTS) pg_bulkload pg_bulkoad pg_bulkload tmp1 tmp2 tmp3RDB Reduce Task INSERT INTO dest ( SELECT * FROM tmp1 ) DROP TABLE tmp1 INSERT INTO dest ( SELECT * FROM tmp2 ) DROP TABLE tmp2 Destination Table INSERT INTO dest ( SELECT * FROM tmp3 ) DROP TABLE tmp3 Copyright © 2012 NTT DATA Corporation 16
  • Sqoop builtin export jobHDFS File Split File Split File Split Map Task Map Task Map Task INSERT INTO stg VALUES (?, ?), (?, ?), ... INSERT INTO stg VALUES (?, ?), (?, ?), ... ... Staging Table OptionalRDB Destination Table INSERT INTO dest ( SELECT * FROM stg) Copyright © 2012 NTT DATA Corporation 17
  • pg_bulkloadコネクタの特徴良いところ pg_bulkloadの良いところを活用できる。 速い。(ただし、最近ではCOPYでも十分速いという説も。) エラーレコードを飛ばしてインポートできる。いまいちなところ DBサーバ+全スレーブにpg_bulkloadのセットアップが必要。 RPM等のパッケージを利用したい。 スーパーユーザ権限が必要。 pg_bulkloadの実行、一時テーブル作成のため。 Copyright © 2012 NTT DATA Corporation 18
  • pg_bulkloadコネクタの使い方DBサーバとスレーブノードにpg_bulkloadをインストール。Sqoopクライアントノードでsqoopコマンドを実行。:$ sqoop export ¥ Reduceタスク数は -Dmapred.reduce.tasks=1 ¥ Configurationプロパティで指定。 -Dpgbulkload.bin="/usr/local/bin/pg_bulkload" ¥ -Dpgbulkload.input.field.delim=$¥t ¥ その他コネクタ固有の設定も -Dpgbulkload.check.constraints="YES" ¥ Configurationプロパティで指定。 -Dpgbulkload.parse.errors="INFINITE" ¥ -Dpgbulkload.duplicate.errors="INFINITE" ¥ --connect jdbc:postgresql://pgsql.example.net:5432/sqooptest ¥ --connection-manager org.apache.sqoop.manager.PGBulkloadManager ¥ --table test --username sqooptest --export-dir=/test -m 4 スーパーユーザ権限を持った --connection-managerオプション roleが必要。 でコネクタのクラス名を指定。 Copyright © 2012 NTT DATA Corporation 19
  • 性能比較Test Enviroment Parameter Value OS CentOS 5.7 Hadoop(Sqoop) Version CDH3U1 Number of Slaves 10 DB PostgreSQL 9.0.5Test Case Parameter Value Data Size 10.8 GB Number of Records 20000000 Number of Maps 10Result Connector Time for staging[sec] Time for migration[sec] Total time[sec] PostgresqlManager 537 3760 4297 PGBulkloadManager 163 721 884 Copyright © 2012 NTT DATA Corporation 20
  • 開発プロセスCopyright © 2012 NTT DATA Corporation 21
  • Sqoopのソースコード開発の流れソースコードの編集とビルド: $ svn co https://svn.apache.org/repos/asf/sqoop/trunk/ sqoop $ cd sqoop $ ant jarテストの実行: $ ant checkstyle $ ant test $ ant -Dtestcase=PGBulkloadManagerManualTest testパッチファイルの作成: $ svn diff > pgbulkload-connector-r1.patch Copyright © 2012 NTT DATA Corporation 22
  • ドキュメントの開発 ドキュメントはAsciiDocで記述されている。 ビルドはmakeで実行。: $ cd src/docs $ makeSyntaxpublic class PGBulkloadManager extends PostgresqlManager {^^^^^^Use +--connection-manager+LOG = public static final Log option to specify connection manager classname.---- LogFactory.getLog(PGBulkloadManager.class.getName());$ sqoop export (generic-args) --connection-manager org.apache.sqoop.manager.PGBulkloadManager (export-args)$ sqoop-export (generic-args) --connection-manager org.apache.sqoop.manager.PGBulkloadManager (export-args)...----@OverrideThis connectorexportTable(ExportJobContext context) public void supports export arguments shown below. throws IOException, ExportException {.Supported export control arguments: context.setConnManager(this);[grid="all"] options.setStagingTableName(null);`----------------------------------------`--------------------------------------- PGBulkloadExportJob jobbase =Argumentnew PGBulkloadExportJob(context, Description--------------------------------------------------------------------------------- null,+¥--export-dir <dir>+ ExportInputFormat.class, for the export HDFS source path+-m,¥--num-mappers <n>+ NullOutputFormat.class); to export in¥ Use n map tasks jobbase.runExport(); Copyright © 2012 NTT DATA Corporation 23
  • JIRAへの投稿https://issues.apache.org/jira/JIRAでアカウントを作成しログイン。メニューから"Create Issue"を実行する。 Copyright © 2012 NTT DATA Corporation 24
  • Create Issueプロジェクトを選択し、説明などを記入。 Copyright © 2012 NTT DATA Corporation 25
  • Attach FilesパッチファイルをJIRAに添付する。 Copyright © 2012 NTT DATA Corporation 26
  • Review Boardhttps://reviews.apache.org/アカウントを作成してログイン。アカウントはJIRAとは独立。"New Review Request"を選択して実行。 Copyright © 2012 NTT DATA Corporation 27
  • Link to JIRA issus"Bugs:"にJIRAのissueのIDを記述すると通知がJIRA側にも飛ぶ。 Copyright © 2012 NTT DATA Corporation 28
  • Reiview Commentsレビューコメントに対してコメントを返信。パッチを更新してアップデート。 Copyright © 2012 NTT DATA Corporation 29
  • View Diffパッチはバージョン管理され、差分を確認できる。 Copyright © 2012 NTT DATA Corporation 30
  • Ship it!レビューが終わったパッチをJIRAのissueに添付する。 Copyright © 2012 NTT DATA Corporation 31
  • Sqoop2Copyright © 2012 NTT DATA Corporation 32
  • Sqoop2セットアップの手間セキュリティ向上リソース制御 -> サーバアプリケーションとして集中管理長くて複雑なコマンドライン -> Web UIとREST APIを追加Sqoop共通の機能とコネクタ固有の機能の境目があいまいデータ転送とシリアライズフォーマットが強結合JDBCのモデルへの依存性 -> よりよい抽象化 Copyright © 2012 NTT DATA Corporation 33
  • Sqoop2https://issues.apache.org/jira/browse/SQOOP-365https://cwiki.apache.org/confluence/display/SQOOP/Sqoop+2 $ svn co https://svn.apache.org/repos/asf/sqoop/branches/sqoop2 Copyright © 2012 NTT DATA Corporation 34
  • Copyright © 2011 NTT DATA CorporationCopyright © 2012 NTT DATA Corporation