一、local
(一)spark-submit
在之前的WordCount实例中使用了spark-submit命令提交运行脚本:
[root@hadoop-master bin]#./spark-submit --master local[2] --name wordcount /root/hadoopdata/WordCount.py file:root/hadoopdata/wordcount.txt
spark-submit和pyspark命令是一样的:
./bin/spark-submit \--class \--master \--deploy-mode \--conf =\
...#other options
\
[application-arguments]
--class:应用程序的入口
--master:集群master的url(e.g. spark://23.195.26.187:7077)
--deploy-mode:部署模式,是将你的driver部署在集群的节点上,还是将本地作为一个外部的客户端
--conf::spark的配置,通过key-value的形式输入参数
application-jar::程序依赖的jar包
application-arguments: 传递参数到main class中
我们主要用spark跑python的应用程序:
For Python applications, simply pass a .py file in the place of instead of a JAR, and add Python .zip, .egg or .py files to the search path with --py-files.
如果是python的应用,就不需要通过的方式,可以通过增加py file的方式。
(二)local
在上面提交py脚本到spark环境中,通过了--master,其后的参数是local[2],这就是local模式。
Master URL
Meaning
local
Run Spark locally with one worker thread (i.e. no parallelism at all).
local[K]
Run Spark locally with K worker threads (ideally, set this to the number of cores on your machine).
local[*]
Run Spark locally with as many worker threads as logical cores on your machine.
local模式是单机的模式。
二、Standalone
(一)安装Standalone模式
1、启动集群
(1)启动master
./sbin/start-master.sh
(2)启动slave
./sbin/start-slave.sh
启动完成后,spark中就有两个进程一个是master,一个是worker。这是主从关系。
(3)启动参数
(4)搭建集群
slaves
local模式中不需要修改spark中的任何东西,但是在Standalone模式中需要修改spark中的conf,即进入/root/app/spark-2.0.2-bin-hadoop2.6/conf:
[root@hadoop-master conf]#cp slaves.template slaves
vim slaves
#A Spark Worker will be started on each of the machines listed below.#localhost
hadoop-master #修改为机器的地址localhost也是可行的
注意的是如果是多台机器的话,此时这个文件中应该加入多台机器的地址:
#A Spark Worker will be started on each of the machines listed below.#localhost
hadoop-master #修改为机器的地址localhost也是可行的
hadoop-slave1
hadoop-slave2
hadoop-slave3
View Code
然后在每台机器的相同路径下部署spark即可。
spark-env.sh
进入/root/app/spark-2.0.2-bin-hadoop2.6/conf:
[root@hadoop-master conf]#cp spark-env.sh.template spark-env.sh
vim spark-env.sh
#See the License for the specific language governing permissions and#limitations under the License.#JAVA_HOME=/root/app/jdk1.8.0_74 #设置JAVA_HOME,可通过echo $JAVA_HOME查看路径
#This file is sourced when running various Spark programs.#Copy it as spark-env.sh and edit that to configure Spark for your site.
启动
进入到spark中的sbin目录,即:/root/app/spark-2.0.2-bin-hadoop2.6/sbin
[root@hadoop-master sbin]#./start-all.sh
查看进程:
[root@hadoop-master sbin]#jps
85569Master86161Jps85788 Worker
如果有Master和Worker进程说明启动成功了。
另外一点就是master日志中的描述:
...
20/04/11 13:22:39 INFO Utils: Successfully started service 'sparkMaster' on port 7077.
20/04/11 13:22:39 INFO Master: Starting Spark master at spark://hadoop-master:7077
20/04/11 13:22:39 INFO Master: Running Spark version 2.0.2
20/04/11 13:22:40 INFO Utils: Successfully started service 'MasterUI' on port 8080.
20/04/11 13:22:40 INFO MasterWebUI: Bound MasterWebUI to 0.0.0.0, and started at http://192.168.0.110:8080
...
7077端口时spark集群的url端口,用于提交作业使用,另外一个8080是管理spark的web界面的url端口:
(二)提交作业
1、pyspark shell
此时Standalone模式的集群搭建完毕了,那么应该怎么提交你的作业呢?进入到:/root/app/spark-2.0.2-bin-hadoop2.6/bin
[root@hadoop-master bin]#./pyspark --master spark://hadoop-master:7077
注意:此时--master参数就不是local了,而是启动的master地址:spark://hadoop-master:7077
此时你刷新一下页面就会出现运行的application。
此时就可以在pyspark shell上进行工作了,比如:
Using Python version 3.5.2 (default, Mar 30 2020 22:25:54)
SparkSession available as'spark'.>>> data = [1,2,3]>>>sc.parallelize(data).collect()
[1, 2, 3]>>>
对应的在这个页面中也会有对应的变化。
2、spark-submit
上面是在shell上写的代码进行测试,但是如果通过spark-submit提交文件进行测试,应该怎么做呢?值得注意的是,如果你的Standalone模式不止一个节点,那么你就需要在每一个节点上都需要有测试文件,因为此时是分布式的运行。那么我们可以把文件放到hdfs上,然后从hdfs上读取文件。
(1)准备文件
[root@hadoop-master sbin]#hadoop fs -put ~/hadoopdata/wordcount.txt /[root@hadoop-master sbin]#hadoop fs -ls /
Found 1items-rw-r--r-- 1 root supergroup 33 2020-04-11 15:28 /wordcount.txt
(2)进行测试
[root@hadoop-master bin]#./spark-submit --master spark://hadoop-master:7077 --name wordcount /root/hadoopdata/WordCount.py
hdfs://hadoop-master:8020/wordcount.txt
注意:py文件还是在本地,wordcount.txt是在hdfs上;--master连接的是Standalone模式下的集群。
上面执行如果出现类似这种错误:Exception: Randomness of hash of string should be disabled via PYTHONHASHSEED,请在命令中加入--conf参数:
[root@hadoop-master bin]#./spark-submit --master spark://hadoop-master:7077 --conf spark.executorEnv.PYTHONHASHSEED=321 --name wordcount
/root/hadoopdata/WordCount.py hdfs://hadoop-master:8020/wordcount.txt
三、yarn
yarn的运行模式与Standalone模式有什么区别呢?在这个运行模式下,spark只是作为一个客户端,它需要做的事情就是将作业提交到yarn上进行运行即可。
Standalone模式下,你的spark集群下每一个节点上都需要部署spark,然后需要启动spark集群(即启动master与slaves)
yarn模式下,你只需要一个节点,然后提交作业即可,这个是不需要spark集群的(不需要启动master与slaves)
(一)启动准备
在yarn上启动spark前需要弄清一些概念和进行一些配置。
1、HADOOP_CONF_DIR or YARN_CONF_DIR
确定HADOOP_CONF_DIR or YARN_CONF_DIR这两个参数其中之一指定的是hadoop集群配置文件的目录,这样读取到的配置文件,保证一致性,进入到/root/app/spark-2.0.2-bin-hadoop2.6/conf下:
vim spark-env.sh
#limitations under the License.#HADOOP_CONF_DIR=/root/app/hadoop-2.6.1/etc/hadoop #配置该参数
JAVA_HOME=/root/app/jdk1.8.0_74#This file is sourced when running various Spark programs.
2、--deploy-mode
另外还有一个重要的参数是--deploy-mode,yarn支持client和cluster模式,spark driver运行在什么地方就是什么模式,如果运行在本地local就是client模式。如果运行在cluster里就是cluster模式,对于交互式shell只能运行client模式,不能运行cluster模式。那么这两种模式有什么区别呢?
client 提交作业的进程不能停止,否则作业就会提交失败
cluster 提交完作业就可以断开,因为driver运行在am里面
(二)进行测试
首先应该确保你的hadoop和yarn是运行状态:
[root@hadoop-master bin]#jps
118305 ExecutorLauncher
110707 NodeManager
114277 SparkSubmit
107908 DataNode
110260 ResourceManager4727Master4890Worker107389 NameNode
108750 SecondaryNameNode118334 Jps
1、spark sehll
spark shell是只能使用client模式的:
[root@hadoop-master bin]#./pyspark --master yarn
然后可以输入命令进行操作。此时就去hadoop的web界面进行查看任务的执行情况:
2、spark-submit
对于提交文件进行操作,与上面的模式基本相同,只是需要修改--master参数即可:
[root@hadoop-master bin]#./spark-submit --master yarn --conf spark.executorEnv.PYTHONHASHSEED=321 --name wordcount
/root/hadoopdata/WordCount.py hdfs://hadoop-master:8020/wordcount.txt