文章来自逗点云:https://www.doudianyun.com
1. 目的
首先介绍Spark 编程,了解Spark历史,然后我们将了解为什么需要Spark,涵盖Spark组件的所有基础知识,了解Spark的核心抽象和Spark RDD,最后介绍Spark特性,Spark限制和Spark用例。
2. Spark编程简介
什么是Spark? Spark是一个通用和快速集群计算平台。换句话说,它是一个开源的数据处理引擎。它提供了API,这使数据工作者可以完成流,机器学习或SQL。 而且,它集成了所有大数据工具。例如Spark可以访问任何Hadoop数据源,也可以在Hadoop集群上运行。此外,Spark将Hadoop MapReduce扩展到更高级别,包括迭代查询和流处理。 关于Spark的另一个常见看法是它是Hadoop的扩展。这是不正确的,Spark独立于Hadoop,因为它拥有自己的集群管理系统,它仅将Hadoop用于存储目的。 尽管Spark是用Scala编写的,但仍然用Scala,Java,Python和R语言提供了丰富的API。 最重要的是,比较Spark和Hadoop,它比Hadoop快10到100倍。内存计算下,Spark 比 Hadoop 大约快100倍,在磁盘计算下,大约快10倍。
3. Spark历史
起初,Spark于2009年在加州大学伯克利分校研发实验室推出,现在称为AMPLab。之后,在2010年,它成为BSD许可下的开源软件。Spark于2013年捐赠给Apache软件基金会,然后在2014年,它成为顶级Apache项目。
4. 为什么用Spark
正如我们所知道的那样,在工业界没有一个引擎可以实时和批量处理数据,还要求这个引擎可以在亚秒内响应并执行内存中的处理。
4.1 要执行批处理,我们使用Hadoop MapReduce。
4.2 为了执行流处理,我们使用了Apache Storm / S4。
4.3 对于交互式处理,我们使用Apache Impala / Apache Tez。
4.4 为了执行图形处理,我们使用了Neo4j / Apache Graph。
因此,Spark诞生了,它是一个强大的开源引擎。它提供了交互式处理,实时流处理,图形处理,内存处理以及批处理。这些功能是Hadoop不具备的。
5. Spark组件
Spark组件提供了更快的数据处理以及更简单的开发,现在让我们逐一讨论每个Spark组件。
5.1 Spark Core
Spark Core是Spark的核心。它为所有的Spark应用程序提供了一个通用的执行平台。
5.2 Spark SQL
Spark SQL使用户能够运行SQL / HQL查询。我们可以使用Spark SQL处理结构化以及半结构化数据。此外,它还可以在现有部署中将查询运行速度提高10到100倍。
5.3 Spark Streaming
Spark Streaming具有高吞吐量,强容错能力的实时流处理系统,支持包括Kafka,Flume,HDFS/S3,Twitter,TCP Sockets等数据源。获取数据后可以使用map,reduce,join等函数进行处理,处理结果存储到文件系统,数据库或者在仪表盘上展示。
5.4 Spark MLlib
机器学习库提供了高质量的算法和开发效率,让机器学习更加容易,它是数据科学家最热门的选择,由于它能够进行内存数据处理,因此可以大大提高迭代算法的性能。
5.5 Spark GraphX
Spark GraphX是构建在Spark之上的图形计算引擎,可以处理大规模的图形数据。
5.6 SparkR
R是遵循GNU协议的一款开源、免费的软件,广泛应用于统计计算和统计制图,但是它只能单机运行,分析小型数据集。SparkR允许数据科学家分析大型数据集,并通过R shell交互式地在SparkR上运行作业。
6. 弹性分布式数据集 – RDD
Spark的关键抽象是RDD,RDD是弹性分布式数据集(Resilient Distributed Dataset)的首字母缩略词。它是Spark中数据的基本单位,是跨集群节点的分布式集合,执行并行操作。Spark RDD本质上是不可改变的,它可以通过转换现有的RDD来生成新的RDD
6.1 如何创建Spark RDD
有3种方法来创建Spark RDD
6.1.1 并行集合
通过调用并行化方法,我们可以创建并行化的集合。
6.1.2 外部数据集
可以通过调用textFile等方法来创建Spark RDD。因此,这种方法会获取文件的URL并将其作为行的集合读取。
6.1.3 现有的RDD
我们可以通过对现有的RDD进行转换操作来创建新的RDD。
6.2 Spark RDD的操作
Spark RDD支持两种类型的操作:
6.2.1 转换操作 – Transformation
它从现有的RDD创建一个新的RDD。
6.2.2 行动操作 – Action
触发Spark提交作业并将最终结果返回给驱动程序或将其写入外部存储。
6.3 Spark RDD的特点
RDD有很多特点,例如:
6.3.1 内存计算
通过将数据保存在内存中,可以将性能提高一个数量级。
6.3.2 延迟计算
RDD内部的数据不会立即计算,只有在某个动作触发所有更改或执行计算之后才开始计算。
6.3.3 容错
如果任何工作节点出现故障,通过使用血统(lineage),我们可以重新计算RDD的丢失分区。 因此,可以轻松地恢复丢失的数据。
6.3.4 不变性
不变性意味着一旦我们创建了一个RDD,我们就无法改变它。我们可以通过执行转换来创建新的RDD。 此外,我们通过不变性实现一致性。
6.3.5 存储
我们可以在内存中存储经常使用的RDD,然后可以直接从内存中检索它们,而不必通过磁盘,从内存中检索数据非常快,我们也可以对相同的数据执行多个操作。 只有通过调用persist或cache函数才能将数据显式存储在内存中。
6.3.6 分区
RDD由逻辑分区组成,运行时分发分区到集群中的各个节点,这些分区并行执行。
6.3.7 并行
并行 RDD在集群上并行处理数据。
6.3.8 位置相关性
为了计算分区,RDD可以定义位置信息,DAGScheduler将分区放置在尽可能接近数据的位置进行计算,这样可以减少网络传输数据。
6.3.9 粗粒度操作
通常,我们将转换应用于RDD。这意味着该操作适用于整个数据集,而不适用于RDD数据集中的单个元素。
6.3.10 类型化
RDD有类型,如:RDD [int],RDD [long],RDD [string]。
6.3.11 RDD数量没有限制
使用RDD的数量没有限制,我们可以使用任何数量的RDD。基本上,限制取决于磁盘和内存的大小。
7. Spark的特点
7.1 处理速度快
Spark提供高处理速度。内存计算下,Spark 比 Hadoop 大约快100倍,在磁盘计算下,大约快10倍。
7.2 易用性
Spark 提供了80多个高级运算符。
7.3 通用性
Spark 提供了大量的库,包括SQL、Streaming、MLlib、GraphX。开发者可以在同一个应用程序中无缝组合使用这些库。
7.4 支持多种资源管理器
Spark 支持 Hadoop YARN,Apache Mesos,及其自带的独立集群管理器。
8. Spark局限性
8.1 不支持实时处理
基本上,Spark接近实时处理实时数据。换句话说,微量批处理是在Spark Streaming中进行的,因此我们不能说Spark是完全实时处理引擎。
8.2 小文件问题
在RDD中,每个文件都是一个分区,如果小文件特别多,这意味着,RDD中有大量的微小分区。因此,如果我们希望在处理过程中提高效率,RDD应该被重新分区,这要求在网络上进行大规模的数据移动(shuffle)。
8.3 没有文件管理系统
Spark没有自己的文件管理系统,它依赖于其他平台,如Hadoop或其他基于云的平台。
8.4 昂贵
由于内存通常比磁盘空间更贵,因此相比基于磁盘的系统,Spark成本更高。然而处理速度的提升意味着可以更快速完成任务,在需要按照小时数为资源付费的环境中,这一特性通常可以抵消增加的成本。
8.5 算法的数量较少
Spark MLlib的可用算法数量比较少。
8.6 手动优化
Spark针对适合特定的数据集必须手动优化。
8.7 延迟
与Flink相比,Spark具有更高的延迟。
9. Spark使用案例
9.1 金融行业
有许多银行正在使用Spark,它有助于访问和分析银行部门的大规模记录,例如电子邮件,社交媒体档案,通话录音,论坛等等,它有助于为多个领域做出正确的决定。
9.2 电子商务行业
Spark有助于获得有关实时交易的信息,这些信息被传递给流聚类算法。
9.3 媒体和娱乐行业
Spark从实时游戏事件中识别模式,有助于获取丰厚的商业机会。
9.4 旅游行业
Spark可以通过加快个性化建议帮助用户规划完美的旅程。
10. 结论
了解了Apache Spark的各个方面,什么是Spark编程和Spark定义,Spark的历史,为什么需要Spark,Spark RDD的特性,Spark的组件,Spark的功能,Spark的限制,Spark用例。