2017-04-25 58 views
0

我對apache spark很新穎,但我想我有種想法。 但我真的不明白哪個節點的apache spark集羣正在讀取資源。apache spark服務器的哪個節點從磁盤讀取一個節點

例如,當我從磁盤讀取文件。我發現一些文檔和stackoverflow上的答案,表明每個工作人員將讀取整個文件。

如果是這種情況,我想對多個工人進行某種線處理,每個工人都會在其內存中擁有它不需要的線,因爲另一個工人正在處理它們。

此外,當我使用火花SQL和我查詢一個大表會發生什麼。 是否每個工人都查詢數據庫?或者是否有一名工作人員執行查詢,然後將數據庫的答案轉移到其他工作人員上。

它描述的行爲將是非常有益

回答

2

會發生什麼取決於你如何讀取文件的答案或文件的部分鏈接:

如果使用SparkSession提供的工具閱讀一個DataFrame(見DataFrameReader文檔),然後創建一個執行圖,它將嘗試讀取節點本地數據。即每個Spark執行程序將讀取駐留在分佈式存儲的本地執行程序部分的數據:例如本地HDFS塊。這要求您在數據存儲上分區信息,並使用它來創建DataFrameReader。 這是將Spark用於大數據的正確方法,因爲它允許近似任意縮放。

如果您在星火代碼中使用Java或斯卡拉文件-10,那麼兩種情況之一發生:

  1. 如果代碼上的驅動程序執行,你將不得不併行你讀數據從文件中使用SparkSession.parallelize從您讀取的數據生成的集合中。這對於一些測試非常有用,但不會擴展到Spark在生產中有意義的大多數情況。
  2. 如果代碼在執行器上執行(即在RDD.map封閉內部),那麼將在運行該代碼的每個執行器上讀取該文件,並且可以在每個執行器上完整地獲得該文件。這通常是不可取的,除非您有非常特殊的要求 - 它還要求文件在每個節點上可用。

關於SparkSQL和查詢表 - 在驅動程序上解釋查詢並生成對應於查詢的執行計劃。然後使用此執行計劃將生成的階段分發給那些包含處理階段所需數據的執行程序,並確保數據以這種方式重新分發,以便執行以下階段。由於SparkSQL通常不會針對數據庫運行,而是基於列或基於行的文件結構運行,因此每個執行器理想情況下只加載本地的文件數據。如果數據不是本地的,則每個執行程序都會嘗試從外部數據存儲區加載多個分區,可能會使用某些過濾器邏輯下推。在那種情況下,是的,每個工作人員都會查詢「數據庫」,但只能查看部分數據,通常只能讀取記錄。