Загрузка MLCP вызывает DeadLock - MarkLogic 8

Я использую MarkLogic 8 на 2 серверах RHEL6, которые сгруппированы в кластер. Я столкнулся с ошибками DEADLOCK (уведомление) при загрузке данных с помощью mlcp. Подробности:

Данные: 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.

Сценарий: я пытался добиться этого, загружая каждый CSV индивидуально с помощью 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

Проблема: некоторые файлы загрузились в MarkLogic без ошибок. Однако в журналах я вижу сообщения DEADLOCK уровня «Уведомление», и загрузка останавливается.

Вопрос: я понимаю, что DEADLOCK возникает, когда 2 или более запросов (обновлений) пытаются заблокировать URI, который уже содержит блокировку записи.

  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")

person Bharadwaj    schedule 27.09.2017    source источник
comment
Есть ли в игре преобразование MLCP? Или, может быть, CPF или триггер?   -  person grtjn    schedule 27.09.2017
comment
Никаких преобразований, как вы видите в команде mlcp. Не активировал CPF / Триггеры. Это простая загрузка mlcp.   -  person Bharadwaj    schedule 27.09.2017
comment
Сколько строк в этих файлах CSV? Можете ли вы опубликовать пример URI, регистрирующих взаимоблокировки? Соответствуют ли сгенерированные URI ожидаемому шаблону, то есть filename-split-sequence.xml? Включено ли создание каталогов в вашей базе данных контента? help.marklogic.com/knowledgebase/article/View/ 17/16 /   -  person Mads Hansen    schedule 28.09.2017


Ответы (1)


Я действительно не понимаю, почему вы заходите в тупик. Я все еще подозреваю, что это сообщение генерирует что-то за пределами MLCP. Может ли быть какое-то расписание или какой-то совершенно отдельный процесс, вызывающий сообщения?

Я могу попытаться подробнее объяснить тупиковые ситуации в отношении MLCP.

Взаимоблокировки обычно возникают, когда вы касаетесь файла в режиме обновления, а затем порождаете, вызываете или оцениваете код, который касается того же файла. Запрос, который порождается, вызывает или отменяет, еще не завершен, поэтому автоматическая блокировка чтения или записи еще не снята. Подпроцесс действительно видит блокировку и вынужден ждать, пока она не будет снята. Однако родительский процесс будет ждать завершения подпроцесса, отсюда и тупик.

С MLCP становится немного сложнее, так как MLCP будет открывать длительные транзакции и генерировать несколько вызовов, участвующих в одной транзакции. Эти автоматические блокировки не будут сняты до тех пор, пока не будет снята вся длительная транзакция. Поэтому, если MLCP попытается дважды вставить один и тот же файл в одну транзакцию, это будет проблемой.

Может быть способ проверить, действительно ли проблема возникает из-за MLCP. Есть несколько аргументов командной строки, которые управляют количеством используемых потоков и количеством запросов, включенных в одну транзакцию. Попробуйте использовать:

-transaction_size 1 -batch_size 1

Кроме того, если вы действительно хотите обрабатывать файлы последовательно, добавьте это дополнительно:

-thread_count 1

Вы можете запустить MLCP с помощью только команды import (без других аргументов), чтобы получить сводку всех параметров командной строки.

HTH!

person grtjn    schedule 27.09.2017
comment
Большое спасибо @grtjn. Думаю, в какой-то степени я это понял. Я думаю, это из-за созданной мной кластерной настройки. Как упоминалось ранее, у меня было 2 сервера, которые сгруппированы в кластер. Но я не упомянул, что у меня по 1 лесу на обоих серверах. то есть Forest1 находится в хранилище сервера 1, а Forest2 находится в хранилище server2. Кроме того, оба сервера находятся в разных сетях. Я удалил один лес, и все у меня отлично работает. Все-таки интересно, почему тупик даже при такой настройке? - person Bharadwaj; 29.09.2017
comment
Я добавил обратно кластерный сервер и попробовал параметры -transaction_size, -batch_size и -thread_count. Я вижу, что когда я не упоминаю -thread_count [т.е. когда thread_count по умолчанию равен 4], происходит DEADLOCK. Похоже, что большее количество потоков в такой настройке заставляет MLCP обращаться к одному и тому же документу более одного раза за одну транзакцию. Я нахожу это странным! Пожалуйста, помогите понять причину. - person Bharadwaj; 02.10.2017
comment
Возможно, вы нашли ошибку в MLCP. Не могли бы вы попробовать последнюю версию MLCP? Если это не помогает, рассмотрите возможность подачи заявки на странице github.com/marklogic/marklogic-contentpump .. - person grtjn; 02.10.2017
comment
Ты прав! Я использовал версию 8-0-6. 9-0-3 (последний) не выдает таких ошибок DEADLOCK уровня 'Notice' [хотя очень медленно ... интересно, какое максимальное количество потоков я могу назначить :)] - person Bharadwaj; 03.10.2017