安装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快速大数据分析