2017-06-22 126 views
0

Sooo ... 我试图使用参数化的hql脚本(foo_bar.hql)将大量的原始数据加载到某些配置单元表中,但原始数据由/ yyyy/mm/dd进行目录分区,所以我编写了一个shell脚本来打印出具有日期参数的单个配置单元命令,每行一个字符以表示粗壮。 shell脚本输出看起来是这样的:如何使用xargs运行nohup子进程池?

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& & 
... 

(该>/dev/null 2>1& &部分传递的nohup.out输出被遗忘,使其不堵塞东西以及在后台启动蜂巢命令)

如果单独运行,这些命令中的每一个都需要花费大量时间才能完成。我有很多需要运行的东西,所以我试图通过使用xargs运行子进程池来并行化整个事情。我的用法如下:

bash bar_baz.sh | xargs -n 1 -I CMD -P 5 bash -c CMD

是有原因的,我不能确定,xargs的-P 5个并发的子进程的数目不限制为5,所有打印的命令由shell脚本粗壮得同时执行,Hive随后崩溃。我觉得这与nohup有关,但是通过查看xargs和nohup的手册页并查看interwebs的相似用法示例后,我仍然无法弄清楚发生了什么。

任何帮助将不胜感激!谢谢!

+0

尝试从文件中删除&。 -P选项必须为你做并行处理 – Tamar

回答

2

说明

对于原因,我不能确定,xargs的-P 5个并发子过​​程的数目不限制在5,ALL印刷由外壳脚本粗壮的命令得到同时执行,

其实他们都是限制在5,但由于命令立即发送到后台(由于你的shell脚本的输出&),这是由xargs的启动庆典立即退出了。所以,尽管xargs实际上一次最多运行5个进程,但它在短时间内启动了所有进程,因为它们只运行得这么短。

解决方案

我建议,以:

  • 删除& - xargs的依赖被放进背景
  • 无论是过程:
    1. 招xargs的如果可能的话进入bar_baz.sh,或
    2. bash bar_baz.sh | xargs …到另一个脚本
  • 从单一的命令删除nohup
  • 运行bar_baz.sh(1)或其他脚本(2)nohup代替
  • 可选:您可能也摆脱了输出重定向的单一的命令,你可以在一次

旁注整个脚本的输出重定向

无关,但这也是错误的:从STDERR到STDOUT的输出重定向不是2>1& - 它必须是2>&1

+0

绝对真棒回应,我非常感谢解释!也感谢您指出错字 - 它解释了为什么我有一个名为1的文件,看起来可疑地接近之前的nohup.out文件... – yungblud

相关问题