Функция запуска параллельных потоков GNU без некоторых заданных аргументов - PullRequest
0 голосов
/ 11 октября 2018

Выполнение набора заданий GNU Parallel на нескольких узлах в кластере и наблюдение, что все потоки, по-видимому, спят на узлах (включая локальный узел, вызвавший команду).После дальнейшей проверки выяснилось, что GNU Parallel , по-видимому, удаляет некоторые аргументы, когда запускает функцию, назначенную заданию .Проверка parallel --version подтверждает, что это GNU-версия параллели (версия 20160222).

Данный код выглядит как

bcpexport() {
    filename=$1
    TO_SERVER_ODBCDSN=$2
    DB=$3 
    TABLE=$4 
    USER=$5
    PASSWORD=$6
    RECOMMEDED_IMPORT_MODE=$7 
    DELIMITER=$8

    <do some stuff to the given file arg $1 to BCP copy file contents to some MSSQL Server, function ends with...>

    /opt/mssql-tools/bin/bcp "$TABLE" in "$filename" \
        $TO_SERVER_ODBCDSN \
        -U $USER -P $PASSWORD \
        -d $DB \
        $RECOMMEDED_IMPORT_MODE \
        -t "\t" \
        -e "$(dirname $filename)/bcperrors/$(basename $filename).bcperror.log"
}
export -f bcpexport
parallel -q -j $parallelization_pernode --sshloginfile $basedir/src/parallel-nodes.txt --env bcpexport \
    bcpexport {} "$TO_SERVER_ODBCDSN" $DB $TABLE $USER $PASSWORD $RECOMMEDED_IMPORT_MODE $DELIMITER \
    ::: $DATAFILES/$TARGET_GLOB

, который использует Microsoft BCP (https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-migrate-bcp?view=sql-server-2017) для копирования данных TSV в БД MSSQL-сервера путем распределения заданий по набору узлов.


Спящие процессы :

