LoginSignup
0
0

More than 3 years have passed since last update.

MarkLogicのContent Pump(mlcp)でのCSVファイルのロードとチューニング

Last updated at Posted at 2020-03-22

概要

MarLogic Content Pump(以下、mlcp)を使ったデータロードをWindowsノートPC上で実行した際に色々とパラメータを動かしてみたので、その結果を示します。結論から言うと、性能面ではmlcpスレッド数・DB索引設定・ディスク性能の3つが効きました。

実行環境

項目 詳細
OS Windows10 Home
CPU インテル® Core™ i7-4710MQ プロセッサー 4core/8スレッド
メモリ 16GB
Java jdk1.8.0_241
MarkLogic 10.0.3
mlcp 10.0.3

前提条件

・MarkLogicやJavaのインストール済み
・mlcp実行ファイルがダウンロード済み
・MarkLogic内にフォレスト/データベース/XDBCサーバ(ポート8062番)が作成済み

試験対象パラメータ

データロードは速いに越したことはないのですが、mlcpコマンドやDBパラメータなどを色々と調整してみることにしました。

1) mlcpパラメータ

項目 説明
-thread_count 実行時のスレッド数設定。デフォルトは4。
-batch_size 1リクエスト当たりの更新実行数。デフォルトは100。最大200。
-transaction_size 1トランザクション当たりのリクエスト数。デフォルトは10。最大値は4000/actualBatchSizeに制限される。
-split_input CSVなどをロードする際にファイルを分割して実行するオプション。
-max_split_size ファイル分割時の1ファイル当たりの最大バイト数指定

2) DBパラメータ
「fast 〇〇 searches」系の3個はデフォルトはtrueなのですが、falseも試してみました。理由は日本語データのシステム開発をする上で、重要性が低いと思われるためです。

項目 説明
language トークナイズ文法の規定。jaに変更。
fast phrase searches 2つの単語を組み合わせるといった句への検索のための索引
fast case sensitive searches 大文字小文字を区別する検索のための索引
fast diacritic sensitive searches ラテン文字などにみられる発生区別符号を区別する検索のための索引

3) フォレスト配置
・HDD上で1または2個設定~2coreに対して1Forestという指標があるため。
・HDD/SSD

4)ウイルス対策ソフトの起動/停止

データの準備

適当なCSVファイルを作りました。サイズは286MBです。1行目に列名としてdata1~data50を配置し、データには"sample"と5桁の数字を文字列連結したものを50万行ならべました。このファイルをC:\work\load_csvに置きます。
データロード後にはCSV1行が1個のXML形式データとして格納されます。

data1,data2,...,data50
sample46911,sample78291,...,sample99999
...

mlcpの実行コマンド

コマンドプロンプトを開いて、mlcp実行ファイルを置いたディレクトリ(今回はC:\work\mlcp\bin)に移動します。その上でバッチファイルを実行します。以下は、スレッド数16、バッチサイズ200、トランザクションサイズ20、ファイル分割を20MBを上限に実施というオプションを設定したものです。
(見やすいように適当なところで改行しています。)

mlcp.bat import -host localhost -input_file_path C:\work\load_csv -host localhost ^ 
-port 8062 -username admin -password admin ^ 
-output_uri_replace "/C:/work/load_csv, '/load_csv'" ^
-input_file_type delimited_text -delimiter "," ^
-generate_uri true -thread_count 16 ^ 
-batch_size 200 -transaction_size 20 ^ 
-split_input true -max_split_size 20971520

実施結果

表にまとめます。全てのパターンを検証する訳にはいかなかったので、ある程度で見切りをつけています。

thread batch transaction size max split size ウイルス対策 フォレスト数 ディスク 索引削除 処理時間[秒]
4 100 10 - 1 HDD 設定 252
16 100 10 - 1 HDD 設定 209
16 100 10 - 1 HDD 設定 215
16 200 5 - 1 HDD 設定 213
16 200 10 - 1 HDD 設定 222
16 200 20 - 1 HDD 設定 213
16 200 20 20MB 1 HDD 設定 208
16 200 20 40MB 1 HDD 設定 233
16 200 20 - 1 HDD case, diacriticを無効 211
16 200 20 - 1 HDD phrase, case, diacriticを無効 172
16 200 20 - 2 HDD phrase, case, diacriticを無効 156
16 200 20 - 1 SSD phrase, case, diacriticを無効 105
16 200 20 - 2 SSD phrase, case, diacriticを無効 103

分析

・DB索引のうち、phraseの無効化は効果があった(211→172秒)。
・thread_countを4→16とすることで、処理時間が252→209秒と改善した。ただし、16にしてもCPUが90%を超えることはなかった。ディスクIOネックと推測。他のmlcpパラメータやウイルス対策ソフト停止は効果が低い。
・フォレストをSSDに置くとCPU使用率が100%近くとなって、ほぼほぼリソースを使い切ったと推測。
・フォレストの追加はHDDだと若干の効果があったが、SSDだとCPUネックのためか効果は見られない。

mlcpのチューニングを行う心構え

改めてmlcpを使う上での心構えを整理します。
・DBパラメータで設定できる索引は、業務要件を鑑みて必要最小限とする。デフォルトのものでも不必要であれば削除するべきである。
・mlcpパラメータで最も重要なのはthread_countである。少なくともCPU数と同数から開始する。スレッド数を大きくすると負荷も上がることから、他の処理は行わないこと。
・今回のようにmlcp実行とMarkLogicを同一端末にするのは実際のシステム開発ではMarkLogicの負荷の大きさやリソース分析の観点からNGと思われる。
・(当然ながら)ディスクはHDDよりSSDがよい。また(今回は未検証だが)各フォレストごとに別々のディスクとする。
・CPUネックとなった場合は、別のEノードを追加するスケールアウトを行う。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0