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