2016-02-20 24 views
0

我試圖對3個DataFrame運行一系列轉換。每次轉換後,我想保留DF並將其保存到文本文件中。我正在做的步驟如下。在轉換工作流程中堅持DataFrame

Step0:
創建DF1
創建DF2
創建DF3
創建DF4
(不堅持沒有保存至今)

第一步:
通過加入DF1創建RESULT-DF1和DF2
堅持它到磁盤和內存
保存爲文本文件

第二步:
通過接合結果,DF1和DF3創建結果,DF2
其保存到磁盤和內存
保存爲文本文件

第三步:
通過接合結果,DF2和DF4創建成果的DF3
其保存到磁盤和內存
保存爲文本文件

觀察:
在第一步創建的任務數是601
在步驟2中創建的任務數是在第三步創建的任務的1004(沒有跳過任何東西)
號是1400(跳過400任務)

作爲不同的方法,我將上述步驟分爲三個不同的步驟。即;

  • 開始,負載DF1和DF2,難道第一步,保存結果,DF1 &出口
  • 開始,負載DF3,加載結果-DF1從文件時,請第二步,保存結果,DF2 &出口
  • 開始,從文件加載DF4,加載結果,DF2,做第三步,保存結果,DF3 &出口

後一種方法的運行速度更快。

我的問題是:
我在第一種方法的持久性方面失去了一些東西?
爲什麼Step2的運行不僅僅是使用Step1的結果,即使在持久化之後也沒有重做所有的任務(只有601個任務而不是1004)?
在實施這樣一系列轉換工作流程時,對最佳實踐有什麼好的解讀?

+1

你如何持續DataFrames,以及如何加入他們。請分享代碼。 –

+0

我試過這種情況,並得到了這種行爲的原因。你能給我提供以下細節:1)羣集內存和2)用於創建DF1,DF2,DF3的文件大小 –

+0

它是一個4 + 1羣集。所有五個節點都有32 GB。四位執行者。提供20 GB作爲執行程序內存和20 GB作爲驅動程序內存。數據大小爲每個源大約50到75 GB。 –

回答

0

由於沒有提供的代碼,我會認爲你正在執行的連接操作是每次不同(不同的屬性和數據)。即使您已經緩存了Spark需要將每個連接解析爲多個階段和任務的數據幀。 Catalyst優化器負責爲您的查詢創建邏輯(初始和優化)和物理計劃。在每次必須根據查詢和相應數據集計算新計劃時(每次連接後數據幀可能變得更小或更大),給定此執行順序。

鑑於任務在每次連接後都從數據幀增加到數據幀,數據集可能變得越來越大和/或您在多個屬性上執行連接操作。但是,我不明白你的第二種方法退出是什麼意思。

進一步的閱讀,我建議如下: https://databricks.com/blog/2015/04/13/deep-dive-into-spark-sqls-catalyst-optimizer.html

+0

第二種方法中的「退出」,我的意思是運行三個程序。第一個程序執行某些操作,保存結果並停止。第二個程序加載第一個程序的結果,做一些事情,保存結果並停止... –

+0

你能幫忙嗎? @maasg –

0

在你的情況下,請考慮如何星火SQL查詢優化工程。 Catalyst優化器當前遇到的挑戰之一就是非常大的查詢計劃。這些查詢計劃往往是迭代算法的結果,如圖算法或機器學習算法。一個簡單的解決方法是在每次迭代結束時將數據轉換爲RDD並返回DataFrame/Dataset。

我遇到了與上面描述的完全相同的問題。這個解決方法真的有幫助。

〜Erik