【问题标题】:Is there a way to control the distribution of spark partitions across nodes in a cluster?有没有办法控制集群中跨节点的火花分区分布?
【发布时间】:2016-11-16 10:14:12
【问题描述】:

我有一个 8 节点集群,我从 jdbc 源加载两个数据帧,如下所示:

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" 记录的 PositionDF 数据帧分区是否与包含 PositionDate="01 Jan 2016" 记录的 varDatesDf 数据帧分区位于相同的执行程序内存空间中?他们会在同一个节点上吗?还是只是随机的?

有什么方法可以查看哪个节点上有哪些分区?

spark 是否以一种确定性的方式跨节点分配使用这样的列键创建的分区?它们会一直是本地节点/执行器吗?

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    包含 PositionDate="01 Jan 2016" 记录的 PositionDF 数据帧分区是否与包含 PositionDate="01 Jan 2016" 记录的 varDatesDf 数据帧分区位于相同的执行程序内存空间中

    一般不会。即使数据是共同分区的(它不在这里),也并不意味着共同定位。

    有什么方法可以查看哪个节点上有哪些分区?

    这种关系不必随着时间的推移而修复。例如,可以重新安排任务。您可以使用不同的RDD 技巧(TaskContext)或数据库日志,但它不可靠。

    将以这样一种方式分布,即连接始终位于节点本地,甚至更好地位于执行器本地。

    调度程序有其内部优化和低级 API 允许您设置节点首选项,但此类事情在 Spark SQL 中是无法控制的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多