Más contenido relacionado
La actualidad más candente (20)
Similar a Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料) (20)
Más de NTT DATA OSS Professional Services (20)
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
- 1. Sqoopコネクタを書いてみた
28/08/2012
NTT DATA Corporation
Masatake Iwasaki
Copyright © 2012 NTT DATA Corporation
- 2. Index
01 Sqoopの概要
02 pg_bulkloadコネクタ
03 開発プロセス
04 Sqoop2
Copyright © 2012NTT DATA Corporation 2
- 5. Export job
HDFS File Split File Split File Split
Map Task Map Task Map Task
INSERT INTO stg VALUES (?, ?), (?, ?), ...
INSERT INTO stg VALUES (?, ?), (?, ?), ...
...
Staging Table
Optional
RDB
Destination Table
INSERT INTO dest ( SELECT * FROM stg)
Copyright © 2012 NTT DATA Corporation 5
- 7. 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
- 9. 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
- 11. Sqoopコネクタの切り替え
デフォルトではJDBC接続文字列によって選ばれる。
$ sqoop export --connect jdbc:postgresql://localhost:5432/test ...)
sqoopコマンドの--connection-managerオプションで直接指定も可能。
$ sqoop export --connection-manager
if (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
- 14. 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
- 16. Export job of pg_bulkload connector
HDFS 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 tmp3
RDB 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
- 17. Sqoop builtin export job
HDFS File Split File Split File Split
Map Task Map Task Map Task
INSERT INTO stg VALUES (?, ?), (?, ?), ...
INSERT INTO stg VALUES (?, ?), (?, ?), ...
...
Staging Table
Optional
RDB
Destination Table
INSERT INTO dest ( SELECT * FROM stg)
Copyright © 2012 NTT DATA Corporation 17
- 18. pg_bulkloadコネクタの特徴
良いところ
pg_bulkloadの良いところを活用できる。
速い。(ただし、最近ではCOPYでも十分速いという説も。)
エラーレコードを飛ばしてインポートできる。
いまいちなところ
DBサーバ+全スレーブにpg_bulkloadのセットアップが必要。
RPM等のパッケージを利用したい。
スーパーユーザ権限が必要。
pg_bulkloadの実行、一時テーブル作成のため。
Copyright © 2012 NTT DATA Corporation 18
- 19. 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
- 20. 性能比較
Test Enviroment Parameter Value
OS CentOS 5.7
Hadoop(Sqoop) Version CDH3U1
Number of Slaves 10
DB PostgreSQL 9.0.5
Test Case Parameter Value
Data Size 10.8 GB
Number of Records 20000000
Number of Maps 10
Result 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
- 22. 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
- 23. ドキュメントの開発
ドキュメントはAsciiDocで記述されている。
ビルドはmakeで実行。:
$ cd src/docs
$ make
Syntax
public 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)
...
----
@Override
This 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
- 28. Link to JIRA issus
"Bugs:"にJIRAのissueのIDを記述すると通知がJIRA側にも飛ぶ。
Copyright © 2012 NTT DATA Corporation 28
- 33. Sqoop2
セットアップの手間
セキュリティ向上
リソース制御
-> サーバアプリケーションとして集中管理
長くて複雑なコマンドライン
-> Web UIとREST APIを追加
Sqoop共通の機能とコネクタ固有の機能の境目があいまい
データ転送とシリアライズフォーマットが強結合
JDBCのモデルへの依存性
-> よりよい抽象化
Copyright © 2012 NTT DATA Corporation 33