【问题标题】:Is there any way to check if all the spawned tasks on the task server is completed in marklogic?有没有办法检查任务服务器上的所有派生任务是否在marklogic中完成?
【发布时间】:2023-04-10 06:22:01
【问题描述】:

我正在使用 ML 8。

有没有办法检查任务任务服务器上的队列大小是否为零(所有衍生的任务都被消耗掉了)?

为什么我需要这个:

我必须生成 10k 任务,这些 10K 任务将在 D 驱动器中创建 10K xml 文件(使用 xdmp:save

一旦生成了这 10K 文件,我就生成了另一个 20k 任务,并且必须将 20K xml 文件保存在 D 驱动器中,在这 20K 任务中,我必须利用之前生成的 10K 任务的结果(保存在 D 驱动器中的 10k 文件)

然后生成另一个 25k 任务,再次将 25K 文件保存在 D 驱动器中,并且在处理时需要先前生成的任务的结果,即 20K xml 文件。

等等……

目前我正在手动执行此操作,我的意思是我将生成第一组 10K 文件,并将在 8001 端口监视任务服务器状态。一旦队列大小达到零,我将去 qconsole 并生成另外 20K 文件等等......

我想用代码来实现。

类似:

生成 10K 文件; 等到所有生成的 10k 任务完成(这必须使用代码检查); 产生另外 20k 个任务等等......

请帮忙,如果需要更多详细信息,请告诉我。

【问题讨论】:

  • 是否有理由希望通过代码而不是通过 MLCP、Corb 或数据移动 API 等外部工具来完成此任务?您最终尝试使用什么机制来重新检查是否该重新开始 - 您现在在查询控制台中手动点击运行。您是否计划过一项计划任务来代替人工步骤?
  • 对 MLCP 或 Corb 不太了解。目前我会去IP:8001端口检查任务服务器的状态,我会继续检查任务服务器的状态页面,因为队列大小手动归零我将从qconsole运行第二组。我无法使用计划任务,因为我不知道上一个任务的完成时间。
  • 但如果您在代码中执行此操作并确保队列为空,那么您可以使用计划任务 - 如果未完成,则不执行任何操作,否则开始下一批。话虽如此,请参阅我对使用其他工具的回复和建议。
  • 你也可以考虑使用taskbot github.com/mblakele/taskbot

标签: marklogic marklogic-8


【解决方案1】:

在完整阅读您的帖子时,我强烈建议您查看以下选项:

  • CORB2(使用 xdmp:save)
  • MLCP(如果您只是尝试使用 shell 命令和配置文件按原样导出内容,这是自然的选择)
  • Data Movement SDK(一个强大的 Java 工具包,包含上述两者的优点)

但要回答标题中的具体问题,请参见下文:

请记住,作为 MarkLogic 无共享架构的一部分,任务队列是每个主机的,而不是集群范围的数字。但是,由于您当前的方法是使用查询控制台,因此您已经将自己隔离到单个主机。

你想要的实际命令是:

xdmp:server-status()

这将为您提供相当多的信息。返回 XML 中的一项称为请求状态。根据当前运行的任务,依靠它可以为您提供您正在寻找的东西。您还可以找出完整的队列大小。当然,如果还有其他任何东西在使用任务队列,那么这些都没有帮助,因为您不知道与您的处理和任务队列上的其他项目相关的内容。

以下代码示例将一些任务加载到队列中,并演示如何获取队列大小和当前正在运行的任务。

xquery version "1.0-ml";
for $x in 1 to 10
  for $y in 1 to 10
    return xdmp:spawn-function(function(){
      xdmp:sleep(1000)
    })
;

let $id := fn:data(xdmp:host-status(xdmp:host())//*:task-server/*:task-server-id)
return for $x in 1 to 10
 let $_ := xdmp:sleep(1000)
 return 
   element {"current-status"} {
     attribute {"queued"} {xdmp:server-status(xdmp:host(),$id)//*:queue-size/text()},   
     attribute {"being-processed"} {fn:count(xdmp:server-status(xdmp:host(),$id)//*:request-statuses/*)} 
}

在我的任务服务器有 16 个线程的机器上,我得到以下示例输出,显示两个数字都用尽了。

<current-status queued="68" being-processed="16"/>
<current-status queued="52" being-processed="16"/>
<current-status queued="36" being-processed="16"/>
<current-status queued="20" being-processed="16"/>
<current-status queued="4" being-processed="16"/>
<current-status queued="0" being-processed="4"/>
<current-status queued="0" being-processed="0"/>
<current-status queued="0" being-processed="0"/>
<current-status queued="0" being-processed="0"/>
<current-status queued="0" being-processed="0"/>

【讨论】:

  • 另外,如果您最终使用 CORB,而不是 xdmp:save,您还可以将您的作业配置为使用 ExportToFileTask 将每个文档写入文件。不同之处在于 Java 进程正在写入文件,而不是 MarkLogic 服务器,这样可以更轻松地写入单个路径,而无需为服务器安装共享空间或在事后收集它们@ 987654324@.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多