如何确定持有RDD特定分区的计算机的主机名?
我意识到Spark并不打算向临时用户公开这些信息,但我正在尝试将Spark与另一个系统连接起来,并且知道分区的物理位置可以实现更高效的传输。
答案 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")
})