当main方法什么都不做时,群集模式下的Spark提交失败

时间:2016-06-30 23:32:44

标签: java hadoop apache-spark

我在spark中实现了一些逻辑。执行此逻辑取决于传递给Java代码的参数。在我的主要方法中,我有一个开关盒。当我传递一个正确的参数时,一切正常。当我传递一些不在我的开关案例中的随机参数时,我得到Spark异常。完成失败状态。

如果我在客户端模式下运行相同的代码,它不会抛出任何带有错误参数的异常,我认为这是正确的行为。

我只在我的参数正确时才创建上下文。所以基本上如果我在群集模式下给出一个空的main方法,我就会遇到异常。

有人可以解释我这是如何运作的。我怎样才能避免这种例外。

public class MyClass{
private JavaSparkContext context = null;
private HiveContext hiveContext = null;
public static void main(String[] args) {


    MyClass obj = new MyClass();
    obj.startProcessing(args);      
}

startProcessing方法简单包含一个switch case。

谢谢

堆栈跟踪:

  Exception in thread "main" org.apache.spark.SparkException: Application application_1466638963111_3824 finished with failed status
    at org.apache.spark.deploy.yarn.Client.run(Client.scala:1036)
    at org.apache.spark.deploy.yarn.Client$.main(Client.scala:1083)
    at org.apache.spark.deploy.yarn.Client.main(Client.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

1 个答案:

答案 0 :(得分:3)

当您在“客户端”模式下运行应用程序时,用于运行应用程序的脚本(我认为 bin / spark-submit )会直接启动您的Main类。您的Main类必须创建Spark上下文,如果您使用Mesos或Yarn,Spark类上下文将连接到Spark集群或集群管理器。在这种情况下,如果你不创建Spark上下文,那很好。你的主要班级什么也不做,退出。

在集群模式下,Spark不会直接运行您的Main类,它会创建一个客户端并创建提交请求并将此请求提交给集群。此提交请求将您的Main类名称作为参数。当集群获得此请求时,它将启动您的Main类。客户端此时正在等待群集响应,即Spark上下文已成功创建,客户端必须获取有关已创建上下文的信息。

但是如果你没有创建一个上下文客户端无法连接到它,cliend就不会得到成功创建上下文的响应并抛出异常。

您也可以添加

  

- 详细

标记您的启动脚本,您将看到它在客户端模式下直接启动您的Main类,并在集群模式下启动不同的Main类。