是否可以通过代码运行火花纱簇?

pik*_*ile 5 java hadoop-yarn apache-spark

我有一个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();
Run Code Online (Sandbox Code Playgroud)

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

所以问题是:我可以以某种方式对纱线簇进行同样的处理吗?

She*_*oli 5

通常,当将master作为yarndeploy 模式作为cluster传递时,spark-submit 命令的工作方式如下(来源:Spark 的 Github 代码库):

  1. spark-submit脚本调用Main.java
  2. Main.java调用SparkSubmit.java
  3. SparkSubmit.java通过计算masterdeploy参数调用YarnClusterApplication
  4. YarnClusterApplication调用Client.java
  5. Client.javaResource Manager对话并移交ApplicationMaster
  6. 资源管理器实例ApplicationMaster.java在节点管理器的容器。
  7. 应用大师.java :
    1. 使用ExecutorRunnables执行程序分配容器
    2. 使用反射 API 找出用户提供的 jar 中的主要方法
    3. 通过调用步骤 6.2中的main方法生成一个执行用户应用程序的线程。这是你的代码执行的地方

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

现在,为了回答您的问题,我从未尝试从代码中以纱线集群模式执行 spark ,但是根据上述流程,的代码段只能在节点管理器机器中的应用程序主容器中运行如果您希望它以纱线集群模式运行,则纱线集群。而且,只有当您从命令行指定spark-submit --master yarn --deploy-mode cluster 时,您的代码才能到达那里。所以在代码中指定它并:

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

欢迎对此进行任何更正!


Pan*_*ora 1

您需要使用 Spark-Submit 来完成此操作。Spark 提交会为您处理许多事情,从将依赖项传送到集群以及设置正确的类路径等。当您在本地模式下将其作为主 Java 程序运行时,您的 IDE 会处理类路径(因为驱动程序/执行程序在同一 jvm 中运行)。

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

用于纱线簇模式.setMaster("yarn-cluster")