會發生什麼取決於你如何讀取文件的答案或文件的部分鏈接:
如果使用SparkSession提供的工具閱讀一個DataFrame(見DataFrameReader文檔),然後創建一個執行圖,它將嘗試讀取節點本地數據。即每個Spark執行程序將讀取駐留在分佈式存儲的本地執行程序部分的數據:例如本地HDFS塊。這要求您在數據存儲上分區信息,並使用它來創建DataFrameReader。 這是將Spark用於大數據的正確方法,因爲它允許近似任意縮放。
如果您在星火代碼中使用Java或斯卡拉文件-10,那麼兩種情況之一發生:
- 如果代碼上的驅動程序執行,你將不得不併行你讀數據從文件中使用SparkSession.parallelize從您讀取的數據生成的集合中。這對於一些測試非常有用,但不會擴展到Spark在生產中有意義的大多數情況。
- 如果代碼在執行器上執行(即在RDD.map封閉內部),那麼將在運行該代碼的每個執行器上讀取該文件,並且可以在每個執行器上完整地獲得該文件。這通常是不可取的,除非您有非常特殊的要求 - 它還要求文件在每個節點上可用。
關於SparkSQL和查詢表 - 在驅動程序上解釋查詢並生成對應於查詢的執行計劃。然後使用此執行計劃將生成的階段分發給那些包含處理階段所需數據的執行程序,並確保數據以這種方式重新分發,以便執行以下階段。由於SparkSQL通常不會針對數據庫運行,而是基於列或基於行的文件結構運行,因此每個執行器理想情況下只加載本地的文件數據。如果數據不是本地的,則每個執行程序都會嘗試從外部數據存儲區加載多個分區,可能會使用某些過濾器邏輯下推。在那種情況下,是的,每個工作人員都會查詢「數據庫」,但只能查看部分數據,通常只能讀取記錄。