前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文读懂Apache Spark

一文读懂Apache Spark

作者头像
企鹅号小编
发布2017-12-28 16:30:08
1.6K0
发布2017-12-28 16:30:08
举报
文章被收录于专栏:编程编程

摘要: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年做好准备。

本文来自企鹅号 - 云技术实践媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 云技术实践媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档