安装 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
2
3
4
5
6
7
8
9
10
11
12
object Test {

def main(args: Array[String]) {
val inputFile = "/Users/hourui/Desktop/test_go.go"
val conf = new SparkConf().setAppName("learn_spark").setMaster("local")
val sc = new SparkContext(conf)
val textFile = sc.textFile(inputFile)
val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
wordCount.foreach(println)
}

}

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

参考

http://chant00.com/2017/07/28/Spark学习笔记/
Spark 快速大数据分析