我有一个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。
所以问题是:我能以某种方式对纱线集群做同样的事情吗?
答案 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-5在客户端/网关计算机上发生。从步骤6开始,一切都在Yarn集群上执行。
现在,要回答您的问题,我从未尝试通过代码在 yarn-cluster 模式下执行spark,但是基于上述流程,您如果希望代码组在纱线群集模式下运行,则只能在Yarn群集的Node Manager计算机中的应用程序主容器内运行这些代码。而且,只有在命令行中指定 spark-submit --master yarn --deploy-mode 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。