MarkLogic CORB - Как избежать тайм-аута при запуске corb

Как избежать тайм-аута CORB при запуске большого пакета данных, превышающего 10 миллионов документов pdf / xml? Мне нужно уменьшить количество потоков и размер пакета.

uris-module:

let $uris := cts:uris(
(),
(),
cts:and-query((
    cts:collection-query("/sites"),
    cts:field-range-query("cdate","<","2019-10-01"),
    cts:not-query(
        cts:or-query((
            cts:field-word-query("dcax","200"),
            more code...,
            ))
    )
))
return (fn:count($uris), $uris)

process.xqy:

declare variable $URI as xs:string external;
let $uris := fn:tokenize($URI,";")
let $outputJson := "/output/json/"
let $outputPdf := "/output/pdf/"

for $uri1 in $uris
let $accStr := fn:substring-before(fn:substring-after($uri1,"/sites/"),".xml")
let $pdfUri := fn:concat("/pdf/iadb/",$accStr,".pdf")
let $doc := fn:doc($uri1)
let $obj := json:object()
let $_ := map:put($obj,"PaginationOrMediaCount",fn:number($doc/rec/MediaCount))
let $_ := map:put($obj,"Abstract",fn:replace($doc/rec/Abstract/text(),"[^a-zA-Z0-9 ,.\-\r\n]",""))
let $_ := map:put($obj,"Descriptors",json:to-array($doc/rec/Descriptor/text()))
    let $_ := map:put($obj,"FullText",fn:replace($doc/rec/FullText/text(),"[^a-zA-Z0-9 ,.\-\r\n]",""))
let $_ := xdmp:save(
    fn:concat($outputJson,$accStr,".json"),
    xdmp:to-json($obj)
)
let $_ := if (fn:doc-available($pdfUri))
    then xdmp:save(
        fn:concat($outputPdf,$accStr,".pdf"),
        fn:doc($pdfUri)
    )
    else ()

return $URI

person thichxai    schedule 19.02.2020    source источник
comment
Было бы полезно, если бы вы предоставили более подробную информацию. Например, код, который выполняется, и указание того, истекает ли время выполнения модуля URI или выполнения модуля преобразования, которое истекает.   -  person Mads Hansen    schedule 20.02.2020
comment
тайм-аут при выполнении модуля преобразования. Я также добавил код uris и модуль процесса   -  person thichxai    schedule 20.02.2020
comment
Насколько велик ваш РАЗМЕР ПАРТИИ? Вы пытались уменьшить его, чтобы делать меньше при вызове модуля процесса? Возможно, вы пытаетесь сделать слишком много за один вызов модуля. Также убедитесь, что вы можете запустить xdmp:save() по этому пути и нет проблем с записью в файловую систему.   -  person Mads Hansen    schedule 20.02.2020
comment
THREAD-COUNT = 16 BATCH-SIZE = 10000   -  person thichxai    schedule 20.02.2020
comment
Да, обрабатывать сразу 10к документов - это много. Вы используете пакетный инструмент для распределения нагрузки. Я бы уменьшил размер пакета (даже просто использовал размер пакета 1) и вместо этого попытался бы настроить пропускную способность, регулируя количество потоков. Вы сможете записывать только файл за раз в модуле процесса, поэтому вы получите больше параллелизма за счет распределения большего количества потоков вместо больших размеров пакета.   -  person Mads Hansen    schedule 20.02.2020
comment
Спасибо за рекомендацию. Я вижу, что corb работает быстрее и улучшает производительность.   -  person thichxai    schedule 20.02.2020


Ответы (1)


Было бы легче диагностировать и предлагать улучшения, если бы вы поделились параметрами задания CoRB и кодом для своих URIS-MODULE и PROCESS-MODULE

Общая концепция задания CoRB заключается в разделении работы для выполнения нескольких модулей, а не в попытке выполнить всю работу за одно выполнение, чтобы избежать проблем с тайм-аутом и чрезмерного потребления памяти.

Например, если вы хотите загрузить 10 миллионов документов, URI-MODULE выберет URI всех этих документов, а затем каждый URI будет отправлен в PROCESS-MODULE , который будет отвечать за его получение. В зависимости от THREAD-COUNT вы можете загружать несколько документов одновременно, но все они должны возвращаться очень быстро.

Является ли выполнение модуля URI тайм-аутом или процессным модулем?

Вы можете увеличить лимит тайм-аута от лимита по умолчанию до максимального лимита тайм-аута, используя: xdmp:request-set-time-limit()

Как правило, модули процессов должны выполняться быстро и без тайм-аута. Одной из возможных причин может быть выполнение слишком большого объема работы в преобразовании (например, установка очень большого размера BATCH-SIZE и выполнение слишком большого количества одновременно) или, возможно, неправильная конфигурация или плохо написанный запрос (т.е. вместо получения одного документа со значением $ URI, выполняя поиск и получая все документы каждый раз, когда выполняется модуль процесса).

person Mads Hansen    schedule 20.02.2020