Spark提供了交互式shell,交互式shell让我们能够点对点(原文:ad hoc)数据分析。如果你已经使用过R,Python,或者Scala中的shell,或者操作系统shell(例如bash),又或者Windows的命令提示符界面,你将会对Spark的shell感到熟悉。
但实际上Spark shell与其它大部分shell都不一样,其它大部分shell让你通过单个机器上的磁盘或者内存操作数据,Spark shell让你可以操作分布在很多机器上的磁盘或者内存里的数据,而Spark负责在集群上安排这些操作。
因为Spark可以将数据加载进工作节点的内存,所以,很多分布式计算,即使是那些处理分布在很多机器上、大小在TB级的数据,也能在几秒之内运行完成。这让Spark shell适合迭代、点对点和探索性分析。Spark提供Python和Scala shell,这些shell已经被增强来支持连接到集群。
小提示
Spark只提供了Python和Scala shell。但是,因为一个shell对于学习API是非常有用的,我们建议你用这两种语言之一来运行这些例子,即使你是一个Java开发者。在每一个语言中,这些Api都是相似的。
展示Spark shell的强大最简单的方式就是用它们来做简单的数据分析。让我们从官方文档里Quick Start Guide中的例子开始。
第一步是打开一个shell。为了打开Spark的Python版本(也被叫做PySpark),进入你的Spark目录,然后输入:
bin/pyspark
(在Windows里输入:bin\pyspark)
为了打开shell的Scala版本,输入:
bin/spark-shell
shell提示符应该会在几秒内出现。当shell开始的时候,你将会看到大量的日志信息。你可能需要敲击一下Enter键来清除日志输出和得到shell提示符。图2-1展示了当你打开PySpark时它的样子的。
图2-1
log4j.rootCategory=INFO, console
然后调低日志级别,把它改为下面这个样子:
log4j.rootCategory=WARN, console
这样,我们就只会看到WARN和更高级别的日志信息了。
当你再次打开shell,你看到的日志输出应该就少一些了,如图(图2-2)。
图2-2
使用IPython
IPython是一个增强版的Python shell,被许多Python使用者喜爱,它提供了像按tab键补全的功能。你可以在http://ipython.org找到安装它的指令。你可以通过设置IPYTHON环境变量为1来使用带Spark的IPython:
IPYTHON=1 ./bin/pyspark
为了使用IPython Notebook(IPython的基于web浏览器的版本),就用下面的命令:
IPYTHON_OPTS=“notebook” ./bin/pyspark
在Windows上,设置环境变量并运行shell,可以使用下面的命令:
set IPYTHON=1bin\pyspark
在Spark里面,我们通过在分布式数据集上执行操作来表达我们的计算,这些操作会在集群上并行地执行。这些分布式数据集叫做弹性分布式数据集,或者RDD。RDD是Spark对分布式数据和计算的基本抽象。
在我们讲述更多关于RDD的内容之前,让我们通过根据一个本地文本文件在shell中创建一个RDD,并在上面做一些非常简单的点对点分析,具体操作在例2-1(Python)和例2-2(Scala)完成:
例2-1. Python统计文本行数
>>> lines = sc.textFile(“README.md”) # 创建一个叫lines的RDD
>>> lines.count() # 统计这个RDD中元素个数127
>>> lines.first() # 获得这个RDD中的第一个元素
u’# Apache Spark’例2-2. Scala统计文本行数
scala> val lines = sc.textFile(“README.md”) // 创建一个叫lines的
RDDlines: spark.RDD[String] = MappedRDD[…]
scala> lines.count() // 统计这个RDD中元素个数
res0: Long = 127scala> lines.first() // 获得这个RDD中的第一个元素
res1: String = # Apache Spark
通过组合键Ctrl-D可以推出shell。
小提示
我们将在第七章讨论更多关于在集群上分析数据的内容,但是你可能已经从启动shell时的日志输出中注意到这一条信息:
INFO SparkUI: Started SparkUI at http://[ipaddress]:4040
你可以在这里访问Spark UI,然后看到关于你的任务和集群的各种各样的信息。
在例2-1和2-2中,lines变量是一个RDD,它是根据一个在我们本地机器上的文本文件创建的。我们可以在这个RDD上运行各种各样的并行操作,例如统计数据集中元素的个数(这里是文本的文本行行数)或者打印第一个元素。在接下来的章节里,我们将深入讨论RDD,但是在我们深入之前,让我们花点儿时间介绍一下基本的Spark概念。