专栏首页华章科技什么是Apache Spark?这篇文章带你从零基础学起

什么是Apache Spark?这篇文章带你从零基础学起

导读:Apache Spark是一个强大的开源处理引擎,最初由Matei Zaharia开发,是他在加州大学伯克利分校的博士论文的一部分。Spark的第一个版本于2012年发布。

Apache Spark是快速、易于使用的框架,允许你解决各种复杂的数据问题,无论是半结构化、结构化、流式,或机器学习、数据科学。它也已经成为大数据方面最大的开源社区之一,拥有来自250多个组织的超过1000个贡献者,以及遍布全球570多个地方的超过30万个Spark Meetup社区成员。

在本文中,我们将提供一个了解Apache Spark的切入点。我们将解释Spark Job和API背后的概念。

作者:托马兹·卓巴斯(Tomasz Drabas),丹尼·李(Denny Lee)

如需转载请联系大数据(ID:hzdashuju)

01 什么是Apache Spark

Apache Spark是一个开源的、强大的分布式查询和处理引擎。它提供MapReduce的灵活性和可扩展性,但速度明显更高:当数据存储在内存中时,它比Apache Hadoop快100倍,访问磁盘时高达10倍。

Apache Spark允许用户读取、转换、聚合数据,还可以轻松地训练和部署复杂的统计模型。Java、Scala、Python、R和SQL都可以访问 Spark API。

Apache Spark可用于构建应用程序,或将其打包成为要部署在集群上的库,或通过笔记本(notebook)(例如Jupyter、Spark-Notebook、Databricks notebooks和Apache Zeppelin)交互式执行快速的分析。

Apache Spark提供的很多库会让那些使用过Python的pandas或R语言的data.frame 或者data.tables的数据分析师、数据科学家或研究人员觉得熟悉。非常重要的一点是,虽然Spark DataFrame会让pandas或data.frame、data.tables用户感到熟悉,但是仍有一些差异,所以不要期望过高。具有更多SQL使用背景的用户也可以用该语言来塑造其数据。

此外,Apache Spark还提供了几个已经实现并调优过的算法、统计模型和框架:为机器学习提供的MLlib和ML,为图形处理提供的GraphX和GraphFrames,以及Spark Streaming(DStream和Structured)。Spark允许用户在同一个应用程序中随意地组合使用这些库。

Apache Spark可以方便地在本地笔记本电脑上运行,而且还可以轻松地在独立模式下通过YARN或Apache Mesos于本地集群或云中进行部署。它可以从不同的数据源读取和写入,包括(但不限于)HDFS、Apache Cassandra、Apache HBase和S3:

▲资料来源:Apache Spark is the smartphone of Big Data

http://bit.ly/1QsgaNj

02 Spark作业和API

在本节中,我们将简要介绍Apache Spark作业(job)和API

1. 执行过程

任何Spark应用程序都会分离主节点上的单个驱动进程(可以包含多个作业),然后将执行进程(包含多个任务)分配给多个工作节点,如下图所示:

驱动进程会确定任务进程的数量和组成,这些任务进程是根据为指定作业生成的图形分配给执行节点的。注意,任何工作节点都可以执行来自多个不同作业的多个任务。

Spark作业与一系列对象依赖相关联,这些依赖关系是以有向无环图(DAG)的方式组织的,例如从Spark UI生成的以下示例。基于这些,Spark可以优化调度(例如确定所需的任务和工作节点的数量)并执行这些任务。

▲有关DAG调度器的更多信息,请参考:

http://bit.ly/29WTiK8

2. 弹性分布式数据集

弹性分布式数据集(简称RDD)是不可变Java虚拟机(JVM)对象的分布式集合,Apache Spark就是围绕着RDD而构建的。我们使用Python时,尤为重要的是要注意Python数据是存储在这些JVM对象中的。

这些对象允许作业非常快速地执行计算。对RDD的计算依据缓存和存储在内存中的模式进行:与其他传统分布式框架(如Apache Hadoop)相比,该模式使得计算速度快了一个数量级。

同时,RDD会给出一些粗粒度的数据转换(例如map(...)、reduce(...)和filter(...)),保持Hadoop平台的灵活性和可扩展性,以执行各种各样的计算。RDD以并行方式应用和记录数据转换,从而提高了速度和容错能力。

通过注册这些转换,RDD提供数据沿袭——以图形形式给出的每个中间步骤的祖先树。这实际上保护RDD免于数据丢失——如果一个RDD的分区丢失,它仍然具有足够的信息来重新创建该分区,而不是简单地依赖复制。

更多数据沿袭信息参见:

http://ibm.co/2ao9B1t

RDD有两组并行操作:转换(返回指向新RDD的指针)和动作(在运行计算后向驱动程序返回值)。

请参阅Spark编程指南,获取最新的转换和动作列表:

http://spark.apache.org/docs/latest/programming-guide.html#rdd-operations

某种意义上来说,RDD转换操作是惰性的,因为它们不立即计算其结果。只有动作执行了并且需要将结果返回给驱动程序时,才会计算转换。该延迟执行会产生更多精细查询:针对性能进行优化的查询。

这种优化始于Apache Spark的DAGScheduler——面向阶段的调度器,使用如上面截图中所示的阶段进行转换。由于具有单独的RDD转换和动作,DAGScheduler可以在查询中执行优化,包括能够避免shuffle数据(最耗费资源的任务)。

有关DAGScheduler和优化(特别是窄或宽依赖关系)的更多信息,有一个很好的参考是《Effective Transformations》第5章:

https://smile.amazon.com/High-Performance-Spark-Practices-Optimizing/dp/1491943203

3. DataFrame

DataFrame像RDD一样,是分布在集群的节点中的不可变的数据集合。然而,与RDD不同的是,在DataFrame中,数据是以命名列的方式组织的。

