是否可以从代码中运行火花纱簇?

时间:2016-02-20 12:05:56

标签: java apache-spark yarn

我有一个MapReduce任务,我想从我的java代码在Spark YARN集群上运行。另外,我想在我的java代码中检索reduce结果(字符串和数字对,元组)。类似的东西:

// I know, it's wrong setMaster("YARN"), but just to describe what I want.
// I want to execute job ob the cluster.
SparkConf sparkConf = new SparkConf().setAppName("Test").setMaster("YARN");
JavaSparkContext sc = new JavaSparkContext(sparkConf);

JavaRDD<Integer> input = sc.parallelize(list);

// map
JavaPairRDD<String, Integer> results = input.mapToPair(new MapToPairExample());

// reduce
String max = results.max(new MyResultsComparator())._1();

如果我将master设置为local,local []或spark:// master:7707。

所以问题是:我能以某种方式对纱线集群做同样的事情吗?

4 个答案:

答案 0 :(得分:1)

你需要使用spark-submit来做。 Spark提交处理许多事情,从发送依赖关系到集群并设置正确的类路径等。 当您在本地模式下将其作为主java程序运行时,IDE将负责类路径(因为驱动程序/执行程序在同一个jvm中运行)。

如果您希望在计算机上运行驱动程序,也可以使用"yarn-client"模式。

对于纱线群集模式,请使用.setMaster("yarn-cluster")

答案 1 :(得分:0)

通常,当将 master 作为 yarn deploy模式作为 cluster < / strong>(来源:Github code base for spark):

  1. spark-submit 脚本调用 Main.java
  2. Main.java 调用 SparkSubmit.java
  3. SparkSubmit.java 通过找出 master deploy 参数来调用 YarnClusterApplication
  4. YarnClusterApplication 调用 Client.java
  5. Client.java 资源管理器进行对话,并移交 ApplicationMaster
  6. 资源管理器在节点管理器上的容器中实例化 ApplicationMaster.java
  7. ApplicationMaster.java
    1. 使用 ExecutorRunnables
    2. 执行者分配容器
    3. 使用反射API找出用户提供的jar中的 main 方法
    4. 通过调用步骤6.2 中的 main 方法生成一个执行用户应用程序的线程。这是您的代码执行的地方

在此流程中,步骤1-5在客户端/网关计算机上发生。从步骤6开始,一切都在Yarn集群上执行。

现在,要回答您的问题,我从未尝试通过代码在 yarn-cluster 模式下执行spark,但是基于上述流程,如果希望代码组在纱线群集模式下运行,则只能在Yarn群集的Node Manager计算机中的应用程序主容器内运行这些代码。而且,只有在命令行中指定 spark-submit --master yarn --deploy-mode cluster 时,您的代码才能到达那里。因此,在代码中指定它,然后:

  1. 运行作业,例如从IDE中失败。
  2. 使用 spark-submit --master yarn --deploy-mode cluster 运行作业将意味着在运行在Node上的ApplicationMaster的线程中执行您的代码Yarn集群中的Manager计算机,最终将重新执行您的 setMaster(“ yarn-cluster”)代码行,该行现在是多余的,但其余代码将成功运行。

欢迎对此进行任何更正!

答案 2 :(得分:0)

想为您指出一些相关的类,这些类可以帮助您从代码到纱线进行火花提交。

基本上,您可以从org.apache.spark:spark-yarn库创建一个yarn部署客户端: 有一个名为org.apache.spark.deploy.yarn的软件包 有一个Client类。

棘手的部分是,您应该将sparkConf传递给该类,并且spark conf应该具有您的hadoopConf(您尝试部署到的集群)

例如,您可以尝试这样的操作(标量):

 def rawHadoopConf(cluster: String): Configuration = {
    val hadoopConfig = new Configuration(false)
    hadoopConfig.addResource(new URL(s"http://hadoop-$cluster.com:50070/conf").openStream())
    hadoopConfig.set("fs.defaultFS", s"hdfs://$cluster/")
    hadoopConfig
  } 

接下来,您可以执行client.submitApplication()

答案 3 :(得分:0)

我在应用程序中使用 sparkConf.setMaster("yarn-cluster") 运行了一个 Spark 作业(不是通过 spark-submit),它按预期运行。驱动程序在 Hadoop 节点之一和指定的其他几个执行程序上启动。 但是,如果您想从另一个应用程序中启动 Spark 作业,您可以尝试如上所述传递 SparkConf 和 HadoopConf。