Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以从代码运行spark纱线簇?_Java_Apache Spark_Yarn - Fatal编程技术网

Java 是否可以从代码运行spark纱线簇?

Java 是否可以从代码运行spark纱线簇?,java,apache-spark,yarn,Java,Apache Spark,Yarn,我有一个MapReduce任务,我想从java代码在Spark纱线集群上运行它。我还想在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")

我有一个MapReduce任务,我想从java代码在Spark纱线集群上运行它。我还想在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();
//我知道,这是错误的setMaster(“纱线”),但只是为了描述我想要的。
//我想在集群中执行作业ob。
SparkConf SparkConf=新SparkConf().setAppName(“测试”).setMaster(“纱线”);
JavaSparkContext sc=新的JavaSparkContext(sparkConf);
JavaRDD input=sc.parallelize(列表);
//地图
javapairrdresults=input.mapToPair(新的MapToPairExample());
//减少
字符串max=results.max(新的MyResultsComparator())。\u 1();
如果我将master设置为local、local[]或spark://master:7707.


所以问题是:我能用纱线簇做同样的事情吗?

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

如果希望驱动程序在机器上运行,也可以使用
“纱线客户端”
模式


对于纱线簇模式,请使用
.setMaster(“纱线簇”)

通常,当将主控作为纱线传递和部署模式作为传递时,spark submit命令的工作方式如下(来源:):

  • spark提交脚本调用Main.java
  • java调用SparkSubmit.java
  • java通过计算master和deploy参数来调用yanclusterapplication
  • YanClusterApplication调用Client.java
  • java与资源管理器对话,并将其交给应用程序管理员
  • 资源管理器在节点管理器的容器中实例化ApplicationMaster.java
  • ApplicationMaster.java:
  • 使用ExecutorRunnables为执行器分配容器
  • 使用反射API找出用户提供的jar中的主要方法
  • 通过调用步骤6.2中的主方法生成执行用户应用程序的线程。这就是执行代码的地方
  • 在此流程中,步骤1-5发生在客户端/网关计算机上。从步骤6开始,所有操作都在纱线簇上执行

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

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

  • 欢迎对此进行任何更正

    想向您介绍一些相关的类,这些类可以帮助您完成从代码到纱线的spark提交

    基本上,您可以从org.apache.spark:spark-spirn库创建一个纱线部署客户端。 有一个名为:org.apache.spark.deploy.warn的包 它有一个客户机类

    棘手的部分是,您应该向该类传递一个sparkConf,spark conf应该有您的hadoopConf(您尝试部署到的集群的hadoopConf)

    例如,您可以尝试以下内容(scala):

    def rawHadoopConf(集群:字符串):配置={
    val hadoopConfig=新配置(false)
    hadoopConfig.addResource(新URL)http://hadoop-$cluster.com:50070/conf”).openStream()
    hadoopConfig.set(“fs.defaultFS”,s“hdfs://$cluster/”)
    hadoopConfig
    
    }
    我在应用程序中使用sparkConf.setMaster(“纱线簇”)运行了一个Spark作业(不是通过Spark submit),它按预期运行。驱动程序在其中一个Hadoop节点和指定的几个其他执行器上启动。 但是,如果您想从另一个应用程序中启动Spark作业,可以尝试传递SparkConf和HadoopConf,如上所述。

    .setMaster(“纱线簇”)#或纱线客户端
    /spark submit--master warn cluster
    您可以在
    master:8088
    上检查您的状态,然后单击运行应用程序的
    应用程序master