我正试图使用参数化的hql脚本(foo\u bar.hql)将大量的原始数据加载到一些配置单元表中,但是原始数据是按/yyyy/mm/dd进行目录分区的,因此我编写了一个shell脚本来打印带有日期参数的各个配置单元命令,每行一个。shell脚本输出如下所示:
nohup hive -f foo_bar.hql -hiveconf MONTH=06 -hiveconf DAY=01 >/dev/null 2>1& &
nohup hive -f foo_bar.hql -hiveconf MONTH=06 -hiveconf DAY=02 >/dev/null 2>1& &
nohup hive -f foo_bar.hql -hiveconf MONTH=06 -hiveconf DAY=03 >/dev/null 2>1& &
nohup hive -f foo_bar.hql -hiveconf MONTH=06 -hiveconf DAY=04 >/dev/null 2>1& &
...
(the) >/dev/null 2>1& &
part将nohup.out输出传递到oblivion中,这样它就不会阻塞东西,并且还会在后台启动hive命令)
如果单独运行,每个命令都需要相当长的时间才能完成。我有很多需要运行的程序,所以我尝试通过使用xargs运行子进程池来并行化整个程序。我的用法如下: bash bar_baz.sh | xargs -n 1 -I CMD -P 5 bash -c CMD
由于我无法确定的原因,xargs-p5没有将并发子进程的数量限制为5,shell脚本打印到stout的所有命令都会同时执行,而hive随后会崩溃。我觉得这和nohup有关,但是在浏览了xargs和nohup的手册页并在互联网上搜索类似的用法示例之后,我仍然不知道发生了什么。
任何帮助都将不胜感激!谢谢!
1条答案
按热度按时间eeq64g8w1#
解释
由于我无法确定的原因,xargs-p5没有将并发子进程的数量限制为5,shell脚本打印到stout的所有命令都会同时执行,
实际上它们被限制为5个,但是由于命令被立即发送到后台(由于
&
在shell脚本的输出中,xargs启动的bash也会立即退出。因此,虽然xargs实际上一次最多运行5个进程,但它在很短的时间内启动了所有进程,因为它们只运行了很短的时间。解决方案
我建议:
拆下
&
–xargs依赖于不放在后台的进程或者:
将xargs移到
bar_baz.sh
如果可能,或放
bash bar_baz.sh | xargs …
变成另一个剧本删除
nohup
从单个命令跑
bar_baz.sh
(1) 或另一个脚本(2)与nohup
相反可选:您还可以摆脱单个命令的输出重定向,因为您可以一次重定向整个脚本的输出
旁注
不相关,但这也是错误的:从stderr到stdout的输出重定向不正确
2>1&
–必须这样2>&1
.