如何为 Apache Spark Java 应用程序中的每个 Apache Spark 执行器分配一个唯一的整数键?

How can I assign a unique integer key to every Apache Spark Executor within an Apache Spark Java Application?

我需要为 spark 应用程序中的每个 spark 执行程序分配一个唯一的整数 id。我需要从执行程序的任务 运行 中检索执行程序 ID。执行者 ID 将与其他数据元素(时间戳、mac 地址等)一起用于生成唯一的 64 位密钥。如何为 Apache Spark Java 应用程序中的每个 Apache Spark 执行器分配一个唯一的整数键?

分区的 ID 可能会有用,因为单个分区的所有元素将始终在一个执行器上。

mapPartitionsWithIndex 可以帮助:

val spark = SparkSession.builder.master("local[*]").appName("partitionIndex").getOrCreate()
import spark.implicits._

val ds = spark.createDataset(Seq.range(1, 21)).repartition(4)
ds.rdd
  .mapPartitionsWithIndex((partitionIndex, it) => {
    println("processing partition " + partitionIndex)
    it.toList.map(i => new String("partition " + partitionIndex + " contains number " + i)).iterator
  })
  .foreach(println)

打印:

processing partition 1
processing partition 0
processing partition 2
processing partition 3
partition 1 contains number 3
partition 2 contains number 4
partition 2 contains number 9
partition 2 contains number 14
partition 2 contains number 19
partition 0 contains number 2
...
partition 3 contains number 1
partition 3 contains number 5
...

如果您能够为一个分区内的所有行分配一个唯一标识,那么这个唯一标识和分区索引的组合在整个系统中将是唯一的。