一文读懂Apache Spark

摘要:Apache Spark快速、灵活、开发友好,是大型SQL、批处理、流处理和机器学习的主要平台。

从2009年在加州大学伯克利分校(u.c Berkeley)的AMPLab微小的开端,Apache Spark已经成为世界上主要的大型数据分布式处理框架之一。Spark支持以多种方式部署,支持Java、Scala、Python和R等编程语言,并支持SQL、流媒体数据、机器学习和图形处理。被银行、电信公司、游戏公司、政府,以及苹果、Facebook、IBM和微软等主要科技巨头所使用。

Spark支持在一个独立的集群中运行,只需在集群中的每台机器上使用Apache Spark框架和JVM。然而,你可能更希望利用资源或集群管理系统来负责分配任务。在企业中,这通常意味着在Hadoop YARN 上运行(这是Cloudera和Hortonworks发行版运行Spark作业的方式),但是Apache Spark也可以运行在Apache Mesos上,也在不断增加对Kubernetes的支持。

如果你使用托管解决方案,那么Apache Spark可以在Amazon EMR、谷歌Cloud Dataproc和Microsoft Azure HDInsight上使用。拥有Apache Spark创始人的Databricks公司还提供了Databricks Unified 分析平台,该平台是提供综合管理服务,提供Apache Spark集群、流支持、集成基于web的开发,以及在标准Apache Spark发行版中优化的云上的I/O性能。

Apache Spark vs Apache Hadoop

值得指出的是,Apache Spark vs Apache Hadoop有点用词不当。你将在最新的Hadoop发行版中找到Spark。但是由于各有优势,Spark在处理大数据时已经成为了优先选择的框架,超越了Hadoop之上旧的MapReduce。

第一个优点是速度,Spark的内存数据引擎意味着在某些情况下,它可以比MapReduce执行任务的速度快100倍,特别是回写磁盘的多级任务时。即使是使用Apache Spark,数据不能完全包含在内存中,也比MapReduce版本快10倍。

第二个优点是开发友好的Spark API,与Spark的性能一样,Spark API的友好性也很重要。

Spark核心

与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允许应用开发人员向数据科学家提供数据,以使他们能够以可访问的方式利用其可伸缩性和速度。

Spark RDD

Apache Spark的核心是弹性分布式数据集Resilient Distributed Dataset(RDD)的概念,它是一种编程抽象,它表示可以跨计算集群拆分的不可变集合。在RDD上的操作也可以跨集群进行拆分,并在并行批处理过程中执行,从而导致快速和可伸缩的并行处理。

RDD可以从简单的文本文件、SQL数据库、NoSQL存储库(如Cassandra和MongoDB)、Amazon S3 bucket以及更多的东西创建。Spark Core API的大部分建立在这个RDD概念上,支持传统的映射和减少功能,但也为连接数据集、过滤、采样和聚合提供了内置的支持。

Spark以一种分布式方式运行,它将一个驱动程序核心流程组合在一起,将一个Spark应用程序分割成任务,并将其分发给执行该工作的许多执行程序。这些执行器可以按应用程序的需要按比例放大或缩小。

Spark SQL

Spark SQL最初被称为“鲨鱼”,对Apache Spark项目变得越来越重要。在创建应用程序时,它很可能是当今开发人员最常用的接口。Spark SQL专注于结构化数据的处理,使用从R和Python(Pandas)借来的dataframe方法。但正如其名所示,Spark SQL还提供了一个SQL2003兼容的接口来查询数据,将Apache Spark的强大功能带给了分析师和开发人员。

除了标准SQL支持之外,Spark SQL还提供了一个标准接口,用于读写其他数据存储,包括JSON、HDFS、Apache Hive、JDBC、Apache ORC和Apache Parquet。其他流行的存储,Apache Cassandra、MongoDB、Apache HBase等等,可以通过从Spark软件包生态系统中分离出独立的连接器来使用。

从dataframe中选择一些列只需一行代码:

citiesDF.select(“name”, “pop”)

使用SQL接口,将dataframe注册为临时表,之后可以发出SQL查询:

citiesDF.createOrReplaceTempView(“cities”)

spark.sql(“SELECT name, pop FROM cities”)