如果你熟悉Python的pandas或者R的data.frames,这是一个类似的概念。

DataFrame旨在使大型数据集的处理更加容易。它们允许开发人员对数据结构进行形式化,允许更高级的抽象。在这个意义上来说,DataFrame与关系数据库中的表类似。DataFrame提供了一个特定领域的语言API来操作分布式数据,使Spark可以被更广泛的受众使用,而不只是专门的数据工程师。

DataFrame的一个主要优点是,Spark引擎一开始就构建了一个逻辑执行计划,而且执行生成的代码是基于成本优化程序确定的物理计划。与Java或者Scala相比,Python中的RDD是非常慢的,而DataFrame的引入则使性能在各种语言中都保持稳定。

4. Catalyst优化器

Spark SQL是Apache Spark最具技术性的组件之一,因为它支持SQL查询和DataFrame API。Spark SQL的核心是Catalyst优化器。优化器基于函数式编程结构,并且旨在实现两个目的:简化向Spark SQL添加新的优化技术和特性的条件,并允许外部开发人员扩展优化器(例如,添加数据源特定规则,支持新的数据类型等等):

详细信息,请查看Deep Dive into Spark SQL’s Catalyst Optimizer :

http://bit.ly/271I7Dk

和Apache Spark DataFrames:

Simple and Fast Analysis of Structured Data

http://bit.ly/29QbcOV

6. 钨丝计划

Tungsten(钨丝)是Apache Spark执行引擎项目的代号。该项目的重点是改进Spark算法,使它们更有效地使用内存和CPU,使现代硬件的性能发挥到极致。

该项目的工作重点包括:

  • 显式管理内存,以消除JVM对象模型和垃圾回收的开销。
  • 设计利用内存层次结构的算法和数据结构。
  • 在运行时生成代码,以便应用程序可以利用现代编译器并优化CPU。
  • 消除虚拟函数调度,以减少多个CPU调用。
  • 利用初级编程(例如,将即时数据加载到CPU寄存器),以加速内存访问并优化Spark的引擎,以有效地编译和执行简单循环。

更多详细信息,请参考Project Tungsten:

Bringing Apache Spark Closer to Bare Metal

https://databricks.com/blog/2015/04/28/project-tungstenbringing-spark-closer-to-bare-metal.html

Deep Dive into Project Tungsten: Bringing Spark Closer to Bare Metal [SSE 2015 Video and Slides

https://spark-summit.org/2015/events/deep-dive-into-project-tungsten-bringing-spark-closerto-bare-metal/

Apache Spark as a Compiler: Joining a Billion Rows per Second on a Laptop

https://databricks.com/blog/2016/05/23/apache-sparkas-a-compiler-joining-a-billion-rows-per-second-on-alaptop.html

本文摘编自《PySpark实战指南:利用Python和Spark构建数据密集型应用并规模化部署》,经出版方授权发布。

延伸阅读《PySpark实战指南》

本文分享自微信公众号 - 大数据(hzdashuju),作者:托马兹·卓巴斯

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 干货:Spark在360商业数据部的应用实践

    随着数据规模的持续增长,数据需求越来越多,原有的以MapReduce为代表的Hadoop平台越来越显示出其局限性。主要体现在以下两点:

    华章科技
  • Uber的大数据之道

    原文网址:http://mp.weixin.qq.com/s?__biz=MzA3NTM4NDE2Mw==&mid=2649545686&idx=1&sn=4a...

    华章科技
  • 2018生活消费趋势:越来越多95后开始泡枸杞

    1月24日,第一财经商业数据中心(CBNData)联合口碑发布了《2018生活消费趋势报告》,基于口碑、阿里、淘票票、饿了么等数据,全方位洞悉国民生活消费最新趋...

    华章科技
  • Spark快速大数据分析(图灵程序设计丛书)

    本书由 Spark 开发者及核心成员共同打造,讲解了网络大数据时代应运而生的、能高效迅捷地分析处理数据的工具——Spark,它带领读者快速掌握用 Spark 收...

    用户3157710
  • Apache Spark的承诺及所面临的挑战

    Spark并非完美无瑕,目前发展到了什么程度呢?我们来一起看看Spark的优劣之处吧。 可以读一读Panopoly带来的The Evolution of the...

    CSDN技术头条
  • 【数据分析丨主题周】Spark四大特征分析介绍

    Spark是一种基于内存的、分布式的、大数据处理框架,在 Hadoop 的强势之下,Spark凭借着快速、简洁易用、通用性以及支持多种运行模式四大特征,冲破固有...

    博文视点Broadview
  • 10本值得你读的Apache Spark书籍

    Apache Spark是Apache的开源大数据框架,具有与SQL,流,图处理和机器学习有关的内置模块。它于2010年开源,从一开始就对大数据和相关技术产生了...

    加米谷大数据
  • Spark源码阅读的正确打开方式

    Spark发展至今,应该说已经非常成熟了。是大数据计算领域不得不学习的框架。尤其是Spark在稳定性和社区发展的成熟度方面,吊打其他的大数据处理框架。

    用户1564362
  • 简单聊聊 Spark 的诞生史

    这篇文章是关于 Spark 的,说实话,我是很犹豫写这篇文章的,因为 Spark 在国内非常火,大牛不计其数并且相关的文章也数不胜数,要找准一个有趣的角度去畅抒...

    哒呵呵
  • Spark源码阅读的正确打开方式

    Spark发展至今,应该说已经非常成熟了。是大数据计算领域不得不学习的框架。尤其是Spark在稳定性和社区发展的成熟度方面,吊打其他的大数据处理框架。

    王知无

扫码关注云+社区

领取腾讯云代金券