在集群中的多个节点上运行一组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数据库中。
休眠过程:
查看通过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),如下所示(增加了换行符以提高可读性)
我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/260742和https://unix.stackexchange.com/a/36200/260742)
处于S状态的进程通常处于阻塞的系统调用中,例如读取或写入文件或网络,或等待另一个被调用程序完成。
当您的进程正在执行可能阻止的读取操作时,它将处于S状态。在等待信号量或其他同步原语时也可能会发生...这都是正常现象,是正常现象,通常不是问题...您不希望它在等待用户输入时浪费CPU。
但是,在此处强烈使用单词“ may”,因为这不能解释检查ps
时线程中丢失的$ PASSWORD arg或线程似乎永不返回的原因。无论如何,如果根本原因与我最初的怀疑完全不同,将更新标题和问题,以对可能遇到相同问题的其他人有所帮助。
答案 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>
时遇到问题。
也许我应该更改帖子的标题,以更好地匹配此问题的结局结果。