2017-09-27 66 views
1

我在2臺RHEL6服務器上使用MarkLogic 8進行集羣。 我在使用mlcp加載數據時遇到DEADLOCK(注意)錯誤。詳細信息:MLCP加載引發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集合,File2應該屬於DEF集合,File3應該屬於DE集合。

腳本: 我試圖通過使用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的線程將在時間寫入數據 成一個URI。死鎖怎麼可能?
  2. 爲什麼當一個查詢正在等待其他查詢完成時,它被稱爲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的死鎖問題。

當您在更新模式下觸摸文件,然後產生,調用或評估接觸同一文件的代碼時,通常會出現死鎖。產生,調用或evals的請求尚未完成,因此自動讀取或寫入鎖定尚未釋放。子進程確實看到了鎖,並且被迫等待直到它被釋放。雖然父進程將等待子進程完成,因此會導致死鎖。

由於MLCP會打開持久的事務並且會發出多個參與相同事務的調用,所以MLCP會變得更復雜一些。只有在整個長期交易被釋放之前,這些自動鎖纔會被釋放。因此,如果MLCP試圖在相同的事務中插入相同的文件兩次,那就麻煩了。

有可能是一種方法來檢查它是否真的是MLCP造成麻煩。有幾個命令行參數用於控制使用多少個線程,以及一個事務中包含多少個請求。嘗試使用:

-transaction_size 1 -batch_size 1 

此外,如果你真的想處理順序的方式你的文件,添加此附加:

-thread_count 1 

你可以只用import命令運行鋁塑複合(並且沒有其他參數)獲得所有命令行選項的摘要。

HTH!

+0

非常感謝@grtjn。 我想我在某種程度上已經想到了。我認爲這是因爲我所做的集羣設置。如前所述,我有兩臺服務器集羣。但是我沒有提到的是我在兩臺服務器上都有一個森林。即Forest1位於服務器1存儲上,而Forest2位於服務器2存儲上。此外,兩臺服務器都位於不同的網絡上。 我刪除了一個森林,我都跑得很好。 不過,我想知道爲什麼這樣的設置會造成死鎖? – 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