2017-09-27 10 views
1

J'utilise MarkLogic 8 sur 2 serveurs RHEL6 en cluster. Je suis confronté à des erreurs DEADLOCK (Notice) lors du chargement des données en utilisant mlcp. Détails:Chargement MLCP DeadLock - MarkLogic 8

données: 500+ fichiers CSV

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

Exigence: je dois charger ces documents tout en attribuant chaque CSV à une collection pendant la charge. Donc, File1 devrait appartenir à ABC Collection, File2 devrait appartenir à la collection DEF et File3 devrait appartenir à la collection DE.

Script: J'ai essayé d'y parvenir en chargeant chaque CSV individuellement en utilisant mlcp.

#!/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 

Problème: Certains fichiers ont obtenu chargés dans MarkLogic sans aucune erreur. Cependant, je vois des messages DEADLOCK de niveau 'Notice' dans les journaux et le chargement est bloqué. Je comprends que DEADLOCK se produit lorsque deux requêtes ou plus (mises à jour) tentent de verrouiller un URI qui contient déjà un verrou d'écriture.

  1. J'espérais que tout nombre de threads de charge PCML rédigera des données dans un URI à la fois. Comment est-ce qu'un DEADLOCK est possible?
  2. Pourquoi est-ce appelé un DEADLOCK lorsqu'une requête est en attente pour l'autre requête terminée. Ne fait-il pas juste la queue?

Je vois que le code suivant a été donné comme exemple de blocage dans les documents marklogic. Je ne comprends pas pourquoi est-ce une impasse. Une commande attend que l'autre soit terminée.

(: 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

Y a-t-il une transformation MLCP en jeu? Ou peut-être CPF ou un déclencheur? – grtjn

+0

Non Transforme comme vous le voyez dans la commande mlcp. N'a pas activé CPF/Triggers. C'est une charge simple de mlcp. – Bharadwaj

+0

Combien de lignes y a-t-il dans ces fichiers CSV? Pouvez-vous publier un exemple d'URI qui enregistrent des interblocages? Les URI générés correspondent-ils au modèle attendu, c'est-à-dire filename-split-sequence.xml? Avez-vous activé la création d'annuaire sur votre base de données de contenu? https://help.marklogic.com/knowledgebase/article/View/17/16/understanding-xdmp-deadlock –

Répondre

2

Je ne vois pas vraiment pourquoi vous avez des blocages. Je soupçonnerais toujours que quelque chose en dehors du MLCP génère ce message. Pourrait-il y avoir un calendrier ou juste un processus entièrement séparé causant les messages?

Je peux essayer d'expliquer un peu plus les blocages par rapport à MLCP.

Les blocages se produisent normalement lorsque vous touchez un fichier en mode de mise à jour, puis générez, invoquez ou évaluez le code qui touche le même fichier. La requête qui génère, invoque ou évalue n'est pas encore terminée, de sorte que le verrou de lecture ou d'écriture automatique n'est pas encore libéré. Le sous-processus voit le verrou et est forcé d'attendre jusqu'à ce qu'il soit libéré. Le processus parent attendra le sous-processus pour terminer, d'où le blocage.

Il devient un peu plus complexe avec MLCP, puisque MLCP va ouvrir des transactions de longue durée, et émettra plusieurs appels participant à la même transaction. Ces verrous automatiques ne seront pas libérés jusqu'à ce que toute la transaction de longue durée soit libérée. Donc, si MLCP essaie d'insérer deux fois le même fichier dans la même transaction, ce sera un problème.

Il pourrait y avoir un moyen de vérifier si c'est vraiment le MLCP qui cause le problème. Il existe quelques arguments de ligne de commande qui contrôlent le nombre de threads utilisés et le nombre de requêtes incluses dans une transaction.Essayez d'utiliser:

-transaction_size 1 -batch_size 1 

De plus, si vous voulez vraiment traiter vos fichiers de manière séquentielle, ajoutez en plus:

-thread_count 1 

Vous pouvez exécuter PCML avec juste la commande import (et pas d'autres arguments) pour obtenir un résumé de toutes les options de la ligne de commande.

HTH!

+0

Merci beaucoup @grtjn. Je pense que je l'ai compris dans une certaine mesure. Je pense que c'est à cause de la configuration en cluster que j'ai faite. Comme mentionné précédemment, j'avais 2 serveurs qui sont regroupés. Mais ce que je n'ai pas mentionné, c'est que j'ai 1 forêt chacun sur les deux serveurs. Par exemple, Forest1 est sur le stockage du serveur 1 et Forest2 sur le stockage server2. En outre, les deux serveurs sont sur un réseau différent. J'ai enlevé une forêt et tout fonctionne très bien. Pourtant, je me demande pourquoi l'impasse, même avec une telle configuration? – Bharadwaj

+0

J'ai ajouté le serveur en cluster et essayé les options -transaction_size, -batch_size et -thread_count. Je vois que quand je ne mentionne pas -thread_count [c'est-à-dire, quand le thread_count est par défaut à 4], le DEADLOCK se produit. On dirait que plus de threads dans une telle configuration obligent MLCP à accéder au même document plus d'une fois dans une seule transaction. Je trouve ça bizarre! S'il vous plaît aider à comprendre la raison. – Bharadwaj

+1

Vous avez peut-être trouvé un bug dans MLCP. Pourriez-vous essayer avec le dernier MLCP? Pensez à déposer un ticket sur https://github.com/marklogic/marklogic-contentpump si cela ne vous aide pas .. – grtjn