第1.1节 为什么需要Spark
一、MapReduce计算模式的弊端
- 首先,MapReduce的设计是为了用于高吞吐量的批数据处理作业的,本身的延迟就相对较高
- 其次,数据是存储与HDFS中的,数据共享效率低。我们在前面WordCount的例子中可以看到,Job最后的结果必须要落盘。在MapRduce的Shuffle流程中,我们曾经介绍过,MapReduce的数据在Map端处理完成之后也都是存储在磁盘上的,没有很好的利用内存。当然,这一点其实是时代的限制,因为MapReduce模式在设计时,内存还是十分昂贵的
- 再者,MapReduce对复杂计算的支持并不好,尤其是对于图计算、迭代计算。还记得那个WordCount吗?还记得那个两阶段的编程框架Mapper-Reducer吗?Hadoop的表达是匮乏的,在复杂计算中,无法高效的表达出计算逻辑。并且,MapReduce中的每次操作落盘,这倒是大量的时间浪费在IO上。熟悉操作系统的人都知道,IO操作是相当耗时的,这些问题,导致MapReduce在复杂计算上表现乏力。
二、Spark能做到什么
MapReduce的弊端促使科学家探索新的计算模式。在后Hadoop时代,开始出现新的大数据计算模式和系统。其中尤其以内存计算为核心,集诸多计算模式之大成的Spark生态是典型代表。Spark支持如下的计算:
- 大数据查询分析计算
- 批处理计算
- 流式计算
- 迭代计算
- 图计算
- 内存计算
相较于Hadoop MapReduce,Spark的优势也很明显,首先是 速度 ,官网的对比图简洁明了。
再者是 广泛性 ,Spark支持SQL,Streaming,以及Graph等。
其次是 多处运行 ,Spark可以在Hadoop,Mesos,Standalone或者在云上执行。
最后是 易用性 ,Spark支持Java, Scala, Python和R
三、 Spark的基本组件
上图展示了Spark生态中的基本组件。当然,随着Spark社区的发展,现在的Spark组件会更丰富一些。但是,不论是Spark SQL,Spark Streaming,Spark MLlib,还是GraphX组件,都是基于基本的Spark,即Spark Core。后续,我们也是基于Spark Core来介绍Spark。
第1.2节 Spark的安装
一、Spark安装
如果你已经安装好了Hadoop,那么你现在安装Spark应该是不费力气的。你可以点这里获得安装链接。
首先从官网下载你想要的Spark,一般来说,如果你已经安装好了Hadoop,你可以选择安装 pre-built with user-provider Apache Hadoop 版本。否则你可以选择其他自己喜欢的版本。一般来说,很少由于版本问题报错。
但是,为了统一,建议使用 Scala-2.11 版本。
将下载的好的Spark解压,放到你想要安装的位置。
说出来你可能不信,但是,这样Spark确实就装好了。这样,Spark就算安装完成了。
之后,我们可以跑一个样例。
cd spark #进入spark的主目录
bin/run-example SparkPi 2>&1 | grep "Pi is"
这是一个计算Pi值的示例程序,我们可以看到相应的结果。
我们也可以调用Spark的scala-shell交互式界面。
bin/spark-shell
我们在4040端口,可以看到Spark的WebUI。
二、Window下IDEA配置Spark的执行环境
前面我们提到过,如果在Windows下配置Hadoop的运行环境,重点在于安装winutils,并配置 Hadoop_home 。忘记的人,可以点这里,有了这些之后,其实就可以直接编写Spark代码了。当然,如果你是在linux环境下,那么这一步其实也是可以省略的。
打开IDEA,新建一个Maven项目,名字就叫 Apache-Spark 。添加如下Maven依赖。
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.6</version>
</dependency>
</dependencies>
之后,我们main文件夹下创建一个新的文件夹,命名为Scala,再标记为Source Root。
之后,我们就可以在这个Scala文件夹下创建Scala项目了。需要注意的是,如果你的IDEA还没有配置Scala的编码支持,需要自行百度解决一下。
我们可以创建一个名为WordCount的scala文件。将下面的代码填进去。
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object WordCount {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[*]").setAppName("WordCount")
val sc = new SparkContext(conf)
val wordpair: RDD[String] = sc.textFile("D:\\代码\\java\\Apache-Spark\\data.txt") //换成你自己的路径
val results = wordpair.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
results.foreach(println)
}
}
代码执行没问题,就意味着配置成功了。
三、Windows下PyCharm配置Spark的执行环境
直接使用pip命令或者在Anconda中下pyspark。
pip install pyspark
之后就可以进行编程了。当然,前提是你已经配置好了Hadoop在Windows下的执行环境。
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster('local[*]').setAppName("WordCount")
sc = SparkContext(conf=conf)
wordpair = sc.textFile("D:\\代码\\python\\Apache-Spark\\data.txt") # 换成你的路径
results = wordpair.flatMap(lambda x : x.split(" ")).map(lambda x : (x,1)).reduceByKey(lambda x, y : x + y)
results.foreach(print)