我已经启动了单节点独立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,但它显然没有。
有人能以正确的方式指出我吗?
答案 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
实际上将作业提交给群集。不幸的是,除了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();
}
}