Apache Spark是一个功能强大的开源处理引擎,最初由Matei Zaharia开发,是加州大学伯克利分校博士论文的一部分。 Spark的第一个版本于2012年发布。从那时起,2013年,Zaharia共同创立并成为Databricks的首席技术官;他还在麻省理工学院担任斯坦福大学教授。与此同时,Spark代码库被捐赠给了Apache Software Foundation,并成为其旗舰项目。
Apache Spark快速,易用,允许您解决各种复杂的数据问题,无论是半结构化,结构化,流媒体和/或机器学习/数据科学。它还已成为大数据领域最大的开源社区之一,拥有来自250多个组织的1,000多名贡献者,以及遍布全球570多个地点的300,000多名Spark Meetup社区成员。
在本章中,我们将为理解Apache Spark提供入门知识。我们将解释Spark Jobs和API背后的概念,介绍Spark 2.0架构,并探索Spark 2.0的功能。
- 什么是Apache Spark?
- Spark作业和API
- 回顾弹性分布式数据集(RDD),数据框架和数据集
- 审查Catalyst Optimizer和Project Tungsten
- 回顾Spark 2.0架构
什么是Apache Spark?
Apache Spark是一个开源强大的分布式查询和处理引擎。它提供了MapReduce的灵活性和可扩展性,但速度要快得多:当数据存储在内存中时,比Apache Hadoop快100倍,访问磁盘时最多可达10倍。
Apache Spark允许用户轻松读取,转换和聚合数据,以及训练和部署复杂的统计模型。 Spark API可以用Java,Scala,Python,R和SQL访问。 Apache Spark可用于构建应用程序或将它们打包为要部署在集群上的库,或通过笔记本交互式执行快速分析(例如,Jupyter,Spark-Notebook,Databricks笔记本和Apache Zeppelin)。
Apache Spark是许多数据分析师,数据科学家或研究人员熟悉的库,他们使用过Python的pandas或R的data.frames或data.tables。值得注意的是,尽管Spark Data DataFrames对于pandas或data.frames / data.tables用户来说很熟悉,但是存在一些差异,所以请调整您的期望。具有更多SQL背景的用户也可以使用该语言来调整其数据。此外,Apache Spark提供了几种已经实现和调优的算法,统计模型和框架:用于机器学习的MLlib和ML,用于图形处理的GraphX和GraphFrames,以及Spark Streaming(DStreams和Structured)。 Spark允许用户在同一个应用程序中无缝地组合这些库。
Apache Spark可以轻松地在笔记本电脑上本地运行,但也可以通过YARN或Apache Mesos轻松部署在独立模式下 - 在本地群集或云端。它可以从各种数据源读取和写入,包括(但不限于)HDFS,Apache Cassandra,Apache HBase和S3。
图片.png参考: Apache Spark is the Smartphone of Big Data
什么是Apache Spark?
在本节中,我们将简要介绍Apache Spark Jobs和API。为后续的Spark 2.0架构部分打基础。
执行过程(Execution process)
任何Spark应用程序都会在主节点上开始单个驱动程序进程(可以包含多个作业),然后将执行程序进程(包含多个任务)分配到多个工作节点,如下图所示:
图片.png驱动程序进程根据为给定作业生成的图表确定指向执行程序节点的任务进程的数量和组成。注意,
任何工作节点都可以从许多不同的作业中执行任务。
Spark作业与直接非循环图(DAG direct acyclic graph)中组织的对象依赖关系链相关联,例如从Spark UI生成的以下示例。Spark可以优化调度(例如,确定所需的任务和工作人员数量)以及执行这些任务:
图片.png
有关DAG调度程序的更多信息,请参阅http://bit.ly/29WTiK8。
弹性分布式数据集(Resilient Distributed Dataset)
Apache Spark围绕称为Resilient Distributed Datasets(简称RDD)的不可变Java虚拟机(JVM)对象的分布式集合构建。在我们使用Python时,重要的是要注意Python数据存储在这些JVM对象中。更多这方面将在随后的RDD和DataFrames章节中讨论。这些对象允许任何作业非常快速地执行计算。 RDD是针对,缓存和存储在内存中计算的:与Apache Hadoop等其他传统分布式框架相比,这种方案可以使计算速度提高数个数量级。
DataFrames
与RDD一样,DataFrame是在集群中的节点之间分布的不可变数据集合。但是,与RDD不同,DataFrames中的数据被组织到命名列中。
如果您熟悉Python的pandas或R data.frames,这是一个类似的概念。
DataFrames旨在使大型数据集处理变得更加容易。它们允许开发人员正式化数据结构,允许更高级别的抽象;从这个意义上讲,DataFrames类似于关系数据库世界中的表。 DataFrames提供了一个特定于域的语言API来操作分布式数据,并使Spark可以被更广泛的受众访问,而不仅仅是专业数据工程师。
DataFrames的主要优点之一是Spark引擎最初构建逻辑执行计划,并根据成本优化程序确定的物理计划执行生成的代码。与Java或Scala相比,Python上的RDD可能明显更慢,DataFrames的引入使所有语言的性能均衡。
数据集
在Spark 1.6中引入,Spark数据集的目标是提供一个API,允许用户轻松地表达域对象的转换,同时还提供强大的Spark SQL执行引擎的性能和优势。不幸,在撰写本书时,数据集仅在Scala或Java中可用。当它们在PySpark中可用时,我们将在以后的版本中介绍它们。但由于Python的动态特性,数据集API的已经可用(即您可以通过名称自然地访问行的字段row.columnName),R也类似。
Catalyst Optimizer
Spark SQL是Apache Spark中涉及技术最多的组件之一,因为它支持SQL查询和DataFrame API。 Spark SQL的核心是Catalyst Optimizer。优化器基于函数式编程结构,设计时考虑了两个目的:为Spark SQL添加新的优化技术和功能,并允许外部开发人员扩展优化器(例如,添加特定于数据源的规则,支持对于新数据类型,等等):
有关更多信息,请查看Deep Dive到Spark SQL的https://databricks.com/blog/2015/04/13/deep-dive-into-spark-sqls-catalyst-optimizer.html
和Apache Spark DataFrames:简单快速的结构化数据分析(https://pages.databricks.com/Spark-DataFrames-Structured-Data.html)
Project Tungsten
Tungsten是Apache Spark执行引擎的伞形项目的代号。该项目专注于改进Spark算法,以便更有效地使用内存和CPU,从而将现代硬件的性能推向极限。
该项目的工作重点包括:
- 显式管理内存,以消除JVM对象模型和垃圾收集的开销
- 设计利用内存层次结构的算法和数据结构
- 在运行时生成代码,以便应用程序可以利用现代编译器并优化CPU
- 消除虚拟函数调度,以便减少了多个CPU调用
- 利用低级编程(例如,将即时数据加载到CPU寄存器)来加速内存访问并优化Spark的引擎以有效地编译和执行简单的循环
有关更多信息,请参阅Project Tungsten:将Apache Spark Closer引入裸机(https://databricks.com/blog/2015/04/28/project-tungsten-bringing-spark-closer-to-bare-metal.html
)
https://spark-summit.org/2015/events/deep-dive-into-project-tungsten-bringing-spark-closer-to-bare-metal/
)和https://databricks.com/blog/2016/05/23/apache-spark-as-a-compiler-joining-a-billion-rows-per-second-on-a-laptop.html。
Spark 2.0架构
Apache Spark 2.*是当前的主要版本:
图片.pngApache Spark 2.0发布的三个首要主题包括性能增强(通过Tungsten Phase 2),结构化流媒体的引入以及统一数据集和DataFrames。我们将描述数据集,因为它们是Spark 2.0的一部分,即使它们目前仅在Scala和Java中可用。
有关Apache Spark 2.0的更多信息,请参考:
https://www.slideshare.net/databricks/apache-spark-20-faster-easier-and-smarter
https://databricks.com/session/deep-dive-into-project-tungsten-bringing-spark-closer-to-bare-metal/
统一数据集和数据框架
数据集是在2015年作为Apache Spark 1.6版本的一部分引入的。数据集的目标是提供类型安全的编程接口。这允许开发人员使用具有编译时类型安全性的半结构化数据(如JSON或键值对)(即,可以在生产应用程序运行之前检查生产应用程序的错误)。 Python没有实现数据集API的部分原因是因为Python不是类型安全的语言。
数据集API包含高级域特定语言操作,例如sum() , avg() , join() 和 group()。后一种特性意味着您具有传统Spark RDD的灵活性,但代码也更易于表达,读取和写入。与DataFrame类似,Datasets可以通过将表达式和数据字段暴露给查询规划器并利用Tungsten的快速内存中编码来利用Spark的催化剂优化器。
Spark API的历史:
图片.pngDataFrame和Dataset API的统一可能会对向后兼容性产生重大变化。DataFrame和Dataset都属于作为Apache Spark 2.0的一部分引入的新Dataset API:
图片.png来源:三个Apache Spark API的故事:RDD,DataFrame和数据集http://bit.ly/2accSNA如前所述,Dataset API提供了一个类型安全的,面向对象的编程接口。数据集可以通过将表达式和数据字段暴露给查询规划器和Project Tungsten的快速内存中编码来利用Catalyst优化器。但是现在DataFrame和Dataset已经统一为Apache Spark 2.0的一部分,DataFrame现在是Dataset Untyped API的别名。
DataFrame = Dataset[Row]
SparkSession
在过去,您可能会使用SparkConf,SparkContext,SQLContext和HiveContext分别用于配置,Spark上下文,SQL上下文和Hive上下文的各种Spark查询。
SparkSession本质上是这些上下文的组合,包括StreamingContext
# 旧版本
df = sqlContext.read.format('json').load('py/test/sql/people.json')
# 新版
df = spark.read.format('json').load('py/test/sql/people.json')
# 或
df = spark.read.json('py/test/sql/people.json')
Tungsten phase 22
虽然RAM内存,磁盘和(在一定程度上)网络接口的每个性能价格都有所改进,但CPU的每个性能提升的价格却不尽相同。虽然硬件制造商可以在每个插槽中放置更多内核(即通过并行化提高性能),实际核心速度没有显着改善。
Project Tungsten于2015年推出,旨在对Spark引擎进行重大更改,重点是提高性能。这些改进的第一阶段主要集中在以下方面:
- 内存管理和二进制处理:利用应用程序语义显式管理内存并消除JVM对象模型和垃圾收集的开销
- 缓存感知计算:利用内存层次结构的算法和数据结构
- 代码生成:使用代码生成来利用现代编译器和CPU
下图是更新的Catalyst引擎,用于表示包含数据集。如右图所示(成本模型右侧),代码生成用于针对选定的物理计划生成基础RDD:
图片.png参考 https://www.slideshare.net/databricks/structuring-spark-dataframes-datasets-and-streaming
Spark引擎现在将在编译时为整个Spark阶段生成字节代码,而不仅仅针对特定的作业或任务。围绕这些改进的主要方面包括:
- 无虚函数调度:这可以减少多次CPU调用,这些调用在调度数十亿次时会对性能产生深远的影响
- 内存中的数据与CPU寄存器:Tungsten Phase 2将中间数据放入CPU寄存器。这是从CPU寄存器而不是从内存中获取数据的周期数减少了一个数量级
- 循环展开和SIMD:优化Apache Spark的执行引擎,以利用现代编译器和CPU的高效编译和执行能力for循环(与复杂函数调用图相对)
参考:
-
https://databricks.com/blog/2016/06/22/apache-spark-key-terms-explained.html
-
https://databricks.com/blog/2015/04/28/project-tungsten-bringing-spark-closer-to-bare-metal.html
结构化流媒体
由Reynold Xin在Spark Summit East 2016期间引用:“执行流分析的最简单方法是不必推理流媒体。”这是构建结构化流的基础。虽然流式传输功能强大,但其中一个关键问题是流式传输可能难以构建和维护。虽然优步,Netflix和Pinterest等公司都在生产中运行Spark Streaming应用程序,但他们也有专门的团队来确保系统高度可用。
有关Spark Streaming的高级概述,请查看Spark Streaming:它是什么以及谁在使用它? https://www.datanami.com/2015/11/30/spark-streaming-what-is-it-and-whos-using-it/
如前所述,在运行Spark Streaming(以及任何流媒体系统)时可能会出现许多问题,包括(但不限于)延迟事件,部分输出到最终数据源,失败时的状态恢复和/或分布式读/写:
图片.png来源:深入了解结构化流媒体https://databricks.com/session/a-deep-dive-into-structured-streaming/
因此,为了简化Spark Streaming,现在有一个API可以解决Apache Spark 2.0版本中的批处理和流媒体。更简洁的是,高级流API现在构建在Apache Spark SQL Engine之上。它运行与使用Datasets / DataFrames相同的查询,为您提供所有性能和优化优势以及诸如事件时间等好处,
窗口,会话,源和槽(sink)。
连续应用
总而言之,Apache Spark 2.0不仅统一了数据框架和数据集,还统一了流媒体,交互式和批量查询。这将打开一组全新的用例,包括将数据聚合到流中,然后使用传统的JDBC / ODBC提供服务,在运行时更改查询,和/或在多个场景中构建和应用ML模型的能力。各种延迟使用案例:
图片.png参考:https://databricks.com/blog/2016/06/22/apache-spark-key-terms-explained.html
现在,您可以构建端到端的连续应用程序,您可以在其中发出与批处理相同的查询以及实时数据,执行ETL,生成报告,更新或跟踪流中的特定数据。
有关连续应用程序的更多信息,请参阅https://databricks.com/blog/2016/07/28/continuous-applications-evolving-streaming-in-apache-spark-2-0.html
总结
在本章中,我们回顾了什么是Apache Spark,并提供了Spark Jobs和API的入门知识。我们还提供了弹性分布式数据集(RDD)的入门知识,DataFrames和Datasets;我们将在后续章节中进一步深入研究RDD和DataFrame。我们还讨论了由于Spark SQL Engine的Catalyst Optimizer和Project Tungsten,DataFrames如何在Apache Spark中提供更快的查询性能。最后,我们还提供了Spark 2.0架构的高级概述,包括Tungsten Phase 2,Structured Streaming和Unifying DataFrames和Datasets。
在下一章中,我们将介绍Spark中的一个基本数据结构:
弹性分布式数据集或RDD。我们将向您展示如何使用变换器和动作创建和修改这些无模式数据结构,以便您可以开始使用PySpark。不过,在我们这样做之前,请查看链接https://www.packtpub.com/sites/default/files/downloads/InstallingSpark.pdf
网友评论