2015-04-23 58 views
2

自從使用最新版本的Cloud Dataflow(0.4.150414)後,從雲存儲(GCS)讀取數據時,我們的作業運行速度非常慢。在運行了10個虛擬機20分鐘後,我們只能夠讀取大約20條記錄,之前我們可以讀取數百萬個沒有問題的記錄。Cloud Dataflow在從雲存儲(GCS)讀寫時運行速度非常慢

它似乎掛起,雖然沒有錯誤報告回控制檯。

我們收到一封電子郵件,通知我們最新版本會更慢,並且可以通過使用更多虛擬機來應對,但我們獲得了與50臺虛擬機類似的結果。

下面是引用作業ID:2015-04-22_22_20_21-5463648738106751600

實例:N1-標準2
地區:美國central1-A

+1

這絕對不是預期的行爲。讓我們來澄清幾件事情:1)您能否通過常規的「gsutil」命令快速讀取這些GCS文件? (只是爲了確保它不是GCS問題)2)您是否可以嘗試使用DirectPipelineRunner在較小的數據子集上運行管道,以檢查它是否僅發生在虛擬機上,還是在本地? – jkff

+1

你也可以嘗試ssh'ing到你的虛擬機之一,看看它在做什麼。一種方法是「ps aufx | grep java」找到Dataflow工作進程,「sudo kill -3 $ WORKER_PID」強制它將其堆棧跟蹤轉儲到它的標準輸出,「sudo docker ps」以找到taskrunner容器(容器ID是左列),然後「sudo docker exec $ CONTAINER_ID cat /dataflow/logs/taskrunner/harness/harness-stdout.log」來打印它的stdout,它現在應該有堆棧跟蹤。 (對不起,我知道這很麻煩 - 我們正在努力改進調試體驗) – jkff

+0

我能夠使用gsutil從存儲桶中讀取數據,並使用一組較小的數據在本地運行,而沒有任何問題。我現在將ssh送到盒子裏。 – DarrenCibis

回答

1

我們有類似的問題。這是當側面輸入從正在傳輸數據的BigQuery表中讀取而不是批量加載時。當我們複製表格並從副本讀取時,一切正常。

如果您的表流式傳輸,請嘗試複製它們並讀取副本。這是一種解決方法。

參見:Dataflow performance issues

3

你的工作似乎是使用側輸入到DoFn。由於Cloud Data SDK for Java處理側面輸入的方式發生了最新變化,因此您的性能問題可能與此有關。我正在重發相關問題的答案。


證據似乎表明您的管道如何處理側面輸入存在問題。具體而言,主輸入的每個元素都可能重複從BigQuery中重新讀取副輸入。這與Dataflow工作人員使用的虛擬機類型的更改完全正交,如下所述。

這與Dataflow SDK for Java版本0.3.150326中所做的更改密切相關。在該版本中,我們更改了側面輸入API以適用於每個窗口。現在調用sideInput()現在僅在與主輸入元素的窗口相對應的特定窗口中返回值,而不是整個側面輸入PCollectionView。因此,sideInput()不能再從startBundlefinishBundle中調用DoFn,因爲該窗口尚不知道。

例如,下面的代碼片段有一個問題,會導致每個輸入元素重新讀取側面輸入。

@Override 
public void processElement(ProcessContext c) throws Exception { 
    Iterable<String> uniqueIds = c.sideInput(iterableView); 

    for (String item : uniqueIds) { 
    [...] 
    } 

    c.output([...]); 
} 

此代碼可以通過緩存側輸入到在高速緩存List代替側輸入變換(假定它能夠裝入內存)在第一次調用processElement期間,和使用一個List成員變量來改善隨後的調用。

此替代方法應恢復您之前看到的性能,此時可從startBundle調用副輸入。長期來看,我們將致力於更好地緩存副作用。 (如果這不利於全面解決該問題,請通過電子郵件與我們聯絡,分享相關的代碼片段。)


另外,有,的確,更新至約4雲數據流服務/ 9/15更改了Dataflow工作人員使用的默認虛擬機類型。具體而言,我們減少了每個工作人員的內核缺省數量,因爲我們的基準測試顯示它對於典型作業而言具有成本效益這是而不是任何類型的數據流服務都會減速 - 默認情況下,它只是在每個工作人員的資源較少的情況下運行。用戶仍然可以選擇覆蓋工作人員數量以及工作人員使用的虛擬機類型。

相關問題