[Talend]tMysqlOutputとtMysqlBulkExecで処理時間がどれくらい違うのか?を検証

2015.12.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

最近Talendにこなれてきたせいなのか、なんだかTalendが好きになってきたんじゃないかと思える今日この頃ですw
と前置きはこれくらいにしておいて、tMysqlOutputtMysqlBulkExecの処理スピードってどれくらい違うのかな?とふと思ったのでTalendでジョブ作って測定してみました。
動作させた環境は以下です。

  • MacOS X 10.10.5
  • メモリ 16GB
  • Talend Open Studio for Data Integration 6.0.1
  • MySQL 5.5 (VMWare Fusion上のWindwos7で動作)

検証用のジョブを作る

ジョブの流れは以下の感じでサクッと作成。

  1. テストデータを作成(50万件分)してローカルにCSVとして書き出す
  2. ローカルに書き出したCSVを読み込んでtMap→tMysqlOutputでデータを登録
  3. シェルでテストデータ50万件にIDを再割り当てして更に50万件のテストデータをCSVに書き出す
  4. tMysqlBulkExecを使って追加の50万レコードをDBへデータ登録

1.テストデータを作成(50万件分)してローカルにCSVとして書き出す

サブジョブとしてはtRowGeneratortFileOutputDelimitedで作れます。

CMBlog8_1

tRowGeneratorコンポーネントを使って50万レコードのテストデータを作成します。

CMBlog8_2

あとはtRowGeneratorコンポーネントをメインでtFileOutputDelimitedでつなぎ保存するCSVファイル名を指定するだけです。

2.ローカルに書き出したCSVを読み込んでtMap→tMysqlOutputでデータを登録

サブジョブとして以下の感じで作りました。

CMBlog8_3

tFileInputDelimitedでは1で作った50万件のテストデータを読み込んでtMapに渡してtMysqlOutputでDBに登録します。
今回はtMysqlOutputのデフォルト値設定を使用します。(100レコード単位でデータを登録し、10000レコード単位でコミットする設定をそのまま利用しています。)

CMBlog8_4

あとは処理開始時刻と処理終了時刻を最初と最後にtJavaコンポーネントを配置してタイムスタンプを標準出力に出します。

3.シェルを使って更に50万件のテストデータを別のCSVに書き出す

tSystemコンポーネントを使ってシェルコマンドを呼び出します。tRowGeneratorで作成した50万件のテストデータ内のIDに対して500001〜1000000までのIDを再割り当てして別の50万件のテストデータを作成します。
シェルといっても単にawk使ってるだけですが・・・
下記がそのシェルの中身です。

#!/bin/sh

cat /Users/IF_FOLDER/outputcsv/generate.csv | awk -F',' '{print  500000 + $1","$2","$3","$4 }' > /Users/IF_FOLDER/outputcsv/generate_bulk.csv

このシェルをgene.shとして保存しているので、tSystemコンポーネントに指定します。

CMBlog8_6

4.tMysqlBulkExecを使って追加の50万レコードをDBへデータ登録

サブジョブとして以下の感じで作りました。

CMBlog8_5

単にtSystemコンポーネントでキックしたシェルで作成されたテストデータCSVをtMysqlBulkExecのインプットデータとして指定しただけです。下記はシェルで書き出されたCSVの一部

500001,Chester,Monroe,42
500002,Chester,Jackson,57
500003,William,Jefferson,4
500004,Rutherford,Roosevelt,16
500005,Bill,Eisenhower,5
500006,James,Johnson,45
500007,Ulysses,Van Buren,84
500008,Benjamin,Quincy,37
500009,Herbert,Ford,23
500010,John,Taylor,78
500011,Ronald,Reagan,92
500012,Franklin,Monroe,33
500013,Millard,Truman,35
500014,Abraham,Jefferson,69
500015,George,Garfield,49
500016,George,Taylor,100
500017,Martin,Roosevelt,91
500018,Gerald,Quincy,100
500019,Warren,Fillmore,36
500020,John,Kennedy,54

処理開始時刻と処理終了時刻をtMysqlBulkExecコンポーネントの前と後ろにtJavaコンポーネントを配置してタイムスタンプを標準出力に出します。

ジョブ全体としては下記のような感じになりました。

CMBlog8_7

実際にジョブ実行してみる

50万件(tMysqlOutput)+50万件(tMysqlBulkExec)の処理時間は以下になりました。

CMBlog8_8

tMysqlOutputで50万レコードのインサート所要時間:約7秒
tMysqlBulkExecで50万レコードのインサート所要時間:約2秒

約5秒tMysqlBulkExecの方が早いことが確認できました。

あとは10万件、20万件、30万件、40万件もテスト的に実行してみた結果も参考までに載せておきます。

10万レコード

ジョブ CMBlog_8 を 13:43 15/12/2015 に開始しました。
[statistics] connecting to socket on port 3897
[statistics] connected
[2015-12-15 13:43:06]Insert Start.
[2015-12-15 13:43:08]Insert End.
[2015-12-15 13:43:09]Bulk Insert Start.
[2015-12-15 13:43:09]Bulk Insert End.
[statistics] disconnected
ジョブ CMBlog_8 が 13:43 15/12/2015 に終了しました。 [終了コード=0]

20万レコード

ジョブ CMBlog_8 を 13:41 15/12/2015 に開始しました。
[statistics] connecting to socket on port 3612
[statistics] connected
[2015-12-15 13:41:38]Insert Start.
[2015-12-15 13:41:42]Insert End.
[2015-12-15 13:41:43]Bulk Insert Start.
[2015-12-15 13:41:43]Bulk Insert End.
[statistics] disconnected
ジョブ CMBlog_8 が 13:41 15/12/2015 に終了しました。 [終了コード=0]

30万レコード

ジョブ CMBlog_8 を 13:43 15/12/2015 に開始しました。
[statistics] connecting to socket on port 3793
[statistics] connected
[2015-12-15 13:43:59]Insert Start.
[2015-12-15 13:44:04]Insert End.
[2015-12-15 13:44:05]Bulk Insert Start.
[2015-12-15 13:44:06]Bulk Insert End.
[statistics] disconnected
ジョブ CMBlog_8 が 13:44 15/12/2015 に終了しました。 [終了コード=0]

40万レコード

ジョブ CMBlog_8 を 13:45 15/12/2015 に開始しました。
[statistics] connecting to socket on port 3506
[statistics] connected
[2015-12-15 13:45:44]Insert Start.
[2015-12-15 13:45:49]Insert End.
[2015-12-15 13:45:50]Bulk Insert Start.
[2015-12-15 13:45:52]Bulk Insert End.
[statistics] disconnected
ジョブ CMBlog_8 が 13:45 15/12/2015 に終了しました。 [終了コード=0]

まとめ

こういうプログラムをjavaで書くとそれなりに時間がかかってしまいますが、Talendを使うと簡単に実現できてしまうので、慣れてくると病み付きになりますねw
次はRedshiftに対してはどれくらいの差が出てくるのかを検証してみたいとおもいます。