我在两个集群的RHEL6服务器上使用RHEL6 8。在使用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集合。
脚本:我试图通过使用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中,没有任何错误。但是,我在日志中看到了“通知”级别的死锁消息,加载被延迟。
问题:我理解当两个或更多的查询(更新)试图锁定已经持有写锁的URI时,就会发生死锁。
我看到下面的代码是作为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")发布于 2017-09-27 18:51:21
我真不明白你为什么会死掉。我仍然怀疑MLCP之外的东西正在产生这些信息。会不会有一些日程安排,或者仅仅是一些完全独立的进程导致消息?
我可以尝试解释与MLCP有关的死锁。
死锁通常发生在您在更新模式下触摸一个文件,然后生成、调用或使用与同一文件有关的代码时。生成、调用或传递的请求尚未完成,因此尚未释放自动读或写锁。子进程确实看到了锁,并被迫等待直到它被释放。但是父进程将等待子进程完成,因此出现了死锁。
对于MLCP,它变得更加复杂,因为MLCP将打开持久的事务,并会发出参与同一事务的多个调用。在整个持久事务被释放之前,这些自动锁不会被释放。因此,如果MLCP试图在同一个事务中插入同一文件两次,那就麻烦了。
也许有一种方法可以检查是否真的是MLCP造成了麻烦。有几个命令行参数控制使用了多少个线程,以及在一个事务中包含了多少个请求。试着使用:
-transaction_size 1 -batch_size 1此外,如果您确实希望按顺序处理文件,请另外添加以下内容:
-thread_count 1您可以只使用import命令(不使用其他参数)运行MLCP,以获得所有命令行选项的摘要。
哈哈!
https://stackoverflow.com/questions/46439200
复制相似问题