在后台,Apache Spark使用一个名为Catalyst的查询优化器来检查数据和查询,以便为数据局部性和计算提供高效的查询计划,并在整个集群中执行所需的计算。在Apache Spark 2.x中,dataframes和datasets的Spark SQL接口(本质上是一个类型化的dataframe,可以在编译时检查其正确性,并利用运行时的进一步内存和计算优化),是开发的推荐方法。RDD接口仍然是可用的,但是只有在需要在Spark SQL范式中封装的需要时才推荐使用。

Spark MLlib

Apache Spark还附带了一些库,用于将机器学习和图形分析技术应用于规模数据。Spark MLlib包括一个创建机器学习管道的框架,允许在任何结构化数据集上轻松实现特性提取、选择和转换。MLLib采用分布式实现的集群和分类算法,如k-means集群和随机森林,可以轻松地在自定义管道中交换。模型可以由Apache Spark的数据科学家使用R或Python进行训练,使用MLLib保存,然后导入基于java的或基于scala的管道用于生产。

注意,虽然Spark MLlib涵盖了基本的机器学习,包括分类、回归、集群和过滤,但它不包括建模和训练深度神经网络的设施。

Spark GraphX

Spark GraphX附带了一种分布式算法,用于处理图形结构,包括实现谷歌的PageRank。这些算法使用Spark Core的RDD方法建模数据,graphframe包允许在dataframes上做图形操作,包括利用Catalyst优化器进行图形查询。

Spark流处理

Apache Spark很早就支持流处理,在需要实时或接近实时处理的环境中很有吸引力。以前,Apache Hadoop领域的批处理和流处理是分开的。你可以为你的批处理需求编写MapReduce代码,并为实时流需求使用类似Apache Storm的东西。这显然导致了不同的代码,它们需要在应用程序领域保持同步,尽管它们基于完全不同的框架,需要不同的资源,并涉及运行它们的不同操作关注点。

Spark流将批处理的Apache Spark概念扩展到流中,通过将流分解成连续的一系列微批量,然后可以使用Apache Spark API进行操作。通过这种方式,批处理和流操作中的代码可以共享(大部分)相同的代码,在相同的框架上运行,从而减少了开发人员和操作人员的开销,每个人都赢了。

对Spark流处理方法的一个批评是,在需要对传入数据进行低延迟响应的情况下,microbatching可能无法与Apache Storm,Apache Flink和Apache Apex等其他支持流的框架的性能相匹配, 所有这些都使用纯粹的流媒体方法而不是microbatching。

结构化流

结构化流Structured Streaming(在Spark 2.x中添加)将会改进Spark SQL对Spark Core API的优化:更高级别的API和更容易编写应用程序的抽象。在结构流的情况下,高级API本质上允许开发人员创建无限流媒体数据和数据集。它还解决了用户在早期框架中遇到的一些非常实际的问题,特别是在处理事件时间聚合和延迟消息传递方面。结构化流的所有查询都经过了Catalyst查询优化器,甚至可以以交互的方式运行,允许用户对实时流数据执行SQL查询。

结构化流仍然是Apache Spark的一个相当新的部分,在Spark 2.2版本中已经被标记为生产就绪。然而,结构化流是面向平台的流媒体应用程序的未来,因此,如果你正在构建一个新的流媒体应用程序,你应该使用结构化的流媒体。历史版本Spark流媒体api将继续得到支持,但项目建议将其移植到结构化的流媒体上,因为新方法使得编写和维护流代码更容易忍受。

Apache Spark的下一步如何发展?

虽然结构化流处理为Spark提供了高层次的改进,但目前依赖于处理流数据的相同的微批处理方案。然而,Apache Spark团队正在致力于加入持续的流媒体技术,这将解决许多处理低延迟响应的问题(他们声称需要1ms,这将令人印象深刻)。更妙的是,因为结构化流是在Spark SQL引擎之上构建的,因此利用这种新的流媒体技术将不需要任何代码更改。

除了提高流处理性能,Apache Spark还将通过深度学习管道增加对深度学习的支持。使用MLlib现有的管道结构,将能够在几行代码中构建分类器,并将自定义的Tensorflow图形或Keras模型应用到导入数据。这些图和模型甚至可以注册为定制的Spark SQL udf(用户定义的函数),这样深度学习模型就可以作为SQL语句的一部分应用于数据。

这两项功能目前都不具备生产能力,但考虑到过去在Apache Spark上看到的快速发展,他们应该在2018年做好准备。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171208G0UEVS00?refer=cp_1026

扫码关注云+社区