2016-02-03 26 views
1

我正在做一些我認爲是適度聰明的事情,而且它已經可以預料會再次咬我。連接到正在運行的Google Cloud Dataflow worker中的tmux會話

我有一個編譯好的二進制文件,我的工作人員下載和shell出來。 這個二進制文件需要很長時間才能啓動(60s),然後它監聽stdin並在stdout上發出。 爲了避免爲每位工作人員支付超過一次的啓動成本,我在startBundle的tmux會話中啓動二進制文件。在processElement中,我使用tmux send-keys命令將工作項目傳送到正在運行的tmux會話,然後讀出結果。

具體來說,TMUX啓動命令是:

tmux new-session -d -s word2vecdistance "./distance GoogleNews-vectors-negative300.bin > /tmp/word2vec_distance_log.txt" 

的查詢可能是這樣的:

tmux send-keys -t word2vecdistance love C-m 

這絕對是令人費解的,但它工作在本地對我來說,無論是在我的單元測試如果我使用DirectPipelineRunner。 但是,如果我在雲中運行,查詢命令會導致此TMUX錯誤:

failed to connect to server: Connection refused 

我的猜測是TMUX想一些權限/端口不可用在泊塢工數據流使用,但是這就我所知。

您的智慧將不勝感激。 CLARIFICATION 0:這一切都發生在單個(Dataflow)Docker容器內,即我試圖連接到同一個容器中的tmux會話。

CLARIFICATION 1:我不認爲我可以控制如何調用Docker容器;這是Google Cloud Dataflow管理的內容。

+0

你還在遇到這個問題嗎? –

回答

1

tmux使用unix套接字在進程之間進行通信。通常在/tmp/tmux.something。 (根據您的OS +配置)。其中一個想法是與所有碼頭集裝箱共享/ tmp(即將-v /tmp:/tmp添加到碼頭命令中)。

但請記住,tmux並非設計爲多用戶系統,因此您可能會遇到競爭條件。如果腳本同時要求輸入兩個單詞,則它們的輸出可能會混合在一起。

最好是編寫自己的服務來包裝word2vecdistance程序。 (即作爲Unix套接字或TCP服務器)。這會有點複雜,但可以讓您確保多個客戶同時提出問題時不會有比賽。

+0

感謝您的信息!但是,我認爲我沒有正確解釋這種情況,所以我對原始問題進行了澄清。 – emchristiansen

相關問題