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

时间:2015-11-09 09:51:21

标签: java apache-spark

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

我创建了一个SparkConfig

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

我使用SparkContext创建SparkConfig

private SparkContext sparkContext = new SparkContext(sparkConfig);

在此步骤中抛出以下错误:

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)

如果我将Spark主人改为local,一切正常。

private parkConf sparkConfig = new SparkConf(true)
                .setAppName("Spark Worker")
                .setMaster("local");

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

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

为什么会发生这种情况以及如何解决这个问题?到目前为止,我已经花了很多时间试图找出这个并没有运气。

1 个答案:

答案 0 :(得分:5)

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

为Scala 2.11构建Spark,请参阅:

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