你如何从代码中向Spark提交工作?

时间:2016-05-06 20:59:22

标签: scala intellij-idea apache-spark

我已经启动了单节点独立Spark群集,并确认我的构建与./bin/run-example SparkPi 10一起使用。然后我在scala中写了一个非常简单的测试项目;

import org.apache.spark.{SparkConf, SparkContext}

object Main {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf()
    val sc = new SparkContext("spark://UbuntuVM:7077", "Simple Application")

    val count = sc.parallelize(1 to 100).map{i =>
      val x = Math.random()
      val y = Math.random()
      if (x*x + y*y < 1) 1 else 0
    }.reduce(_ + _)
    println("Pi is roughly " + 4.0 * count / 100)
  }
}

我在IDE(IntelliJ)中运行它。它成功连接到集群,我看到它提交了作业,但它们都抛出错误;

INFO TaskSetManager: Lost task 1.3 in stage 0.0 (TID 7) on executor 192.168.1.233: java.lang.ClassNotFoundException (Main$$anonfun$1) [duplicate 7]

如果我理解正确的火花,这是因为群集无法找到代码。那么如何将代码提供给spark呢?我没有在这个测试中运行HDFS或其他任何东西,但它都在一个盒子上,所以我希望SparkContext将当前目录传递给spark,但它显然没有。

有人能以正确的方式指出我吗?

3 个答案:

答案 0 :(得分:1)

如果您想在本地测试您的Spark程序,您甚至不需要启动单节点独立Spark。只需将您的主网址设置为local[*],就像这样

val sc = new SparkContext("local[*]", "Simple Application", sparkConf)

然后在sbt中,键入> run来运行程序(这应该与从IntelliJ运行相同,但我曾经使用sbt从终端运行程序)。

由于您可能不希望在local[*]spark://...之间的代码中多次更改主网址,因此可以将其留空

val sc = new SparkContext(new SparkConf())

并在运行时设置java属性,例如,在build.sbt中,您可以添加

javaOptions := Seq("-Dspark.master=local[*]", "-Dspark.app.name=my-app")

并在sbt。

中使用run运行它

要提供更全面的本地模式体验,您可能需要在build.sbt

中添加以下行
run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
runMain in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
fork := true
javaOptions := Seq("-Dspark.master=local[*]", s"-Dspark.app.name=my-app")
outputStrategy := Some(StdoutOutput)

我们已经创建了一个sbt插件,可以为您添加这些设置,它还可以帮助您在云系统上部署独立的Spark集群,如aws ec2,如果您有兴趣,请查看spark-deployer

答案 1 :(得分:1)

你错过了一个至关重要的步骤:

org.apache.spark.deploy.SparkSubmit

https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala

实际上将作业提交给群集。不幸的是,除了spark-submit之外,目前还没有一个可靠的工作包装器。因此,目前还没有一种可靠的方法来以编程方式提交火花作业。 2015年2月部分解决了它的问题:但它没有文档。

 https://github.com/apache/spark/pull/3916/files

困难在于spark-submit提供的环境阴谋的复杂性。尚未发现只能在scala / java代码中复制它们。

答案 2 :(得分:1)

这是班级。

https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/launcher/package-summary.html

    import org.apache.spark.launcher.SparkLauncher;

   public class MyLauncher {
     public static void main(String[] args) throws Exception {
       Process spark = new SparkLauncher()
         .setAppResource("/my/app.jar")
         .setMainClass("my.spark.app.Main")
         .setMaster("local")
         .setConf(SparkLauncher.DRIVER_MEMORY, "2g")
         .launch();
       spark.waitFor();
     }
   }