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发生了什么?为什么需要它,它做了什么?
答案 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
。