2017-09-27 4 views
1

クラスタ化された2つのRHEL6サーバーでMarkLogic 8を使用しています。 mlcpを使用してデータをロードする際にDEADLOCK(通知)エラーが発生することがあります。詳細:MLCP load throw DeadLock - MarkLogic 8

データ: 500+ CSVファイル

File name Examples: 
File1: 20170927_**ABC**_XX_YY.CSV 
File2: 20170927_**DEF**_QX_QY.CSV 
File3: 20170927_**DE**_QX_QY.CSV 

要件: 私は、負荷時にコレクションに各CSVを割り当てる際、これらの文書をロードする必要があります。 したがって、File1はABC Collectionに属し、File2はDEFコレクションに属し、File3はDE collectionに属している必要があります。

スクリプト: mlcpを使用して各CSVを個別に読み込むことでこれを達成しようとしました。

#!/bin/sh 
listFiles=`ls -l /location/*.CSV | awk '{print $9}'` 
for each in $listFiles 
do 
    collName=`echo $each | cut -d_ -f2` 
    $MLCP_HOME/mlcp.sh import -mode local -options_file connect.txt \ 
    -input_file_path $each -input_file_type delimited_text \ 
    -generate_uri -output_collections $collName 
done 

問題: ファイルの一部がエラーなしMarkLogicにロードされてしまっています。 しかし、ログに「通知」レベルのDEADLOCKメッセージが表示され、読み込みがストールしています。

質問:2つ以上のクエリ(更新)が既に書き込みロックを保持しているURIをロックしようとすると、DEADLOCKが発生することが分かります。

  1. 私は、mlcp負荷の任意の数のスレッドが1度に1つのURIにデータ を書き込むことを望んでいました。デッドロックはどのように可能ですか?
  2. へのもう1つのクエリが完了するのを1つのクエリが待っているときに、それがDEADLOCKと呼ばれるのはなぜですか?キューイングだけではないのですか?

marklogicドキュメントのデッドロックの例として、次のコードがあります。なぜそれがデッドロックであるのか分かりません。あるコマンドがもう一方のコマンドを完了するのを待っています。

(: the next line ensures this runs as an update statement :) 
if (1 = 2) then (xdmp:document-insert("foobar", <a/>)) else(), 
doc("/docs/test.xml"), 
xdmp:eval("xdmp:node-replace(doc('/docs/test.xml')/a, <b>goodbye</b>)", 
     (), 
      <options xmlns="xdmp:eval"> 
      <isolation>different-transaction</isolation> 
      </options>) , 
doc("/docs/test.xml") 
+0

再生中のMLCP変換はありますか?またはCPFまたはトリガーですか? – grtjn

+0

mlcpコマンドで見られるように変換されません。 CPF /トリガを有効にしませんでした。プレーンなmlcp負荷です。 – Bharadwaj

+0

これらのCSVファイルにはいくつの行がありますか?デッドロックをログに記録しているURIの例を投稿できますか?生成されたURIが予想されるパターン(filename-split-sequence.xml)と一致していますか?コンテンツデータベースでディレクトリの作成を有効にしていますか? https://help.marklogic.com/knowledgebase/article/View/17/16/understanding-xdmp-deadlock –

答えて

2

デッドロックが発生する理由はわかりません。私はまだMLCP以外の何かがそれらのメッセージを生成していると思われるでしょう。いくつかのスケジュールやメッセージを引き起こす完全に別のプロセスがありますか?

MLCPに関するデッドロックについてもう少し説明してみることができます。

デッドロックは、通常、更新モードでファイルに触れ、同じファイルに触れるコードを生成、呼び出し、または評価すると発生します。スポーン、呼び出し、またはエバールの要求はまだ完了していないため、自動読み取りまたは書き込みロックはまだ解放されていません。サブプロセスはロックを確認し、ロックが解除されるまでロックを強制します。親プロセスはサブプロセスが完了するのを待つため、デッドロックが発生します。

MLCPは長期にわたるトランザクションを開き、同じトランザクションに参加する複数のコールを発信するため、MLCPと少し複雑になります。これらの自動ロックは、永続的なトランザクション全体が解放されるまで解放されません。 MLCPが同じトランザクションで同じファイルを2回挿入しようとすると、それが問題になります。

本当に問題を引き起こしているMLCPかどうかを確認する方法があるかもしれません。使用されるスレッドの数と、1つのトランザクションに含まれる要求の数を制御するコマンドライン引数がいくつかあります。使用してみてください:

-transaction_size 1 -batch_size 1 

また、あなたが本当に連続的にあなたのファイルを処理したい場合は、さらにこれを追加します。

-thread_count 1 

あなただけimportコマンド(なし他の引数とMLCPを実行することができます)を使用して、すべてのコマンドラインオプションの概要を取得します。

HTH!

+0

ありがとうございました@grtjn。 私はそれをある程度考えたと思います。私はそれが私が作ったクラスタ化されたセットアップのためだと思う。 前述のように、私はクラスタ化された2台のサーバーを持っていました。しかし、私が言及しなかったのは、私は両方のサーバーにそれぞれ1つのフォレストがあるということでした。つまり、Forest1はサーバー1のストレージにあり、Forest2はサーバー2のストレージにあります。さらに、両方のサーバが異なるネットワーク上にある。 私は1つのフォレストを削除し、私はすべての素晴らしい実行している。 まだ、このような設定でもデッドロックがなぜ発生するのだろうか? – Bharadwaj

+0

クラスタ化されたサーバーを追加して、-transaction_size、-batch_size、および-thread_countオプションを試しました。 -thread_countについて言及していないとき(つまり、thread_countがデフォルトで4に設定されているとき)、DEADLOCKが発生します。 このような設定でもっと多くのスレッドが存在するように見えるため、MLCPは単一のトランザクションで同じ文書に複数回アクセスすることになりました。理由を理解するのを助けてください。 – Bharadwaj

+1

MLCPにバグが見つかりました。最新のMLCPで試してみませんか?それが助けにならない場合は、チケットをhttps://github.com/marklogic/marklogic-contentpumpで提出することを検討してください。 – grtjn

関連する問題