是否可以在mapPartitionsWithIndex中获取SparkContext.appName等信息?

时间:2015-04-03 17:40:06

标签: debugging apache-spark

我想要完成的是从mapPartitionsWithIndex中获取尽可能多的信息。

如果我尝试获取类似sc.appName的内容,则抛出NullPointerException。

如何从mapPartitionsWithIndex中获取尽可能多的信息?

- 我需要这个用于调试和查看处理RDD时实际发生的事情。例如,知道正在处理哪个csv文件以及哪个从属文件是有用的。我得到的所有解决方案都在mapPartitionsWithIndex之外。

1 个答案:

答案 0 :(得分:2)

不,您无法将SparkContext传递给执行者。 (SparkContext不是Serializable。)但您可以传递sc.appName(或任何其他Serializable值:

val appName = sc.appName
rdd.mapPartitions(p => Iterator(appName))

您还可以访问本地(执行者)环境,例如:

rdd.mapPartitions(p => Iterator(java.net.InetAddress.getLocalHost.getHostName))

您还提到了解正在处理哪个CSV文件。假设你的代码是这样的:

val rdd = sc.textFile(".../directory/*.csv")
rdd.mapPartitions { partition =>
  partition.map { line =>
    // What file is "line" from?
    ???
  }
}

那时的问题无法回答。

调用mapPartitions之前,您可能能够找出属于哪个分区的内容。即使在执行程序上执行任何代码之前,这也是预定义的。 (查看HadoopRDD.scala中的代码。)但这需要您检查私有类(inputSplit)的成员(HadoopPartition)以及其他修补程序。最好不去那里。

相反,您应该使用sc.wholeTextFiles

val rdd = sc.wholeTextFiles(".../directory/*.csv")
rdd.flatMap { case (file, contents) =>
  contents.split("\n", -1).map { line =>
    // "line" is from "file"!
    ???
  }
}