Apache Spark 如何将分区 ID 分配给其执行程序

Posted

技术标签:

【中文标题】Apache Spark 如何将分区 ID 分配给其执行程序【英文标题】:How does Apache Spark assign partition-ids to its executors 【发布时间】:2016-10-13 10:18:39 【问题描述】:

我有一个长期运行的 Spark 流作业,它使用 16 个执行器,每个执行器只有一个核心。

我使用默认分区器(HashPartitioner)将数据平均分配到 16 个分区。在updateStateByKeyfunction 内部,我从TaskContext.getPartitionId() 中检查了多个批次的分区ID,发现执行程序的分区ID 非常一致,但长时间运行后仍会更改为另一个ID。

我打算做一些优化来激发“updateStateByKey”API,但是如果partition-id在批次之间不断变化,就无法实现。

那么 Spark 什么时候改变执行器的 partition-id 呢?

【问题讨论】:

getPartitionId 不是执行者的 id。它是给定 RDD 中分区的 ID。 我所说的分区ID是由特定执行器处理的分区ID,我想知道执行器何时更改它一直在处理的分区ID。 【参考方案1】:

很可能,任务失败并再次重新启动,因此 TaskContext 已更改,partitionId 也已更改。

【讨论】:

以上是关于Apache Spark 如何将分区 ID 分配给其执行程序的主要内容,如果未能解决你的问题,请参考以下文章

Apache Spark 动态分区 OverWrite 问题

如何在使用 Spark 读取时将数据分配到 X 分区?

Apache Spark - 将 UDF 的结果分配给多个数据框列

在Apache Spark中使用Bigquery Connector时如何设置分区数?

Spark没有将负载均匀地分配给任务

Spark:如何指定持有 RDD 的 executor 数量?