Spark Client和Spark Driver有什么区别?

时间:2016-09-22 08:24:43

标签: apache-spark

Spark Client和Spark Driver有什么区别?我一直听说Spark Client是那个提供spark-submit的人,但是我从来没有这样做,只需在public static void main(String[] args)下安装Spark Libraries和Initialize spark context就像下面的代码一样

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import org.apache.spark.api.java.*;
import org.apache.spark.api.java.function.*;
import org.apache.spark.SparkConf;
import scala.Tuple2;

public class JavaWordCount {
  public static void main(String[] args) {

    // create Spark context with Spark configuration
    JavaSparkContext sc = new JavaSparkContext(new SparkConf()
                         .setAppName("Spark Count"))
                         .setMaster(master_url)
                         .setJars(JavaSparkContext.jarOfClass(JavaWordCount.class));

    // get threshold
    final int threshold = Integer.parseInt(args[1]);

    // read in text file and split each document into words
    JavaRDD<String> tokenized = sc.textFile(args[0]).flatMap(
      new FlatMapFunction() {
        public Iterable call(String s) {
          return Arrays.asList(s.split(" "));
        }
      }
    );

    // count the occurrence of each word
    JavaPairRDD<String, Integer> counts = tokenized.mapToPair(
      new PairFunction() {
        public Tuple2 call(String s) {
          return new Tuple2(s, 1);
        }
      }
    ).reduceByKey(
      new Function2() {
        public Integer call(Integer i1, Integer i2) {
          return i1 + i2;
        }
      }
    );

    // filter out words with fewer than threshold occurrences
    JavaPairRDD<String, Integer> filtered = counts.filter(
      new Function, Boolean>() {
        public Boolean call(Tuple2 tup) {
          return tup._2 >= threshold;
        }
      }
    );

    // count characters    
    JavaPairRDD<Character, Integer> charCounts = filtered.flatMap(
      new FlatMapFunction<Tuple2<String, Integer>, Character>() {
        @Override
        public Iterable<Character> call(Tuple2<String, Integer> s) {
          Collection<Character> chars = new ArrayList<Character>(s._1().length());
          for (char c : s._1().toCharArray()) {
            chars.add(c);
          }
          return chars;
        }
      }
    ).mapToPair(
      new PairFunction<Character, Character, Integer>() {
        @Override
        public Tuple2<Character, Integer> call(Character c) {
          return new Tuple2<Character, Integer>(c, 1);
        }
      }
    ).reduceByKey(
      new Function2<Integer, Integer, Integer>() {
        @Override
        public Integer call(Integer i1, Integer i2) {
          return i1 + i2;
        }
      }
    );

    System.out.println(charCounts.collect());
  }
}

在这段代码中,我没有看到任何spark-submit,所以哪个是客户端,哪个是驱动程序?另外,我真的不明白SparkConf.setJars发生了什么?为什么需要它,它做了什么?

2 个答案:

答案 0 :(得分:2)

Master是创建Task并将其提交给Workers并在不同Job Stages之间进行协调的人,而Driver位于Master之上一步,它涉及创建上下文并创建RDD Graph,然后提交给师父。

Spark Driver是一个程序,它声明对数据RDD的转换和操作,并将这些请求提交给master。它基本上创建了SparkContext。

因此,驱动程序使用RDD转换和操作为数据准备上下文和“声明”操作。然后,驱动程序将此序列化RDD图提交给主服务器。 然后,Master从中创建任务并将其提交给Worker以执行。它还协调不同的Job阶段。

答案 1 :(得分:0)

Spark客户我假设您正在谈论 Spark Master ,这是负责安排Spark工作的服务器。

您使用Spark API的代码,但是您必须在运行任何程序时运行它。为了在Spark中运行作业,您必须使用相关的资源管理器(Standalone,YARN或Mesos)来安排它们,以在集群环境中实际执行作业。

组装JAR后,转到Spark Master服务器并使用spark-submit脚本安排作业。 As the documentation states

  

捆绑用户应用程序后,可以使用   bin / spark-submit脚本。这个脚本负责设置   classpath与Spark及其依赖关系,并且可以支持不同   Spark支持的集群管理器和部署模式:

./bin/spark-submit \
  --class <main-class> \
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \
  [application-arguments]
  

一些常用的选项是:

     
      
  • - class:应用程序的入口点(例如org.apache.spark.examples.SparkPi)
  •   
  • - master:群集的主URL(例如spark://23.195.26.187:7077)
  •   
  • - deploy-mode:是在工作节点(集群)上部署驱动程序还是在本地部署为外部客户端(客户端)(默认值:客户端)   †
  •   
  • - conf:key = value格式的任意Spark配置属性。对于包含空格的值,用引号括起“key = value”(如图所示)。   application-jar:捆绑jar的路径,包括你的应用程序和   所有依赖项。 URL必须在您的内部全局可见   例如,一个hdfs://路径或一个file://路径   存在于所有节点上。 application-arguments:传递给的参数   主类的主要方法,如果有的话
  •   
  

另外,我真的不明白发生了什么   SparkContext.setJars?为什么需要它,它做了什么?

我认为你的意思是SparkConf.setJars。如果需要,该设置有助于将未包装到uber JAR中的JAR分发到工作节点。这与将--jars标记传递给spark-submit

相同