大数据技术:Apache Spark学习研究
1 引言
Apache Spark是一个快速的大数据和机器学习统一分析引擎。
Apache Spark是一个开源的分布式通用集群计算框架。
Spark为整个集群的编程提供了一个隐式数据并行和容错的接口。
Spark代码库最初是在加州大学伯克利分校的AMP实验室开发的,后来被捐赠给了Apache软件基金会,并由该基金会维护至今。
2 Apache Spark架构
在基本层面上,一个Apache Spark应用由两个主要组件组成:一个是驱动程序,它将用户的代码转换为多个任务,这些任务可以分布在工人节点上。另一个是执行器,它在这些节点上运行并执行分配给它们的任务。某种形式的集群管理器是必要的,以调解两者之间的关系。
开箱即用,Spark可以在独立的集群模式下运行,只需要在你的集群中的每台机器上安装Apache Spark框架和一个JVM。然而,更有可能的是,你会希望利用一个更强大的资源或集群管理系统来为你按需分配工作资源。在企业中,这通常意味着在Hadoop YARN上运行(Cloudera和Hortonworks发行版就是这样运行Spark作业的),但Apache Spark也可以在Apache Mesos、Kubernetes和Docker Swarm上运行。
如果你寻求一个管理解决方案,那么Apache Spark可以作为Amazon EMR、Google Cloud Dataproc和Microsoft Azure HDInsight的一部分。聘请Apache Spark创始人的Databricks公司也提供了Databricks统一分析平台,这是一个全面的管理服务,在标准的Apache Spark发行版上提供Apache Spark集群、流媒体支持、集成的基于Web的笔记本开发和优化的云I/O性能。
Apache Spark将用户的数据处理命令构建成一个定向无环图,或称DAG。DAG是Apache Spark的调度层。它决定在什么节点上以什么顺序执行什么任务。
2.1 Apache Spark 生态系统
2.1.1 什么选择Apache Spark?
2.1.1.1 速度
Spark从下而上的性能设计,通过利用内存计算和其他优化,在大规模数据处理方面,Spark可以比Hadoop快100倍。当数据存储在磁盘上时,Spark的速度也很快,目前保持着大规模磁盘上排序的世界纪录。
2.1.1.2 易用性
Spark拥有易于使用的API,用于对大型数据集进行操作。这包括100多个用于转换数据的操作符和熟悉的用于操作半结构化数据的数据框架API的集合。
2.1.1.3 统一的引擎
Spark打包了更高级别的库,包括对SQL查询、流数据、机器学习和图形处理的支持。这些标准库提高了开发人员的工作效率,并且可以无缝组合以创建复杂的工作流程。
2.2 Spark Core
与MapReduce和其他Apache Hadoop组件相比,Apache Spark API对开发者非常友好,将分布式处理引擎的大部分复杂性隐藏在简单的方法调用背后。这方面的典范例子是,近50行MapReduce代码如何被简化为只有几行的Apache Spark(这里用Scala):
val textFile = sparkSession.sparkContext.textFile(“hdfs:///tmp/words”)
val counts = textFile.flatMap(line => line.split(“ “))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile(“hdfs:///tmp/words_agg”)
通过提供与Python和R等流行的数据分析语言的绑定,以及对企业更友好的Java和Scala,Apache Spark让每个人,从应用开发者到数据科学家,都能以一种可访问的方式利用其可扩展性和速度。
2.3 Spark RDD
Apache Spark的核心是弹性分布式数据集(RDD)的概念,这是一个编程抽象,它代表了一个不可改变的对象集合,可以在计算集群中分割。对RDDs的操作也可以跨集群分割,并以并行批处理的方式执行,从而实现快速、可扩展的并行处理。
RDDs可以从简单的文本文件、SQL数据库、NoSQL存储(如Cassandra和MongoDB)、Amazon S3桶等创建,除此之外还有更多。Spark核心API的大部分内容都是建立在这个RDD概念上的,不仅实现了传统的map和reduce功能,还提供了对加入数据集、过滤、采样和聚合的内置支持。
Spark以分布式的方式运行,通过结合一个驱动核心进程,将Spark应用分割成任务,并将它们分配到许多执行者进程中进行处理。这些执行器可以根据应用的需要进行扩展和缩减。
2.4 Spark SQL
Spark SQL最初被称为Shark,它对于Apache Spark项目来说已经变得越来越重要。它很可能是今天的开发者在创建应用程序时最常用的接口。Spark SQL专注于结构化数据的处理,使用从R和Python(在Pandas中)借鉴的数据框架方法。但正如其名,Spark SQL还提供了一个符合SQL2003标准的数据查询接口,为分析师以及开发人员带来了Apache Spark的强大功能。
除了标准的SQL支持,Spark SQL还提供了一个标准的接口来读取和写入其他数据存储,包括JSON、HDFS、Apache Hive、JDBC、Apache ORC和Apache Parquet,所有这些都是开箱即用的支持。其他流行的存储--Apache Cassandra、MongoDB、Apache HBase和许多其他存储--可以通过从Spark Packages生态系统中拉入单独的连接器来使用。
从一个数据框架中选择一些列就像这一行一样简单:
citiesDF.select(“name”, “pop”)
使用SQL接口,我们将数据框注册为一个临时表,之后我们就可以对它发出SQL查询:
citiesDF.createOrReplaceTempView(“cities”)
spark.sql(“SELECT name, pop FROM cities”)
在幕后,Apache Spark使用了一个名为Catalyst的查询优化器,它可以检查数据和查询,以产生一个高效的数据定位和计算的查询计划,在整个集群中执行所需的计算。在Apache Spark 2.x时代,数据框和数据集的Spark SQL接口(本质上是一个类型化的数据框,可以在编译时检查其正确性,并在运行时利用进一步的内存和计算优化)是推荐的开发方法。RDD接口仍然可用,但只有在你的需求无法在Spark SQL范式中解决时才推荐使用。
Spark 2.4引入了一组内置的高阶函数,用于直接操作数组和其他高阶数据类型。
2.5 Spark MLlib
Apache Spark还捆绑了用于将机器学习和图形分析技术大规模应用于数据的程序库。Spark MLlib包括一个用于创建机器学习管道的框架,可以在任何结构化数据集上轻松实现特征提取、选择和转换。MLlib带有聚类和分类算法的分布式实现,如k-means聚类和随机森林,可以轻松地在自定义管道中交换。数据科学家可以使用R或Python在Apache Spark中训练模型,使用MLlib保存,然后导入到基于Java或基于Scala的流水线中进行生产使用。
请注意,虽然Spark MLlib涵盖了基本的机器学习,包括分类、回归、聚类和过滤,但它并不包括用于建模和训练深度神经网络的机制设施。不过,深度学习管道正在开发中。
2.6 Spark GraphX
Spark GraphX附带了一系列处理图结构的分布式算法,包括Google的PageRank的实现。这些算法使用Spark Core的RDD方法对数据进行建模。GraphFrames包允许你对数据框进行图操作,包括利用Catalyst优化器进行图查询。
2.7 Spark Streaming
Spark Streaming是Apache Spark的早期新增功能,它帮助Apache Spark在需要实时或接近实时处理的环境中获得了吸引力。以前,在Apache Hadoop的世界里,批处理和流处理是分开的。你将为你的批处理需求编写MapReduce代码,并使用类似Apache Storm这样的东西来满足你的实时流处理需求。这显然会导致不同的代码库,尽管它们基于完全不同的框架,需要不同的资源,并涉及到运行它们的不同操作关注点,但需要为应用领域保持同步。
Spark Streaming将Apache Spark的批处理概念扩展为流处理,将流分解为一系列连续的微批处理,然后可以使用Apache Spark API进行操作。这样一来,批处理和流操作中的代码可以共享(大部分)相同的代码,在同一个框架上运行,从而减少开发者和操作者的开销。大家都是赢家。
对Spark Streaming方法的批评是,在需要对传入数据进行低延迟响应的场景中,微批处理可能无法与其他支持流媒体的框架(如Apache Storm、Apache Flink和Apache Apex)的性能相媲美,这些框架都使用纯流媒体方法而不是微批处理。
2.8 结构化流
Structured Streaming(在Spark 2.x中添加)对于Spark Streaming来说,就像Spark SQL对于Spark Core APIs一样。一个更高级别的API和更容易编写应用的抽象。在结构化流的情况下,更高级别的API本质上允许开发者创建无限的流式数据框和数据集。它还解决了用户在早期框架中苦恼的一些非常现实的痛点,特别是关于处理事件时间聚合和消息延迟传递的问题。所有对结构化流的查询都要经过Catalyst查询优化器,甚至可以以交互方式运行,让用户对实时流数据进行SQL查询。
结构化流最初是依靠Spark Streaming的微批处理流数据的方案。但在Spark 2.3中,Apache Spark团队为Structured Streaming增加了低延迟的连续处理模式,使其可以处理延迟低至1ms的响应,这是非常了不起的。截至Spark 2.4,连续处理仍然被认为是实验性的。结构化流处理是建立在Spark SQL引擎之上的,而持续流处理只支持一组受限的查询。
结构化流是未来的流应用与平台,所以如果你正在构建一个新的流应用,你应该使用结构化流。传统的Spark Streaming API将继续得到支持,但项目建议移植到Structured Streaming上,因为新的方法让编写和维护流媒体代码变得更加容易。
2.9 深度学习管道
Apache Spark 通过深度学习管道支持深度学习。利用 MLlib 现有的管道结构,你可以调用到低级的深度学习库,只需几行代码就可以构建分类器,还可以将自定义的 TensorFlow 图或 Keras 模型应用到传入的数据中。这些图形和模型甚至可以注册为自定义的Spark SQL UDF(用户定义函数),这样深度学习模型就可以作为SQL语句的一部分应用到数据中。
3 参考
https://en.wikipedia.org/wiki/Apache_Spark
https://en.wikipedia.org/wiki/List_of_concurrent_and_parallel_programming_languages#APIs/frameworks
https://en.wikipedia.org/wiki/Apache_Hadoop
- 点赞
- 收藏
- 关注作者
评论(0)