【小ネタ】TalendでMySQLから取得したデータをストリームで処理する

2016.07.04

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

DBから取得したデータをストリームで処理する

Talendを使ってDBからデータを取得する際に、データの件数が多い場合、
実行環境のマシンスペックがしょぼかったりすると処理に時間がかかったり、
最悪メモリリークが発生することがありえます。
そんな時はストリームで処理すると解決するかもしれません。

環境

今回使用した環境は以下です。

  • Windows8.1 64bit
  • Talend Open Studio 6.2.0
  • Java 1.8
  • Mysql 5.7.10

試してみる

簡単な処理を作って試してみます。
DBから取得したデータをファイル出力するという簡単なプログラムでテストします。

talend_2016070401

テストデータの件数は1,000万件で試してみました。
私の環境では、普通にやると実行数十分後にエラーが発生します。
ストリームで処理するためには、tMysqlInputコンポーネントの詳細設定タブ、ストリームの有効化にチェックを付けます。

talend_2016070402

talend_2016070403

すると、1,000万件のデータを問題なく処理できるようになりました。
チェックを付けた場合、ソースコード的には以下の1文が追加されるということしか違いがないですが、
パフォーマンスは大幅に改善されました。

((com.mysql.jdbc.Statement) stmt_tMysqlInput_1).enableStreamingResults();

Postgresの場合

じゃあPostgresの場合はどうなのかと思って、tPostgresqlInputを見てみたところ、
詳細設定タブのカーソルの使用にチェックを入れれば同じような感じで行けそうです。
実際にPostgresにも1,000万件のデータを突っ込み、tPostgresqlInputコンポーネントとtMysqlInputコンポーネントを入れ替えて試してみました。
カーソルサイズは実行環境によってベストな値が変わってくるとは思うので、色々と試してみて頂ければよいと思います。
(今回の検証環境では5000くらいが早かったです)
talend_2016070404

おわりに

TalendでETL処理を作るときは、大量にデータを読み込む場合もあるとは思います。
そんな時、メモリリークとかで処理が失敗した時の参考になれば幸いです。