Spark 全部模式均使用 spark-submit
命令提交做业,其格式以下:html
./bin/spark-submit \ --class <main-class> \ # 应用程序主入口类 --master <master-url> \ # 集群的 Master Url --deploy-mode <deploy-mode> \ # 部署模式 --conf <key>=<value> \ # 可选配置 ... # other options <application-jar> \ # Jar 包路径 [application-arguments] #传递给主入口类的参数
须要注意的是:在集群环境下,application-jar
必须能被集群中全部节点都能访问,能够是 HDFS 上的路径;也能够是本地文件系统路径,若是是本地文件系统路径,则要求集群中每个机器节点上的相同路径都存在该 Jar 包。java
deploy-mode 有 cluster
和 client
两个可选参数,默认为 client
。这里以 Spark On Yarn 模式对二者进行说明 :git
master-url 的全部可选参数以下表所示:github
Master URL | Meaning |
---|---|
local |
使用一个线程本地运行 Spark |
local[K] |
使用 K 个 worker 线程本地运行 Spark |
local[K,F] |
使用 K 个 worker 线程本地运行 , 第二个参数为 Task 的失败重试次数 |
local[*] |
使用与 CPU 核心数同样的线程数在本地运行 Spark |
local[*,F] |
使用与 CPU 核心数同样的线程数在本地运行 Spark 第二个参数为 Task 的失败重试次数 |
spark://HOST:PORT |
链接至指定的 standalone 集群的 master 节点。端口号默认是 7077。 |
spark://HOST1:PORT1,HOST2:PORT2 |
若是 standalone 集群采用 Zookeeper 实现高可用,则必须包含由 zookeeper 设置的全部 master 主机地址。 |
mesos://HOST:PORT |
链接至给定的 Mesos 集群。端口默认是 5050。对于使用了 ZooKeeper 的 Mesos cluster 来讲,使用 mesos://zk://... 来指定地址,使用 --deploy-mode cluster 模式来提交。 |
yarn |
链接至一个 YARN 集群,集群由配置的 HADOOP_CONF_DIR 或者 YARN_CONF_DIR 来决定。使用 --deploy-mode 参数来配置 client 或 cluster 模式。 |
下面主要介绍三种经常使用部署模式及对应的做业提交方式。web
Local 模式下提交做业最为简单,不须要进行任何配置,提交命令以下:shell
# 本地模式提交应用 spark-submit \ --class org.apache.spark.examples.SparkPi \ --master local[2] \ /usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \ 100 # 传给 SparkPi 的参数
spark-examples_2.11-2.4.0.jar
是 Spark 提供的测试用例包,SparkPi
用于计算 Pi 值,执行结果以下:apache
Standalone 是 Spark 提供的一种内置的集群模式,采用内置的资源管理器进行管理。下面按照如图所示演示 1 个 Mater 和 2 个 Worker 节点的集群配置,这里使用两台主机进行演示:app
首先须要保证 Spark 已经解压在两台主机的相同路径上。而后进入 hadoop001 的 ${SPARK_HOME}/conf/
目录下,拷贝配置样本并进行相关配置:dom
# cp spark-env.sh.template spark-env.sh
在 spark-env.sh
中配置 JDK 的目录,完成后将该配置使用 scp 命令分发到 hadoop002 上:oop
# JDK安装位置 JAVA_HOME=/usr/java/jdk1.8.0_201
在 ${SPARK_HOME}/conf/
目录下,拷贝集群配置样本并进行相关配置:
# cp slaves.template slaves
指定全部 Worker 节点的主机名:
# A Spark Worker will be started on each of the machines listed below. hadoop001 hadoop002
这里须要注意如下三点:
/etc/hosts
文件中已经配置,不然就直接使用 IP 地址;使用 start-all.sh
表明启动 Master 和全部 Worker 服务。
./sbin/start-master.sh
访问 8080 端口,查看 Spark 的 Web-UI 界面,,此时应该显示有两个有效的工做节点:
# 以client模式提交到standalone集群 spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark://hadoop001:7077 \ --executor-memory 2G \ --total-executor-cores 10 \ /usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \ 100 # 以cluster模式提交到standalone集群 spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark://207.184.161.138:7077 \ --deploy-mode cluster \ --supervise \ # 配置此参数表明开启监督,若是主应用程序异常退出,则自动重启 Driver --executor-memory 2G \ --total-executor-cores 10 \ /usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \ 100
在虚拟机上提交做业时常常出现一个的问题是做业没法申请到足够的资源:
Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
这时候能够查看 Web UI,我这里是内存空间不足:提交命令中要求做业的 executor-memory
是 2G,可是实际的工做节点的 Memory
只有 1G,这时候你能够修改 --executor-memory
,也能够修改 Woker 的 Memory
,其默认值为主机全部可用内存值减去 1G。
关于 Master 和 Woker 节点的全部可选配置以下,能够在 spark-env.sh
中进行对应的配置:
Environment Variable(环境变量) | Meaning(含义) |
---|---|
SPARK_MASTER_HOST |
master 节点地址 |
SPARK_MASTER_PORT |
master 节点地址端口(默认:7077) |
SPARK_MASTER_WEBUI_PORT |
master 的 web UI 的端口(默认:8080) |
SPARK_MASTER_OPTS |
仅用于 master 的配置属性,格式是 "-Dx=y"(默认:none),全部属性能够参考官方文档:spark-standalone-mode |
SPARK_LOCAL_DIRS |
spark 的临时存储的目录,用于暂存 map 的输出和持久化存储 RDDs。多个目录用逗号分隔 |
SPARK_WORKER_CORES |
spark worker 节点可使用 CPU Cores 的数量。(默认:所有可用) |
SPARK_WORKER_MEMORY |
spark worker 节点可使用的内存数量(默认:所有的内存减去 1GB); |
SPARK_WORKER_PORT |
spark worker 节点的端口(默认: random(随机)) |
SPARK_WORKER_WEBUI_PORT |
worker 的 web UI 的 Port(端口)(默认:8081) |
SPARK_WORKER_DIR |
worker 运行应用程序的目录,这个目录中包含日志和暂存空间(default:SPARK_HOME/work) |
SPARK_WORKER_OPTS |
仅用于 worker 的配置属性,格式是 "-Dx=y"(默认:none)。全部属性能够参考官方文档:spark-standalone-mode |
SPARK_DAEMON_MEMORY |
分配给 spark master 和 worker 守护进程的内存。(默认: 1G) |
SPARK_DAEMON_JAVA_OPTS |
spark master 和 worker 守护进程的 JVM 选项,格式是 "-Dx=y"(默认:none) |
SPARK_PUBLIC_DNS |
spark master 和 worker 的公开 DNS 名称。(默认:none) |
Spark 支持将做业提交到 Yarn 上运行,此时不须要启动 Master 节点,也不须要启动 Worker 节点。
在 spark-env.sh
中配置 hadoop 的配置目录的位置,可使用 YARN_CONF_DIR
或 HADOOP_CONF_DIR
进行指定:
YARN_CONF_DIR=/usr/app/hadoop-2.6.0-cdh5.15.2/etc/hadoop # JDK安装位置 JAVA_HOME=/usr/java/jdk1.8.0_201
必需要保证 Hadoop 已经启动,这里包括 YARN 和 HDFS 都须要启动,由于在计算过程当中 Spark 会使用 HDFS 存储临时文件,若是 HDFS 没有启动,则会抛出异常。
# start-yarn.sh # start-dfs.sh
# 以client模式提交到yarn集群 spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode client \ --executor-memory 2G \ --num-executors 10 \ /usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \ 100 # 以cluster模式提交到yarn集群 spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode cluster \ --executor-memory 2G \ --num-executors 10 \ /usr/app/spark-2.4.0-bin-hadoop2.6/examples/jars/spark-examples_2.11-2.4.0.jar \ 100
更多大数据系列文章能够参见 GitHub 开源项目: 大数据入门指南