[Spark 基础] 如何安装Spark和使用spark-shell

背景

Apache Spark 是一个快速的、分布式的通用计算引擎,支持Java、Scala、Python和R多种语言,同时在计算引擎之上提供了多种工具,比如处理SQL和结构化数据的 Spark SQL,用于机器学习的 MLlib,用于图处理的 GraphX 和用于流计算的的 Spark Streaming。

在这篇文章里我们学习如何安装和启动Spark。

前置条件

  • 一台Linux/MacOS系统
  • 安装了Java(最好为JDK 8)

下载安装包

打开 下载页面,这里选择了最新版本和Hadoop 2.7预构建版本:

[Spark 基础] 如何安装Spark和使用spark-shell_第1张图片
下载页面

点击链接,获得镜像地址,在命令行用 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 端口,可以看到如下页面:

[Spark 基础] 如何安装Spark和使用spark-shell_第2张图片
Web UI

这个页面会在后面的文章详细介绍,下面我们继续在命令行输入代码(注意上面的输出还告诉我们有两个重要的变量已经被初始化了:名为 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 基础] 如何安装Spark和使用spark-shell_第3张图片
Web UI

从这里可以看到我们在 spark-shell 里的执行的任务状态。

spark-shell 除了可以使用scala语言之外,也可以使用python和R,命令分别为 bin/pysparkbin/sparkR

总结:这篇文章里我们安装了Spark,并且使用 spark-shell 体验了一下Spark的使用方法,相信会有很多地方很费解,我们会在后面的文章里逐步学习其它内容。

欢迎交流讨论,吐槽建议。

勤学似春起之苗,不见其增,日有所长
辍学如磨刀之石,不见其损,日有所亏
关注【大数据学徒】,用技术干货助你日有所长
PS:每鸽一天发100元红包,进群可致富

[Spark 基础] 如何安装Spark和使用spark-shell_第4张图片
大数据学徒

你可能感兴趣的:([Spark 基础] 如何安装Spark和使用spark-shell)