2016-11-16 148 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中是不可控制的。

相关问题