为什么从Java应用程序连接到Spark Standalone时,"无法调用已停止的SparkContext上的方法"?

Iva*_*nov 4 java apache-spark

我已经下载了为Hadoop 2.6及更高版本预先构建的Apache Spark 1.4.1.我有两台Ubuntu 14.04机器.其中一个我用一个奴隶设置为Spark master,第二个机器运行一个Spark slave.执行./sbin/start-all.sh命令时,主站和从站成功启动.之后,我将spark-shell设置示例PI程序运行--master spark://192.168.0.105:7077到Spark Web UI中显示的Spark主URL.

到目前为止一切都很好.

我创建了一个Java应用程序,并尝试将其配置为在需要时运行Spark作业.我在pom.xml文件中添加了spark依赖项.

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>1.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.11</artifactId>
            <version>1.4.1</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

我创建了一个SparkConfig:

private parkConf sparkConfig = new SparkConf(true)
            .setAppName("Spark Worker")
            .setMaster("spark://192.168.0.105:7077");
Run Code Online (Sandbox Code Playgroud)

我创建了一个SparkContext使用SparkConfig:

private SparkContext sparkContext = new SparkContext(sparkConfig);
Run Code Online (Sandbox Code Playgroud)

在此步骤中,将引发以下错误:

java.lang.IllegalStateException: Cannot call methods on a stopped SparkContext
    at org.apache.spark.SparkContext.org$apache$spark$SparkContext$$assertNotStopped(SparkContext.scala:103)
    at org.apache.spark.SparkContext.getSchedulingMode(SparkContext.scala:1503)
    at org.apache.spark.SparkContext.postEnvironmentUpdate(SparkContext.scala:2007)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:543)
    at com.storakle.dataimport.spark.StorakleSparkConfig.getSparkContext(StorakleSparkConfig.java:37)
    at com.storakle.dataimport.reportprocessing.DidNotBuyProductReport.prepareReportData(DidNotBuyProductReport.java:25)
    at com.storakle.dataimport.messagebroker.RabbitMQMessageBroker$1.handleDelivery(RabbitMQMessageBroker.java:56)
    at com.rabbitmq.client.impl.ConsumerDispatcher$5.run(ConsumerDispatcher.java:144)
    at com.rabbitmq.client.impl.ConsumerWorkService$WorkPoolRunnable.run(ConsumerWorkService.java:99)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)

如果我改变Spark主人,local一切正常.

private parkConf sparkConfig = new SparkConf(true)
                .setAppName("Spark Worker")
                .setMaster("local");
Run Code Online (Sandbox Code Playgroud)

我在托管Spark Master的同一台机器上运行Java应用程序.

我不知道为什么会这样?到目前为止,我发现的每个文档和示例都表明代码应该与Spark Master URL一起使用.

任何想法为什么会发生这种情况以及我如何解决它?我花了很多时间试图弄清楚这一个,到目前为止没有运气.

Leo*_*ard 5

我认为你使用Spark 1.4.1 for Scala 2.10.因此,你需要spark-core_2.10spark-streaming_2.10不是2.11.spark-core_2.11与为Scala 2.10构建的Spark不兼容.

要为Scala 2.11构建Spark,请参阅:

http://spark.apache.org/docs/latest/building-spark.html#building-for-scala-211