首发于BitTiger.io
深入浅出Spark(1)什么是Spark

深入浅出Spark(1)什么是Spark

今天开始我们将一起学习Sameer Farooqui在Spark summit 2015上分享的内容。本文是“深入浅出Spark”系列文章的第一篇,通过本篇文章我们将了解:

1. Spark是什么

2. Spark生态圈

3. Spark的优点

致谢

首先,简单介绍一下分享者Sameer Farooqui。

Sameer是就职于Databricks的客户服务工程师,专注于Spark相关的技术支持、咨询和培训。在加入Databricks之前,他以大数据培训师和咨询师的自由职业者身份,在全球范围内进行了超过120多次以大数据为主题的教学,内容包括Hadoop,HDFS,MapReduce,Hive,Pig,HBase等等。在成为自由职业者之前,Sameer曾在Hortonworks,Accenture R&D和Symantec工作过。

1.什么是Spark

介绍完Sameer的技术背景之后,我们回到Spark上,看看什么人在学习Spark。

可以看到其中绝大多数是开发者,其次是数据科学家。开发者很多容易理解,但为什么还有不少数据科学家学习呢?因为Spark对数据分析非常有帮助,它提供的机器学习库MLib不仅包括一些基础的统计算法,还有分类(Classification)、回归(Regression)、聚类(Clustering)等等分析工具,能够将大数据分析和处理的问题简单化。

另外我们再来看看跟Spark相关的各种大数据平台的火爆程度。

从上面可以看到,HDFS名列前茅。因为存储大数据,最稳定最可靠的就是HDFS。而且Hadoop相关的很多技术,像MapReduce,HDFS,YARN等等,支持它们的底层文件系统就是HDFS。同时我们可以看到MapReduce,YARN,Kafka,HBase,Cassandra,Hive,Pig,ZooKeeper,MongoDB, Oozie等这些技术也很热门。

其实我们上面提到的各种技术框架,可以划分为两个领域的战争,一个是偏向底层存储的战争,一个是偏向计算的战争。

偏向存储的战争有关系型数据库和非关系型数据库(Relational vs NoSQL)的战争,它们两者都有各自的应用特点。关系型数据库最大的特点是事务的一致性,读写操作都是事务的,具有ACID的特点,它在银行这样对一致性有要求的系统中应用广泛。而非关系型数据库一般对一致性要求不高,但支持高性能并发读写,海量数据访问,在微博、Facebook这类SNS应用中广泛使用。另外,非关系型数据库内部也有战争,比如说HBase和Cassandra,前者注重一致性(Consistency)和可用性(Availability),后者提供可用性(Availability)和分区容错性(Partition tolerance)。Redis和Memcached,它们都是内存内的Key/Value存储,但Redis还支持哈希表,有序集和链表等多种数据结构。MongoDB,CouchDB和Couchbase这三个文档型数据库,MongoDB更适用于需要动态查询的场景,CouchDB偏向于预定义查询,Couchbase比CouchDB有更强的一致性,而且还可以作为Key/Value存储。搜索引擎Solr和Elasticsearch的,它们都是基于Lucene,性能上相近,但是前者在Java/C#开发者中大受欢迎,而后者深受Python/PHP开发者喜爱。

偏向计算的战争有MapReduce和Spark之间的战争,它们之间的特点在下文有更详细介绍。此外还有Spark Streaming和Storm之间的战争等等。

这些战争的赢家是谁呢?它们是Redis,MongoDB,Cassandra,Neo4j和Solr。

简单介绍Spark相关技术后,我们回到Spark上。它是怎么来的呢?这一切都从谷歌的三篇论文(Google File SystemMap ReduceBigtable)开始。这三篇论文发布后,很多人开始进行学习,并在此基础上开发出各种Hadoop计算平台,进行通用批处理计算(General Batch Processing)。之后,人们针对各种不同的计算模型开发了各种专门系统(Specialized Systems),比如说迭代式的,机器学习的,流处理的,图像的和SQL相关的系统。最后就是Spark,它作为一种通用的统一的计算引擎(General Unified Engine),希望能够一统江湖。


