Spark中文手册10:spark部署:提交应用程序及独立部署模式
Posted wanmeilingdu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark中文手册10:spark部署:提交应用程序及独立部署模式相关的知识,希望对你有一定的参考价值。
问题导读1.spark-submit各个参数的含义是什么?
2.集群启动都包含哪些脚本?
3.如何实现连接一个应用程序到集群中?
1.提交应用程序
在Spark bin目录下的spark-submit可以用来在集群上启动应用程序。它可以通过统一的接口使用Spark支持的所有 集群管理器 ,所有你不必为每一个管理器做相应的配置。
用spark-submit启动应用程序 bin/spark-submit脚本负责建立包含Spark以及其依赖的类路径(classpath),它支持不同的集群管理器以及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:集群的master URL(如spark://23.195.26.187:7077)
- --deploy-mode:在worker节点部署你的driver(cluster)或者本地作为外部客户端(client)。默认是client。
- --conf:任意的Spark配置属性,格式是key=value。
- application-jar:包含应用程序以及其依赖的jar包的路径。这个URL必须在集群中全局可见,例如,存在于所有节点的hdfs://路径或file://路径
- application-arguments:传递给主类的主方法的参数
一个通用的部署策略是从网关集群提交你的应用程序,这个网关机器和你的worker集群物理上协作。在这种设置下,client模式是适合的。在client模式下,driver直接在spark-submit进程 中启动,而这个进程直接作为集群的客户端。应用程序的输入和输出都和控制台相连接。因此,这种模式特别适合涉及REPL的应用程序。
另一种选择,如果你的应用程序从一个和worker机器相距很远的机器上提交,通常情况下用cluster模式减少drivers和executors的网络迟延。注意,cluster模式目前不支持独立集群、 mesos集群以及python应用程序。
有几个我们使用的集群管理器特有的可用选项。例如,在Spark独立集群的cluster模式下,你也可以指定--supervise用来确保driver自动重启(如果它因为非零退出码失败)。 为了列举spark-submit所有的可用选项,用--help运行它。
- # Run application locally on 8 cores
- ./bin/spark-submit \\
- --class org.apache.spark.examples.SparkPi \\
- --master local[8] \\
- /path/to/examples.jar \\
- 100
-
- # Run on a Spark Standalone cluster in client deploy mode
- ./bin/spark-submit \\
- --class org.apache.spark.examples.SparkPi \\
- --master spark://207.184.161.138:7077 \\
- --executor-memory 20G \\
- --total-executor-cores 100 \\
- /path/to/examples.jar \\
- 1000
-
- # Run on a Spark Standalone cluster in cluster deploy mode with supervise
- ./bin/spark-submit \\
- --class org.apache.spark.examples.SparkPi \\
- --master spark://207.184.161.138:7077 \\
- --deploy-mode cluster
- --supervise
- --executor-memory 20G \\
- --total-executor-cores 100 \\
- /path/to/examples.jar \\
- 1000
-
- # Run on a YARN cluster
- export HADOOP_CONF_DIR=XXX
- ./bin/spark-submit \\
- --class org.apache.spark.examples.SparkPi \\
- --master yarn-cluster \\ # can also be `yarn-client` for client mode
- --executor-memory 20G \\
- --num-executors 50 \\
- /path/to/examples.jar \\
- 1000
-
- # Run a Python application on a Spark Standalone cluster
- ./bin/spark-submit \\
- --master spark://207.184.161.138:7077 \\
- examples/src/main/python/pi.py \\
- 1000
Master URLs 传递给Spark的url可以用下面的模式
2.Spark独立部署模式
安装Spark独立模式集群 安装Spark独立模式,你只需要将Spark的编译版本简单的放到集群的每个节点。你可以获得每个稳定版本的预编译版本,也可以自己编译。
手动启动集群 你能够通过下面的方式启动独立的master服务器。
- ./sbin/start-master.sh
一旦启动,master将会为自己打印出 spark://HOST:PORT URL,你能够用它连接到workers或者作为"master"参数传递给 SparkContext。你也可以在master web UI上发现这个URL, master web UI默认的地址是 http://localhost:8080。 相同的,你也可以启动一个或者多个workers或者将它们连接到master。
- ./bin/spark-class org.apache.spark.deploy.worker.Worker spark://IP:PORT
一旦你启动了一个worker,查看master web UI。你可以看到新的节点列表以及节点的CPU数以及内存。 下面的配置参数可以传递给master和worker。
集群启动脚本 为了用启动脚本启动Spark独立集群,你应该在你的Spark目录下建立一个名为conf/slaves的文件,这个文件必须包含所有你要启动的Spark worker所在机器的主机名,一行一个。如果 conf/slaves不存在,启动脚本默认为单个机器(localhost),这台机器对于测试是有用的。注意,master机器通过ssh访问所有的worker。在默认情况下,SSH是并行运行,需要设置无密码(采用私有密钥)的访问。 如果你没有设置为无密码访问,你可以设置环境变量SPARK_SSH_FOREGROUND,为每个worker提供密码。
一旦你设置了这个文件,你就可以通过下面的shell脚本启动或者停止你的集群。
- sbin/start-master.sh:在机器上启动一个master实例
- sbin/start-slaves.sh:在每台机器上启动一个slave实例
- sbin/start-all.sh:同时启动一个master实例和所有slave实例
- sbin/stop-master.sh:停止master实例
- sbin/stop-slaves.sh:停止所有slave实例
- sbin/stop-all.sh:停止master实例和所有slave实例
注意,这些脚本必须在你的Spark master运行的机器上执行,而不是在你的本地机器上面。 你可以在conf/spark-env.sh中设置环境变量进一步配置集群。利用conf/spark-env.sh.template创建这个文件,然后将它复制到所有的worker机器上使设置有效。下面的设置可以起作用:
注意,启动脚本还不支持windows。为了在windows上启动Spark集群,需要手动启动master和workers。 SPARK_MASTER_OPTS支持一下的系统属性:
SPARK_WORKER_OPTS支持的系统属性:
连接一个应用程序到集群中 为了在Spark集群中运行一个应用程序,简单地传递spark://IP:PORT URL到 SparkContext 为了在集群上运行一个交互式的Spark shell,运行一下命令:
- ./bin/spark-shell --master spark://IP:PORT
你也可以传递一个选项--total-executor-cores <numCores>去控制spark-shell的核数。
启动Spark应用程序 spark-submit脚本支持最直接的提交一个Spark应用程序到集群。对于独立部署的集群,Spark目前支持两种部署模式。在 client模式中,driver启动进程与 客户端提交应用程序所在的进程是同一个进程。然而,在 cluster模式中,driver在集群的某个worker进程中启动,只有客户端进程完成了提交任务,它不会等到应用程序完成就会退出。
如果你的应用程序通过Spark submit启动,你的应用程序jar包将会自动分发到所有的worker节点。对于你的应用程序依赖的其它jar包,你应该用--jars符号指定(如--jars jar1,jar2)。
另外,cluster模式支持自动的重启你的应用程序(如果程序一非零的退出码退出)。为了用这个特征,当启动应用程序时,你可以传递--supervise符号到spark-submit。如果你想杀死反复失败的应用, 你可以通过如下的方式:
- ./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>
你可以在独立部署的Master web UI(http://:8080)中找到driver ID。
资源调度 独立部署的集群模式仅仅支持简单的FIFO调度器。然而,为了允许多个并行的用户,你能够控制每个应用程序能用的最大资源数。在默认情况下,它将获得集群的所有核,这只有在某一时刻只 允许一个应用程序才有意义。你可以通过 spark.cores.max在 SparkConf中设置核数。
- val conf = new SparkConf()
- .setMaster(...)
- .setAppName(...)
- .set("spark.cores.max", "10")
- val sc = new SparkContext(conf)
另外,你可以在集群的master进程中配置spark.deploy.defaultCores来改变默认的值。在conf/spark-env.sh添加下面的行:
- export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"
这在用户没有配置最大核数的共享集群中是有用的。
高可用 默认情况下,独立的调度集群对worker失败是有弹性的(在Spark本身的范围内是有弹性的,对丢失的工作通过转移它到另外的worker来解决)。然而,调度器通过master去执行调度决定, 这会造成单点故障:如果master死了,新的应用程序就无法创建。为了避免这个,我们有两个高可用的模式。
用ZooKeeper的备用master 利用ZooKeeper去支持领导选举以及一些状态存储,你能够在你的集群中启动多个master,这些master连接到同一个ZooKeeper实例上。一个被选为“领导”,其它的保持备用模式。如果当前 的领导死了,另一个master将会被选中,恢复老master的状态,然后恢复调度。整个的恢复过程大概需要1到2分钟。注意,这个恢复时间仅仅会影响调度新的应用程序-运行在失败master中的 应用程序不受影响。
配置 为了开启这个恢复模式,你可以用下面的属性在 spark-env中设置 SPARK_DAEMON_JAVA_OPTS。