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

Debugging 是否可以在mapPartitionsWithIndex中获取SparkContext.appName等信息?,debugging,apache-spark,Debugging,Apache Spark,我试图实现的是从mapPartitionsWithIndex中获取尽可能多的信息 如果我尝试获取类似sc.appName的内容,就会抛出NullPointerException 如何从mapPartitionsWithIndex中获取尽可能多的信息 -我需要它来调试和查看在处理RDD时实际发生的情况。例如,了解正在处理哪个csv文件以及在哪个从属服务器上处理哪个csv文件将非常有用。我得到的所有解决方案都在mapPartitionsWithIndex之外。不,您不能将SparkContext传递

我试图实现的是从mapPartitionsWithIndex中获取尽可能多的信息

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

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


-我需要它来调试和查看在处理RDD时实际发生的情况。例如,了解正在处理哪个csv文件以及在哪个从属服务器上处理哪个csv文件将非常有用。我得到的所有解决方案都在mapPartitionsWithIndex之外。

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

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

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
之前,您可能会找出哪些分区属于哪个分区。即使在执行器上执行任何代码之前,这也是预先指定的。(查看中的代码。)但这需要检查私有类(
HadoopPartition
)的成员(
inputSplit
)和其他修补。最好不要去那里

相反,您应该使用
sc.wholeTextFiles

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

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

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

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
之前,您可能会找出哪些分区属于哪个分区。即使在执行器上执行任何代码之前,这也是预先指定的。(查看中的代码。)但这需要检查私有类(
HadoopPartition
)的成员(
inputSplit
)和其他修补。最好不要去那里

相反,您应该使用
sc.wholeTextFiles

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

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

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

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
之前,您可能会找出哪些分区属于哪个分区。即使在执行器上执行任何代码之前,这也是预先指定的。(查看中的代码。)但这需要检查私有类(
HadoopPartition
)的成员(
inputSplit
)和其他修补。最好不要去那里

相反,您应该使用
sc.wholeTextFiles

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

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

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

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
之前,您可能会找出哪些分区属于哪个分区。即使在执行器上执行任何代码之前,这也是预先指定的。(查看中的代码。)但这需要检查私有类(
HadoopPartition
)的成员(
inputSplit
)和其他修补。最好不要去那里

相反,您应该使用
sc.wholeTextFiles

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


为什么要获取executors上的
sc.appName
?所有的名字都是一样的。。。也许你可以说你想做什么。我想我已经解释过“我如何从mapPartitionsWithIndex中获得尽可能多的信息?”我想做的是在执行器执行时从执行器内部获得尽可能多的关于执行器的信息。
sc.appName
不是“关于遗嘱执行人的信息“。这是关于应用程序的。我不知道你在找什么信息。在我的回答中,我以如何获取主机名为例。如果您只想获得尽可能多的信息,我建议您下载Wikipedia:)。getHostName是部分答案,它与Spark无关,而是与java.net相关。下载wikipedia dumps毫无意义。@Daniel,关于执行者的任何信息,例如,它从RDD处理了哪些文件,这些文件作为s3 bucket加载,所有文件都以“csv”结尾,时间等等。因此,如果失败,我需要查看是什么信息以及是什么文件导致了失败。尽管如此,我还是想发布尽可能多的信息。使用java.net是一个部分答案,因为我需要一些可以在Spark API中找到的东西。此外,不支持使用多个spark上下文,并且SparkContext不可序列化,因此这对我也没有帮助…为什么要在executors上获取
sc.appName
?所有的名字都是一样的。。。也许你可以说你想做什么。我想我已经解释过“我如何从mapPartitionsWithIndex中获得尽可能多的信息?”我想做的是在执行过程中从执行者内部获得尽可能多的关于执行者的信息。