2.Spark生态圈

为了理解Spark,我们来看看Spark生态圈。

从内往外看,生态圈核心是Spark Core,包括各种Spark的各种核心组件,它们能够对内存和硬盘进行操作,或者调用CPU进行计算。

紧邻核心圈的是与Spark相关的各类接口,比如Java,Python和R等。

这些接口的外部是针对不同类型数据的计算引擎。比如说针对关系型数据进行处理的Spark SQL,针对对流数据进行打包批量处理的Spark Steam,针对Machine Learning相关的库MLib,针对图的GraphX,以及针对大规模数据进行采样和计算从而缩短计算时间的BlinkDB。

再往外就是Spark运行的各种场景。比如说单机运行,在Yarn上进行管理运行等等。

最外层就涉及基础数据存储。我们可以用文档型数据库,关系型数据库,图数据库等等。所有这些数据存储系统Spark都能访问,这归功于Techyon。它对底层不同的数据存储系统进行封装,提供统一的API进行访问。它还可以看作是是对底层数据的缓存,更多关于Techyon的内容可以参照深入浅出Techyon。

我们再来看看Spark生态圈的各个部分跟传统Hadoop系统的对应关系。


由上图可见,Hadoop MapReduce对应Spark核心,Yarn对应Mesos,HDFS对应Tachyon等等。

3.Spark的优点

Spark最重要优点就是快。为什么Spark比较快呢?我们来看看下图。


传统Hadoop计算过程中,MapReduce任务需要跑很多次,需要多次迭代,每次迭代计算的结果都需要存下来,存到HDFS,而HDFS本身就是一些硬盘,所以本质上就是把每次计算的结果存到硬盘上。而且存到硬盘上还需要考虑备份,一般是三次备份。于是计算总时间中一大部分将花到硬盘存储上。之前我们提到程序运行时间,知道它包括四个因素:计算时间,数据传输时间,任务调度时间,和并行度。在传统MapReduce计算当中,存储占用了大部分时间。而Spark不同,它是将中间计算的结果放在内存当中,然后在内存中进行迭代计算,速度自然更快。另外,Spark还存下了计算结果从何而来,即Lineage。如果内存数据丢失,通过Lineage再找父母要,再计算一遍。虽然重复计算丢失的数据将花费较多时间,但是数据丢失的概率很低,所有Spark整体计算的速度将提升10到100倍。

我们再来看看Spark之所以快的一些数字。


由上图可见,CPU直接访问内存,速度将达到10GB/s。而访问本地硬盘,速度降为100MB/s,跟访问内存的速度相差100倍。如果访问SSD硬盘,速度可以达到600MB/s,但是SSD的价格很高。如果是同机架网络访问,速度差不多是125MB/s,比访问本地硬盘还要稍快一些。而如果是跨机架网络访问,速度仅为12.5MB/s。

如果你想了解更多关于Spark的内容,可以阅读相关论文和书籍。比如说《Spark: Cluster Computing with Working Sets》,《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》,《Learning Spark》和《Advanced Analytics with Spark》。

总结

Spark是一个支持任务调度,监控及分布式部署的通用计算引擎,它通过内存内运算技术和计算关系的血统来提升运算速度。

下期预告

1. RDD是什么?

2. Spark是如何执行任务的?

3. Spark的运行环境是怎样的?

参考资料

1. spark-summit.org/2015/s

2. bittiger.io/videos/vhPm

本文作者:Lion,更多精彩内容,欢迎访问官网 BitTiger.io 或关注 “论码农的自我修养” 微信公众号:bit_tiger


weixin.qq.com/r/v0MnP17 (二维码自动识别)



发布于 2016-07-14 09:00