2017-06-22 130 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

相關問題