При просмотре запущенных процессовчерез узлы через clustershell (https://clustershell.readthedocs.io/en/latest/tools/clush.html)

clush -b -w mapr001,mapr005,mapr006 "ps -aux | grep bcp"

, увидев несколько спящих процессов (обратите внимание на S, см. https://askubuntu.com/a/360253/760862), как показано ниже (добавлены новые строки для удобства чтения)

me 135296 14,5 0,0 77596 6940? S 00:32 0:01

/ opt / mssql-tools / bin / bcp TABLENAME в /path/to/tsv/1_16_0.tsv-D -S MyMSSQLServer -U myusername -P -d myDB -c -t \ t -e / path / to / logfile

Обратите внимание, что пароль arg -P пуст. Это не происходит при локальном запуске одной и той же функции . Эти потоки кажутся спящими вечно (я предполагаю, что MSSQL Server ожидает пароль, нотак как пусто, ни один никогда не дается и поэтому нет ответа).


Нечетные аргументы :

Я также вижу некоторые процессы вида

меня 11055 12,6 0,0 119640 1816?S 00:46 0:08

/ bin / bash -c bcpexport () {filename = $ 1;TO_SERVER_ODBCDSN = $ 2;DB = $ 3;Таблица = $ 4;USER = $ 5;ПАРОЛЬ = $ 6;RECOMMEDED_IMPORT_MODE = $ 7;DELIMITER = $ 8;некоторые вещи из функции;/ opt / mssql-tools / bin / bcp "$ TABLE" в "$ filename" $ ​​TO_SERVER_ODBCDSN -U $ USER -P $ PASSWORD -d $ DB $ RECOMMEDED_IMPORT_MODE -t "\ t" -e "$ (dirname $ filename)/ bcperrors / $ (basename $ filename) .bcperror.log "};

export -f bcpexport> / dev / null;

bcpexport /mapr/uceramapr.cluster.local//etl/ucera_internal/internal_etl/hph_clarity/version-2/stages/storage/CLARITY_TDL/tsv/1_27_0.tsv -D \ -S \ myODBCDSN myDB TABLENAME myuser mypassword -c \ t

, который отображается для отображения(очень плохо знаком с использованием GNU Parallel) GNU Parallel берет экспортированную функцию из назначенного задания и применяет аргументы.Тем не менее, вы можете видеть, что вызов функции, которую параллельно назначает как задание, показанное в конце, имеет аргументы -D\ -S\ myODBCDSN, которые изначально были в переменной $TO_SERVER_ODBCDSN (именно поэтому он был в кавычках в parallelи почему parallel использует опцию -q).Но теперь, вместо того, чтобы передавать как одиночные кавычки, являются строкой, кажется проходящим каждый фрагмент строки, как если бы он был разделен пробелами (несмотря на параметр -q).IDK, как это способствует общей проблеме (опять же, очень плохо знакомой с Parallel), но это, конечно, не выглядит правильно.

Это все очень странно для меня, любые советы или предложения по отладке будут оценены.


ОБНОВЛЕНИЕ : Дальнейшая отладка того, почему эти потоки спят, предполагает, что они могут на самом деле выполняют свою намеченную работу (что может означать, что проблема может исходить от самого ППГ (см. https://stackoverflow.com/a/52748660/8236733)). с https://unix.stackexchange.com/a/47259/260742 и https://unix.stackexchange.com/a/36200/260742)

Процесс в состоянии S обычно находится в системе блокировкивызов, например чтение или запись в файл или сеть, или ожидание завершения другой вызываемой программы.

Ваш процесс будет в состоянии S, когда он выполняет операции чтения и, возможно, записи, которые блокируют. Может такжепроисходит во время ожидания на семафорах или других примитивах синхронизации ... Это все нормально и ожидаемо, и обычно это не проблема ... вы не хотите, чтобы он тратил ЦП, ожидая ввода пользователя.

Однако здесь строго используется слово «может», поскольку это не объясняет отсутствующий аргумент $ PASSWORD в потоках при проверке ps или почему потоки, кажется, никогда не возвращаются.В любом случае, если основная причина окажется очень отличной от моих первоначальных подозрений, обновите заголовок и вопрос, чтобы попытаться быть более полезными для тех, у кого может быть та же проблема.

1 Ответ

0 голосов
/ 13 октября 2018

1.Спящие процессы : я отвечаю на очень похожий вариант этой проблемы в другом посте (см. https://stackoverflow.com/a/52787273/8236733). В принципе, слишком много потоков, умноженных на такое количество узлов, кажется, перегружает базу данных конечной точки сервера MSSQL, что *Операция 1005 * выполняет запись (что, по-моему, приводит к некоторой проблеме с тайм-аутом из удаленной БД).

Что касается отсутствующего пароля (-P), значение arg в информации ps (показано сноваздесь)

me 135296 14,5 0,0 77596 6940? S 00:32 0: 01

/ opt / mssql-tools / bin / bcp TABLENAME в / path / to / tsv /1_16_0.tsv -D -S MyMSSQLServer -U myusername -P -d myDB -c -t \ t -e / path / to / logfile

Я подозреваю, что bcp что-то скрывает,информация от ps (поэтому она выглядит просто пустой в выводе (было бы более понятно, если бы вместо этого она выглядела как «xxxx», но в любом случае ...)). Обсуждение других (удобно для этой теории, такжеСделано Microsoft), программы делают именно такого родаВы можете найти здесь: https://unix.stackexchange.com/q/88665/260742

2.Нечетные аргументы : В bash символ \ в основном говорит «использовать следующий символ буквального значения» из другого сообщения SE (https://unix.stackexchange.com/a/146665/260742)

должен сохранять буквальное значение следующегосимвол, за исключением символа ... ... удаляется ...

Так что, хотя кажется, что переменная, заключенная в кавычки, разделяется в заданном выводе, она действительновводится как один аргумент (здесь \ указывает, что функция должна принимать буквальное значение пробела и не принимать разделенные строки здесь как разные аргументы). Например:

[me@mserver001 tmp]$ ls "-l -h"
ls: invalid option -- ' '
Try 'ls --help' for more information.
[me@server001 tmp]$ ls -l\ -h
ls: invalid option -- ' '
Try 'ls --help' for more information. 
[me@server001 tmp]$ ls "-lh"
total 0
-rw-r--r-- 1 me 10001 0 Oct 12 12:22 test0.txt
-rw-r--r-- 1 me 10001 0 Oct 12 12:22 test1.txt
-rw-r--r-- 1 me 10001 0 Oct 12 12:22 test2.txt
-rw-r--r-- 1 me 10001 0 Oct 12 12:22 test3.txt
-rw-r--r-- 1 me 10001 0 Oct 12 12:22 test4.txt
-rw-r--r-- 1 me 10001 0 Oct 12 12:22 test5.txt

Обратите внимание, что в первомВ двух случаях ls читает весь аргумент и испытывает проблемы с распознаванием пробела ' ' как в цитируемом примере, так и в примере с разделением \<blankspace>.

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

...