为什么群集模式下的YARN上的Spark失败,并显示“线程“驱动程序”中的异常” java.lang.NullPointerException”?

Suanmeiguo

我在Spark 2.1.0中使用emr-5.4.0。我知道是什么NullPointerException,这个问题是关于为什么在这种特殊情况下会抛出该问题。

无法真正弄清楚为什么我在驱动程序线程中得到了NullPointerException。

我得到这个奇怪的工作失败,并显示以下错误:

18/03/29 20:07:52 INFO ApplicationMaster: Starting the user application in a separate Thread
18/03/29 20:07:52 INFO ApplicationMaster: Waiting for spark context initialization...
Exception in thread "Driver" java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:637)
18/03/29 20:07:52 ERROR ApplicationMaster: Uncaught exception:
java.lang.IllegalStateException: SparkContext is null but app is still running!
    at org.apache.spark.deploy.yarn.ApplicationMaster.runDriver(ApplicationMaster.scala:415)
    at org.apache.spark.deploy.yarn.ApplicationMaster.run(ApplicationMaster.scala:254)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$main$1.apply$mcV$sp(ApplicationMaster.scala:766)
    at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:67)
    at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:66)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
    at org.apache.spark.deploy.SparkHadoopUtil.runAsSparkUser(SparkHadoopUtil.scala:66)
    at org.apache.spark.deploy.yarn.ApplicationMaster$.main(ApplicationMaster.scala:764)
    at org.apache.spark.deploy.yarn.ApplicationMaster.main(ApplicationMaster.scala)
18/03/29 20:07:52 INFO ApplicationMaster: Final app status: FAILED, exitCode: 10, (reason: Uncaught exception: java.lang.IllegalStateException: SparkContext is null but app is still running!)
18/03/29 20:07:52 INFO ApplicationMaster: Unregistering ApplicationMaster with FAILED (diag message: Uncaught exception: java.lang.IllegalStateException: SparkContext is null but app is still running!)
18/03/29 20:07:52 INFO ApplicationMaster: Deleting staging directory hdfs://<ip-address>.ec2.internal:8020/user/hadoop/.sparkStaging/application_1522348295743_0010
18/03/29 20:07:52 INFO ShutdownHookManager: Shutdown hook called
End of LogType:stderr

我提交的工作是这样的:

spark-submit --deploy-mode cluster --master yarn --num-executors 40 --executor-cores 16 --executor-memory 100g --driver-cores 8 --driver-memory 100g --class <package.class_name> --jars <s3://s3_path/some_lib.jar> <s3://s3_path/class.jar>

我的课看起来像这样:

class MyClass {

  def main(args: Array[String]): Unit = {
    val c = new MyClass()
    c.process()
  }

  def process(): Unit = {
    val sparkConf = new SparkConf().setAppName("my-test")
    val sparkSession: SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
    import sparkSession.implicits._
    ....
  }

  ...
}
雅克·拉斯考斯基

更改class MyClassobject MyClass,您就完成了。

在进行此操作时,我还将更改class MyClassobject MyClass extends App和删除def main(args: Array[String]): Unit(如所给extends App)。

我已经报告了Spark 2.3.0的改进- [SPARK-23830]当Spark应用程序不是Scala类而不是对象时,群集部署模式下的YARN上的Spark在NullPointerException上失败-可以很好地向最终用户报告。


深入了解YARN上Spark的工作方式,以下消息是Spark应用程序ApplicationMaster启动驱动程序--deploy-mode cluster --master yarn与一起使用spark-submit)时。

ApplicationMaster:在单独的线程中启动用户应用程序

在INFO消息之后,您应该会看到另一个消息:

ApplicationMaster:等待Spark上下文初始化...

这是ApplicationMaster运行时驱动程序初始化的一部分

出现异常的原因Exception in thread "Driver" java.lang.NullPointerException是由于以下代码

val mainMethod = userClassLoader.loadClass(args.userClass)
  .getMethod("main", classOf[Array[String]])

我的理解是,mainMethod就是null在这一点上,因此以下行(其中mainMethodnull)“触发” NullPointerException

mainMethod.invoke(null, userArgs.toArray)

线程确实叫Driver(如Exception in thread "Driver" java.lang.NullPointerException)作为集这一行

userThread.setContextClassLoader(userClassLoader)
userThread.setName("Driver")
userThread.start()

行号不同,因为当您将emr-5.4.0与Spark 2.1.0一起使用时,我使用Spark 2.3.0来引用行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章