2017-09-27 24 views
1

클러스터 된 2 개의 RHEL6 서버에서 MarkLogic 8을 사용하고 있습니다. mlcp를 사용하여 데이터를로드하는 중 DEADLOCK (Notice) 오류가 발생했습니다. 세부 :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 Collection에 속해야하며 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 메시지가 표시되고로드가 지연되었습니다.

질문 : 두 개 이상의 쿼리 (업데이트)가 이미 쓰기 잠금을 보유하고있는 URI에 대한 잠금을 시도 할 때 DEADLOCK이 발생하는 것으로 알고 있습니다.

  1. mlcp로드의 스레드가 한 번에 하나의 URI에 데이터 을 쓸 것이라고 기대하고있었습니다. 데드락은 어떻게 가능합니까?
  2. 하나의 쿼리가 의 다른 쿼리를 기다리는 동안 DEADLOCK이라고하는 이유는 무엇입니까? 대기열에만 머 무르지 않습니까?

다음 코드는 marklogic docs의 교착 상태의 예입니다. 왜 그것이 교착 상태인지 이해할 수 없습니다. 한 명령이 다른 명령이 완료 될 때까지 기다리는 중입니다.

(: 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가 동일한 트랜잭션에서 동일한 파일을 두 번 삽입하려고하면 문제가 발생합니다.

실제로 문제를 일으키는 MLCP인지 확인하는 방법이있을 수 있습니다. 사용되는 스레드 수와 한 트랜잭션에 포함되는 요청 수를 제어하는 ​​몇 가지 명령 줄 인수가 있습니다.사용해보십시오 없습니다 : 당신이 정말로 순차적 인 방식으로 파일을 처리하려면

-transaction_size 1 -batch_size 1 

또한,이 또한 추가

-thread_count 1 

당신은 단지 import 명령을 MLCP을 실행할 수 있습니다 (그리고 다른 인수)를 사용하여 모든 명령 행 옵션의 요약을 가져옵니다.

HTH!

+0

감사합니다. @ grtjn. 나는 그것을 어느 정도 이해했다고 생각한다. 나는 내가 만든 클러스터 된 설정 때문이라고 생각합니다. 앞서 언급했듯이 클러스터 된 2 대의 서버가 있습니다. 그러나 내가 언급하지 않은 것은 두 서버에 각각 포레스트 1 개가 있다는 것입니다. 즉, Forest1은 서버 1 저장소에 있고 Forest2는 server2 저장소에 있습니다. 또한 두 서버가 서로 다른 네트워크에 있습니다. 포리스트 하나를 제거했으며 모두 잘 돌아갔습니다. 아직도, 그런 설정으로도 교착 상태가 왜 생겼는지 궁금합니다. – 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