Spark学习笔记
安装Spark
Spark的运行依赖JVM,所以你需要一台安装了JVM的机器。
首先从 https://spark.apache.org/downloads.html 下载Spark程序包并解压,解压后的目录如下
➜ spark-2.3.0-bin-hadoop2.7 ll
total 112
-rw-r--r--@ 1 hourui staff 18045 2 23 2018 LICENSE
-rw-r--r--@ 1 hourui staff 24913 2 23 2018 NOTICE
drwxr-xr-x@ 3 hourui staff 96 2 23 2018 R
-rw-r--r--@ 1 hourui staff 3809 2 23 2018 README.md
-rw-r--r--@ 1 hourui staff 187 2 23 2018 RELEASE
drwxr-xr-x@ 29 hourui staff 928 2 23 2018 bin
drwxr-xr-x@ 9 hourui staff 288 2 23 2018 conf
drwxr-xr-x@ 5 hourui staff 160 2 23 2018 data
drwxr-xr-x@ 4 hourui staff 128 2 23 2018 examples
drwxr-xr-x@ 229 hourui staff 7328 2 23 2018 jars
drwxr-xr-x@ 3 hourui staff 96 2 23 2018 kubernetes
drwxr-xr-x@ 40 hourui staff 1280 2 23 2018 licenses
drwxr-xr-x 5 hourui staff 160 2 15 16:40 logs
drwxr-xr-x@ 16 hourui staff 512 2 23 2018 python
drwxr-xr-x@ 24 hourui staff 768 2 23 2018 sbin
drwxr-xr-x 2 hourui staff 64 2 15 16:38 work
drwxr-xr-x@ 3 hourui staff 96 2 23 2018 yarn
其中 sbin
文件夹中保存了管理集群相关的脚本,而 bin
文件夹中则保存了Spark任务相关的脚本。Spark的任务支持R、Python、Java和Scala编写,比较常见的是使用Java或Scala。
Spark的启动分为local和集群,而集群又有以下几种创建方式
- Standalone Deploy Mode
- Apache Mesos
- Hadoop YARN
- Kubernetes
Spark支持Python、Scala和R的shell,同时也支持Python、Scala、R和Java的submit to cluster。
启动和停止Standalone集群
Spark中的节点分为master节点和worker节点,worker节点受master节点管理实现高可用,master节点本身可以通过Zookeeper实现高可用。管理Spark集群的相关脚本都在 sbin
文件夹中
启动master节点
➜ sbin ./start-master.sh --host 127.0.0.1
starting org.apache.spark.deploy.master.Master, logging to /Users/hourui/spark-2.3.0-bin-hadoop2.7/logs/spark-hourui-org.apache.spark.deploy.master.Master-1-Mac.out
查看master进程状态
➜ sbin ps -ef | grep spark
501 34593 1 0 5:48下午 ttys000 0:03.98 /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/java -cp /Users/hourui/spark-2.3.0-bin-hadoop2.7/conf/:/Users/hourui/spark-2.3.0-bin-hadoop2.7/jars/* -Xmx1g org.apache.spark.deploy.master.Master --host Mac --port 7077 --webui-port 8080 --host 127.0.0.1
启动worker节点
在上面的master进程状态中我们看到了master进程的host是127.0.0.1
,port是7077,我们根据master的host和port构建url spark://<host>:<port>
,worker以此url作为参数启动。
➜ sbin ./start-slave.sh spark://127.0.0.1:7077
starting org.apache.spark.deploy.worker.Worker, logging to /Users/hourui/spark-2.3.0-bin-hadoop2.7/logs/spark-hourui-org.apache.spark.deploy.worker.Worker-1-Mac.out
接下来我们使用命令 ps
查看集群的情况
➜ ps -ef | grep spark
501 34593 1 0 5:48下午 ttys000 0:05.54 /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/java -cp /Users/hourui/spark-2.3.0-bin-hadoop2.7/conf/:/Users/hourui/spark-2.3.0-bin-hadoop2.7/jars/* -Xmx1g org.apache.spark.deploy.master.Master --host Mac --port 7077 --webui-port 8080 --host 127.0.0.1
501 34691 1 0 5:51下午 ttys000 0:05.14 /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin/java -cp /Users/hourui/spark-2.3.0-bin-hadoop2.7/conf/:/Users/hourui/spark-2.3.0-bin-hadoop2.7/jars/* -Xmx1g org.apache.spark.deploy.worker.Worker --webui-port 8081 spark://127.0.0.1:7077
可以看到master和worker进程都正常启动了。此外,master和worker还各自提供了监听在8080和8081端口的webui,我们可以在浏览器中访问http://127.0.0.1:8080/和http://127.0.0.1:8081/观察master和worker的状态。
停止master和worker进程
➜ sbin ./stop-slave.sh
stopping org.apache.spark.deploy.worker.Worker
➜ sbin ./stop-master.sh
stopping org.apache.spark.deploy.master.Master
之后我们再使用 ps
命令就会发现spark进程已经都没有了。
运行 Spark 应用
就Scala而言,目前我们有着三种提交任务的方式:
1. 使用shell(这里启动的是Scala的shell,当然 ./pyspark
和 ./sparkR
也能启动Python和R的shell)
./spark-shell --master spark://127.0.0.1:7077
如果不设置master则默认为local模式
2. 直接在代码中设置master为local,之后运行程序,程序会在本地运行
1 | object Test { |
3. 写完代码并打包,之后使用 ./spark-submit
提交程序到Spark集群。
例如对于上面这个程序,我们把其放在maven项目中,项目结构如下:
.
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── me
│ │ └── hourui
│ │ └── Test.scala
│ └── resources
└── test
└── java
我们的代码位于Test.scala
,使用命令 mvn clean package
打包,得到文件 learn_spark-1.0-SNAPSHOT.jar
。之后使用命令提交任务到集群
➜ bin ./spark-submit --master spark://127.0.0.1:7077 \
--deploy-mode cluster \
--class me.hourui.Test \
/Users/hourui/IdeaProjects/learn_spark/target/learn_spark-1.0-SNAPSHOT.jar