2016-11-16 146 views
0

我有一個8節點羣集和予加載從這樣的JDBC源的兩個dataframes:有沒有辦法控制集羣中節點間火花分區的分佈?

positionsDf = spark.read.jdbc(
     url=connStr, 
     table=positionsSQL, 
     column="PositionDate", 
     lowerBound=41275, 
     upperBound=42736, 
     numPartitions=128*3, 
     properties=props 
    ) 
positionsDF.cache() 

varDatesDf = spark.read.jdbc(
     url=connStr, 
     table=datesSQL, 
     column="PositionDate", 
     lowerBound=41275, 
     upperBound=42736, 
     numPartitions=128 * 3, 
     properties=props 
    ) 
varDatesDF.cache() 

res = varDatesDf.join(positionsDf, on='PositionDate').count() 

我可以一些從隔板均勻地分佈在集羣節點的分佈式應用程序UI的存儲標籤。但是,我不能說的是它們是如何分佈在節點上的。理想情況下,兩個數據幀都將以這樣的方式分發,即連接總是本地的節點,或者對執行者來說更好。

換句話說,包含PositionDate =「01 Jan 2016」的記錄的positionsDF dataframe分區是否與包含PositionDate =「01 Jan 2016」的記錄的varDatesDf數據框分區位於同一執行器內存空間中?他們會在同一個節點上嗎?或者它只是隨機的?

有什麼方法可以查看哪些節點在哪個節點上?

在整個節點上,火花是否以確定性的方式使用列鍵來創建分區?他們將始終是節點/執行器本地?

回答

0

將所述positionsDF數據幀分區包含與PositionDate =「2016年1月1日」的記載,位於同一執行程序的存儲器空間爲包含與PositionDate =「2016年1月1日」

記錄varDatesDf數據幀分區

它不會一般。即使數據是共同分區的(它不在這裏),它並不意味着共址。

有什麼方法可以查看哪些節點在哪個節點上?

這個關係不需要隨着時間的推移而被修正。任務可以例如重新安排。您可以使用不同的RDD技巧(TaskContext)或數據庫日誌,但它不可靠。

將以這樣的方式進行分配,即連接總是本地的節點,或者甚至對執行者來說更好。

調度程序有其內部優化和低級API允許您設置節點首選項,但這種類型的事情在Spark SQL中是不可控制的。

相關問題