没有某些给定参数的GNU并行线程运行函数

时间:2018-10-11 11:14:55

标签: bcp gnu-parallel

在集群中的多个节点上运行一组GNU并行作业,并观察到所有线程似乎都在节点(包括调用该命令的本地节点)上处于休眠状态。经过进一步检查,发现GNU Parallel 在运行分配为作业的功能时似乎正在删除一些args 。检查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 Server数据库中。


休眠过程

查看通过clustershellhttps://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),如下所示(增加了换行符以提高可读性)

  我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(){文件名= $ 1; TO_SERVER_ODBCDSN = $ 2; DB = $ 3; TABLE = $ 4; USER = $ 5;密码= $ 6; RECOMMEDED_IMPORT_MODE = $ 7; DELIMITER = $ 8;该功能的一些东西; / opt / mssql-tools / bin / bcp“ $ filename”中的“ $ TABLE” $ TO_SERVER_ODBCDSN -U $ USER -P $ PASSWORD -d $ DB $ RECOMMEDED_IMPORT_MODE -t“ \ t” -e“ $(目录名$ filename) / bcperrors / $(基本名称$ 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来说是很新的),但是看起来肯定不正确。

这对我来说很奇怪,任何建议或调试建议将不胜感激。


更新:进一步调试这些线程为何休眠的事实表明,它们可能实际上正在完成预期的工作(这暗示问题可能< / em>来自BCP本身(请参见https://stackoverflow.com/a/52748660/8236733)。来自https://unix.stackexchange.com/a/47259/260742https://unix.stackexchange.com/a/36200/260742

  

处于S状态的进程通常处于阻塞的系统调用中,例如读取或写入文件或网络,或等待另一个被调用程序完成。

     

当您的进程正在执行可能阻止的读取操作时,它将处于S状态。在等待信号量或其他同步原语时也可能会发生...这都是正常现象,是正常现象,通常不是问题...您不希望它在等待用户输入时浪费CPU。

但是,在此处强烈使用单词“ may”,因为这不能解释检查ps时线程中丢失的$ PASSWORD arg或线程似乎永不返回的原因。无论如何,如果根本原因与我最初的怀疑完全不同,将更新标题和问题,以对可能遇到相同问题的其他人有所帮助。

1 个答案:

答案 0 :(得分:0)

1。睡眠过程:我在另一篇文章中对此问题的回答非常相似(请参见https://stackoverflow.com/a/52787273/8236733)。基本上,太多的线程跨过这么多的节点,似乎正在使bcp操作正在写入的MSSQL Server终结点数据库超载(我认为这会导致远程数据库出现某种超时问题)。

关于-P信息中丢失的密码(ps)arg值(此处再次显示)

  我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>时遇到问题。

也许我应该更改帖子的标题,以更好地匹配此问题的结局结果。