前言
Spark 应用类似于 MR 作业。
在 MR 中,最高级的计算单元是作业。系统读取数据,map,shuffle,reduce,然后写回存储。
在 Spark 中,最高级的计算单元是应用,应用可以运行一系列作业或者是并行作业。一个 Spark 的作业可以由多个阶段组成。Spark 依赖 driver 进程管理工作流和安排任务。
Spark 术语
RDD:Spark 编程核心,是一个容错的元素集组成。可以并行地被多次处理。partition:RDD 的元素子集。partition 是一个并行的单元,Spark 可以并行处理多个 partition的元素。driver:一个 app 一个,负责初始化之类的工作。executor:真正跑程序的进程。一个主机可能会有多个 executor。deploy mode:client mode 的 driver 运行在 cluster 之外,cluster mode 的 driver 运行在 cluster 内,并 log out 之后程序不会中断。
运行 spark 程序的方法
可以使用 spark-submit 脚本提交已经编译好的 spark 程序。
提交命令:
spark-submit --option value application jar | python file [application arguments]
optional table 如下:
master 值如下:
控制参数读取的优先顺序:
SparkConf 传入的参数spark-submit,spark-shell 或者 pyspark 传入的参数spark-defaults.conf 中设置的属性
集群模式概览
下面是使用 spark-submit 提交一个应用到集群时所发生的事情:
spark-submit 启动 driver 进程并调用了应用的 main 方法。driver 进程向集群申请资源去启动 executors集群取代 driver 启动 executordriver 运行用户程序,将一系列操作发送到 executors任务运行如果 main 方法里有 exits 或者调用 SparkConf.stop ,就会停止 executors 并释放资源
spark 运行模式总结
Cluster Mode:
Client Mode:
下面这些选项是用于提交 Spark on YARN 应用程序:
Cluster mode 的例子:
spark-submit --master yarn --deploy-mode cluster SPARK_HOME/lib/spark-examples.jar --class org.apache.spark.examples.SparkPi 10
Client Mode 的例子:
spark-submit --master yarn --deploy-mode client SPARK_HOME/lib/spark-examples.jar --class org.apache.spark.examples.SparkPi 10
Spark 动态分配 executor
如果程序资源需求经常变化,spark 可以动态增加或者减少程序 executor 的数目。
要使动态分配生效,可以设置 spark.dynamicAllocation.enabled 的值为 true 。
程序分配最少的 executor 数目的属性是 spark.dynamicAllocation.minExecutors,最多的是 spark.dynamicAllocation.maxExecutors,初始化值是通过设置 spark.dynamicAllocation.initialExecutors 参数。
这时候不要使用 –num-executors 参数或者设置 spark.executor.instances 这个参数,它们之间并不相容。
优化 YARN 模式
通常,每次提交任务 spark 都会将 assembly jar上传到 hdfs,可以省下这步提高效率,可以手动上传之后设置 SPARK_JAR 环境变量。
SPARK_JAR=hdfs://namenode:8020/user/spark/share/lib/spark-assembly.jar
参考
Managing Spark | 6.1.x | Cloudera Documentation