我在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)
答案 0 :(得分:3)
当您在“客户端”模式下运行应用程序时,用于运行应用程序的脚本(我认为 bin / spark-submit )会直接启动您的Main类。您的Main类必须创建Spark上下文,如果您使用Mesos或Yarn,Spark类上下文将连接到Spark集群或集群管理器。在这种情况下,如果你不创建Spark上下文,那很好。你的主要班级什么也不做,退出。
在集群模式下,Spark不会直接运行您的Main类,它会创建一个客户端并创建提交请求并将此请求提交给集群。此提交请求将您的Main类名称作为参数。当集群获得此请求时,它将启动您的Main类。客户端此时正在等待群集响应,即Spark上下文已成功创建,客户端必须获取有关已创建上下文的信息。
但是如果你没有创建一个上下文客户端无法连接到它,cliend就不会得到成功创建上下文的响应并抛出异常。
您也可以添加
- 详细
标记您的启动脚本,您将看到它在客户端模式下直接启动您的Main类,并在集群模式下启动不同的Main类。