确定存储Spark分区的计算机

时间:2016-12-02 17:10:41

标签: apache-spark

如何确定持有RDD特定分区的计算机的主机名?

我意识到Spark并不打算向临时用户公开这些信息,但我正在尝试将Spark与另一个系统连接起来,并且知道分区的物理位置可以实现更高效的传输。

2 个答案:

答案 0 :(得分:0)

您可以尝试在RDD上调用foreachPartition并使用系统命令获取主机名。 像(在pyspark中)的东西:

def f(iterator):
    log2file(gethostname)

rdd.foreachParition(f)

其中log2file是用于记录文件的函数,gethostname是用于获取主机名的常规系统命令。

如果要将结果作为RDD返回,可以按如下方式使用mapPartitions:

def f(iterator): yield hostname
rdd.mapPartitions(f).collect()

答案 1 :(得分:0)

在另一个Stackoverflow问题How to get ID of a map task in Spark?上找到了解决方案。 TaskContext对象中提供了此信息,您可以这样使用:

import org.apache.spark.TaskContext

sc.parallelize(1 to 10, 3).foreachPartition(_ => {
    val ctx = TaskContext.get
    val stageId = ctx.stageId
    val partId = ctx.partitionId
    val hostname = ctx.taskMetrics.hostname
    println(s"Stage: $stageId, Partition: $partId, Host: $hostname")
})