1.spark在集群上运行应用的详细过程
(1)用户通过spark-submit脚本提交应用
(2)spark-submit脚本启动驱动器程序,调用用户定义的main()方法
(3)驱动器程序与集群管理器通信,申请资源以启动执行器节点
(4)集群管理器为驱动器程序启动执行器节点
(5)驱动器进程执行用户应用中的操作。根据程序中所定义的对RDD的转化操作和行动操作,驱动器节点把工作以任务的形式发送到执行器进程
(6)任务在执行器程序中进行计算并保存结果
(7)如果驱动器程序的main()方法退出,或者调用了SparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源
2.集群上运行的app和本地运行的区别
集群上运行的app,还没有指定master,而本地运行的app,指定了运行的主机master是“local”,即本地主机。以下是spark WordCount的程序实例,我们没有指定master,需要提交到集群上运行。
importscala.Tuple2;importorg.apache.spark.SparkConf;importorg.apache.spark.api.java.JavaPairRDD;importorg.apache.spark.api.java.JavaRDD;importorg.apache.spark.api.java.JavaSparkContext;importorg.apache.spark.api.java.function.FlatMapFunction;importorg.apache.spark.api.java.function.Function2;importorg.apache.spark.api.java.function.PairFunction;importjava.util.Arrays;importjava.util.List;importjava.util.regex.Pattern;public final classWordCount {private static final Pattern SPACE = Pattern.compile(" ");public static void main(String[] args) throwsException {
SparkConf sparkConf= new SparkConf().setAppName("JavaWordCount");//关键是没有指定master,需要提交到集群上运行
JavaSparkContext ctx = newJavaSparkContext(sparkConf);
JavaRDD lines = ctx.textFile("C:\\test.txt", 1);
JavaRDD words = lines.flatMap(new FlatMapFunction() {public Iterablecall(String s) {returnArrays.asList(SPACE.split(s));
}
});
JavaPairRDD ones = words.mapToPair(new PairFunction() {public Tuple2call(String s) {return new Tuple2(s, 1);
}
});
JavaPairRDD counts = ones.reduceByKey(new Function2() {publicInteger call(Integer i1, Integer i2) {return i1 +i2;
}
});
List> output =counts.collect();for (Tuple2,?>tuple : output) {
System.out.println(tuple._1()+ ": " +tuple._2());
}
ctx.stop();
}
}
3.使用spark-submit部署应用
(1)spark-submit的一般形式
bin/spark-submit [options] [app options]
表示包含应用入口的JAR包或者Python脚本
[app options] 是传给你的应用的选项
spark-submit的一些常见标记
标记
描述
--master
表示要连接的集群管理器
--deploy-mode
选择在本地启动驱动器程序,还是在集群中的一台工作节点机器上启动。在客户端模式下,spark-submit会将驱动器程序运行在spark-submit被调用的这台机器上。在集群模式下,驱动器程序会被传输并被执行于集群的一个工作节点上,默认是本地模式。
--class
运行Java或者Scala程序应用的主类
--name
应用的显示名,会显示在spark的网页用户界面中
--jars
需要上传并放在应用的CLASSPATH中的JAR包的雷彪。如果应用依赖于少量第三方的jar包,可以把它们放在这个参数中
--files
需要放在应用工作目录中的文件雷彪。这个参数一般用来放需要分发到各节点的数据文件
--py-files
需添加到PYTHONPATH中的文件的雷彪。其中可以包含.py /.egg以及.zip文件
--executor-memory
执行器进程使用的内存量,以字节为单位,可以使用后缀指定更大的单位,比如512M或者15g
--driver-memory
驱动器进程使用的内存量,以字节为单位。可以使用后缀指定更大的单位,比如512m或者15g
使用各种选项调用spark-submit
./bin/spark-submit
--master spark:// hostname:7077
--deploy-mode cluster
--class com.databricks.examples.SparkExample
--name "Example program"
--jars dep1.jar,dep2.jar,dep3.jar
--total-executor-core 300
--executor-memory 10g
4.选择合适的集群管理器
(1)如果是从零开始,可以先选择独立集群管理器。独立模式安装起来最简单,而且如果你只是使用spark的话,独立集群管理器提供与其他集群管理器完全一样的全部功能。
(2)如果你要在使用spark的同时使用其他应用,或者是要用到更丰富的资源调度功能(例如队列),那么YARN和Mesos都能满足你的需求。而在这两者中,对于大多数的hadoop发行版来说,一般YARN已经预装好了。
(3)Mesos相对于YARN和独立模式的一大优点在于其细粒度共享的选项,该选项可以将类似Spark shell这样的交互式应用中的不同命令分配到不同的CPU上。因此这对于多用户同时运行交互式shell的用例更有用处。
(4)在任何时候,最好把Spark运行在运行HDFS的节点还是那个,这样能快速访问存储。你可以自行在同样的节点上安装Mesos或独立集群管理器。如果使用YARN的话,大多数发行版已经把YARN和HDFS安装在了一起。