Kettleを使用した大規模データ移行のパフォーマンス最適化手法

MySQLの最適化設定

データ移行先としてMySQLを使用する場合、以下の設定により大幅なパフォーマンス向上が見込めます。ここでは一時的なデータ移行用途としてMySQLを設定します。

MySQLのインストールと設定

  • Oracle公式サイトから64bit版MySQLをダウンロード
  • 任意のディレクトリに解凍(例:D:\mysql-5.7.26-winx64)
  • my.iniファイルを作成し以下の設定を記述
[mysqld]
port=3306
basedir=D:\mysql-5.7.26-winx64\
datadir=D:\mysql-5.7.26-winx64\data
net_buffer_length=5242880
max_allowed_packet=104857600
bulk_insert_buffer_size=104857600
max_connections = 1000
innodb_flush_log_at_trx_commit = 2
# このシナリオではMyISAMがInnoDBより約2倍高速
default-storage-engine=MyISAM
general_log = 1
general_log_file=D:\mysql-5.7.26-winx64\logs\mysql.log
innodb_buffer_pool_size = 36G
innodb_log_files_in_group=2
innodb_log_file_size = 500M
innodb_log_buffer_size = 50M
sync_binlog=1
innodb_lock_wait_timeout = 50
innodb_thread_concurrency = 16
key_buffer_size=82M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=100M
transaction_isolation=READ-COMMITTED

Kettleの最適化

起動パラメータの調整

大容量メモリ環境でのOOM(Out of Memory)を防ぐため、環境変数PENTAHO_DI_JAVA_OPTIONSを設定します:

PENTAHO_DI_JAVA_OPTIONS = -Xms20480m -Xmx30720m -XX:MaxPermSize=1024m

テーブル入出力のマルチスレッド化

テーブル入力でマルチスレッドを有効にすると、データが重複して取得される可能性があります。Oracleソースの場合、以下のクエリを使用してデータを分割します:

SELECT * FROM (
  SELECT source_data.*, rownum as row_num 
  FROM source_data
) 
WHERE mod(row_num, ${Internal.Step.Unique.Count}) = ${Internal.Step.Unique.Number}

このクエリの説明:

  • rownumはOracleがクエリ結果に割り当てる連番です
  • mod関数は割り算の余りを計算します
  • Internal.Step.Unique.CountInternal.Step.Unique.NumberはKettleの組み込み変数で、それぞれ総スレッド数と現在のスレッド番号を表します

テーブル出力コンポーネントでは、以下の設定を調整します:

  • 「変更開始コピー数」を適切な値に設定
  • コミットサイズを調整(デフォルトは100)
  • 「テーブルの切り捨て」オプションを無効化(マルチスレッド環境での競合を避けるため)
  • データベースフィールドを明示的に指定
  • バッチ挿入を有効化

JDBCパラメータの最適化

接続文字列に以下のパラメータを追加します:

  • characterEncoding GBK
  • rewriteBatchedStatements true
  • useServerPrepStmts false
  • useCompression true

パフォーマンス測定とチューニング

異なるスレッド数とコミットサイズの組み合わせをテストし、最適な設定を見つけます。監視ツールを使用して、Oracleからの読み取り速度とMySQLへの書き込み速度をリアルタイムで確認します。

さらなる改善の可能性

  1. SSDストレージへの移行
  2. MySQLパラメータのさらなる最適化
  3. TokuDBなど、別のストレージエンジンの検討
  4. StreamSetsやDataXなど、別のETLツールの評価
  5. ClickHouse、TiDB、Cassandraなど、別のデータベースへの移行
  6. Kettleクラスターの構成による分散処理

タグ: Kettle Pentaho MySQL Oracle ETL

6月29日 23:11 投稿