背景
Apache Spark 是一个快速的、分布式的通用计算引擎,支持Java、Scala、Python和R多种语言,同时在计算引擎之上提供了多种工具,比如处理SQL和结构化数据的 Spark SQL,用于机器学习的 MLlib,用于图处理的 GraphX 和用于流计算的的 Spark Streaming。
在这篇文章里我们学习如何安装和启动Spark。
前置条件
- 一台Linux/MacOS系统
- 安装了Java(最好为JDK 8)
下载安装包
打开 下载页面,这里选择了最新版本和Hadoop 2.7预构建版本:
点击链接,获得镜像地址,在命令行用 wget
进行下载,下载后解压:
wget http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz
tar xvf spark-2.4.4-bin-hadoop2.7.tgz
cd spark-2.4.4-bin-hadoop2.7
运行example
安装好以后可以尝试运行一下自带的例子 SparkPi
,计算圆周率,命令为:
$ bin/run-example SparkPi 10
# 其中10表示使用10个executor,executor是Spark的基本计算单元
上面的命令会输出很多信息,可以通过如下方式屏蔽,只输出运行结果:
$ bin/run-example SparkPi 10 2>/dev/null
Pi is roughly 3.142995142995143
运行模式
如开头所述,Spark是一个分布式的计算引擎,上面的example为什么可以在什么都不配置的情况下运行起一个集群,事实上,上面的example并不是分布式运行的,Spark有多种运行模式:local、Standalone、on Yarn、on Mesos、on Kubernetes等,当不指定运行模式时,默认以local模式运行,local模式是用多线程模拟了集群的启动和管理、任务的提交和运行等多种功能;Standalone模式是通过多台物理机以主从模式组成一个集群,由Spark自己进行计算资源的管理和调度;其余的三种模式都是通过已有的资源管理器来运行Spark,具体的差别可以参考 这篇文章,我认为讲解的十分清晰。
无论Spark以何种方式运行,它的内存计算模型都是相同的,如果是出于学习验证的目的,local模式非常适合。
使用spark-shell
除了可以一次性向Spark提交完整的代码运行之外,Spark还提供了交互式的spark-shell
,在 spark-shell
里,可以一行一行的输入代码,然后即时的得到代码运行结果,也就是所谓的REPL(Read-Evaluate-Print-Loop),下面用一个简单的例子演示一下用法,启动 spark-shell
的命令和输出如下:
$ bin/spark-shell
19/11/04 21:13:00 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://localhost:4040
Spark context available as 'sc' (master = local[*], app id = local-1572873185636).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.4
/_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_181)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
其中比较关键的内容为:
Spark context Web UI available at http://localhost:4040
Spark context available as 'sc' (master = local[*], app id = local-1572873185636).
Spark session available as 'spark'.
一件令人喜出望外的事是,Spark自带了一个Web UI,Web UI用来查看和调试十分方便,在浏览器中打开本机的 4040
端口,可以看到如下页面:
这个页面会在后面的文章详细介绍,下面我们继续在命令行输入代码(注意上面的输出还告诉我们有两个重要的变量已经被初始化了:名为 sc
的SparkContext对象 和 名为 spark
的 SparkSession对象):
scala> val textFile = spark.read.textFile("README.md")
textFile: org.apache.spark.sql.Dataset[String] = [value: string]
scala> textFile.count()
res0: Long = 105
上面这两行把当前路径的 README.md
文件读入内存,每行被读成一个String
,多个 String
组成Spark的 Dataset
对象,Dataset
是一种Spark的概念,现在假装它是个类似数组的东西,它包含了 105
个String,确认一下是否正确:
$ wc -l README.md
105 README.md
继续,在Spark中查看我们读到的这个 Dataset
对象的第一个元素:
scala> textFile.first()
res1: String = # Apache Spark
第一个字符串的内容是 # Apache Spark
,再确认一下:
$ head -1 README.md
# Apache Spark
下面来统计一下 README.md
中有多少行带有 Spark
,先用Spark:
scala> textFile.filter(line => line.contains("Spark")).count()
res2: Long = 20
再用Bash:
$ grep Spark README.md | wc -l
20
你可能会觉得上面的这些功能用其它的代码同样可以实现,是的,如果光是处理一个100行的文件,是没有必要使用Spark的,但当你需要处理一个几十上百G甚至上T的文件时,上面的代码无需任何修改Spark能以同样的方式运行,无需去顾虑内存、文件IO、分布式通信等各种细节,并且效率非常高,这是用普通的代码实现不了的。
看一眼Web UI:
从这里可以看到我们在 spark-shell
里的执行的任务状态。
spark-shell
除了可以使用scala语言之外,也可以使用python和R,命令分别为 bin/pyspark
和 bin/sparkR
。
总结:这篇文章里我们安装了Spark,并且使用 spark-shell
体验了一下Spark的使用方法,相信会有很多地方很费解,我们会在后面的文章里逐步学习其它内容。
欢迎交流讨论,吐槽建议。
勤学似春起之苗,不见其增,日有所长
辍学如磨刀之石,不见其损,日有所亏
关注【大数据学徒】,用技术干货助你日有所长
PS:每鸽一天发100元红包,进群可致富