vlambda博客
学习文章列表

扩展关系数据库,Apache Spark SQL+DataFrames版教程

海牛学院的 | 第 562 期

本文预计阅读 | 10分钟

扩展关系数据库,Apache Spark SQL+DataFrames版教程


关系型数据库将一直存在,而不管炒作和通常称为NoSQL数据库的较新数据库的出现。原因很简单,关系数据库强制执行必要的结构和约束,并提供了一种漂亮的声明性语言来查询数据(我们喜欢):SQL!


但是,规模一直是关系数据库的问题。21世纪的大多数企业都拥有丰富的数据存储库和存储库,并希望最大程度地利用其大数据来获取可行的见解。关系数据库可能很流行,但是除非我们投资于适当的大数据管理策略,否则它们的伸缩性不会很好。这涉及到考虑潜在的数据源,数据量,约束,模式,ETL(提取-转换-负载),访问和查询模式等等!


扩展关系数据库,Apache Spark SQL+DataFrames版教程


大数据关系数据库扩展的动机和挑战


关系数据存储易于构建和查询。而且,用户和开发人员通常更喜欢以类似于人类的可读语言(例如SQL)编写易于解释的声明式查询。但是,随着数据量和种类的增加,关系方法的扩展性不足以构建大数据应用程序和分析系统。以下是一些主要挑战。


  • 处理不同类型和数据源,可以是结构化,半结构化和非结构化

  • 建立往返于各种数据源的ETL管道,这可能导致开发大量特定的自定义代码,从而随着时间的推移增加技术负担

  • 具有执行基于传统商务智能(BI)的分析和高级分析(机器学习,统计建模等)的能力,而后者在关系系统中执行无疑是一项挑战


大数据分析不是昨天才发明的!Hadoop和MapReduce范例在这一领域取得了成功。它功能强大,但通常很慢,并且为用户提供了一个低级的过程编程界面,该界面要求人们甚至为非常简单的数据转换编写大量代码。但是,Spark发布后,它真正改变了大数据分析的方式,重点是内存计算,容错,高级抽象和易用性。


扩展关系数据库,Apache Spark SQL+DataFrames版教程


从那时起,Hive,Pig和Shark(演变为Spark SQL)等几个框架和系统为大数据存储提供了丰富的关系接口和声明性查询机制。挑战仍然是这些工具是基于关系的或基于过程的,而且我们无法兼得两者。


但是,在现实世界中,大多数数据和分析管道可能涉及关系代码和过程代码的组合。强迫用户选择其中之一将使事情变得复杂,并增加了用户在开发,构建和维护不同的应用程序和系统方面的工作。Apache Spark SQL建立在前面提到的名为Shark的SQL on Spark上。Spark SQL并非强迫用户在关系API或过程API之间进行选择,而是尝试使用户无缝地将二者混合在一起,并在大数据上大规模执行数据查询,检索和分析。


了解Spark SQL和DataFrames


Spark SQL本质上试图通过两个主要组件来弥合我们前面提到的两个模型(关系模型和过程模型)之间的鸿沟。


  • Spark SQL提供了一个DataFrame API,可以在外部数据源和Spark的内置分布式集合上大规模执行关系操作!

  • 为了在大数据中支持多种多样的数据源和算法,Spark SQL引入了一种称为Catalyst的新型可扩展优化器,可轻松添加数据源,优化规则和数据类型,以进行诸如机器学习之类的高级分析。


本质上,Spark SQL利用Spark的功能在大数据上大规模执行分布式,健壮的内存中计算。Spark SQL提供最新的SQL性能,并且还与Apache Hive(流行的大数据仓库框架)支持的所有现有结构和组件保持兼容,包括数据格式,用户定义函数(UDF)和元存储。除此之外,它还有助于从大数据源和企业数据仓库(如JSON,Hive,Parquet等)中提取各种数据格式,并执行关系和过程操作的组合以进行更复杂的高级分析。


目标


根据其创建者的定义,Spark SQL的主要目标是:使用程序员友好的API,在Spark程序内(在本机RDD上)和外部数据源上支持关系处理


  1. 使用已建立的DBMS技术提供高性能

  2. 轻松支持新数据源,包括半结构化数据和适合查询联合的外部数据库

  3. 使用高级分析算法(例如图形处理和机器学习)实现扩展


架构和功能


现在,我们将研究围绕Spark SQL和DataFrames的关键功能和体系结构。这里需要牢记的一些关键概念围绕着Spark生态系统,Spark生态系统随着时间的推移不断发展。


扩展关系数据库,Apache Spark SQL+DataFrames版教程


生态系统


RDD(弹性分布式数据集)也许是Spark所有成功案例背后的最大贡献者。它基本上是一种数据结构,或更确切地说是一种分布式内存抽象,它使程序员可以在大型分布式集群上执行内存中计算,同时保留诸如容错之类的功能。您还可以并行执行许多计算和转换,并跟踪转换的整个沿袭,这可以帮助有效地重新计算丢失的数据。Spark爱好者可能希望阅读有关RDD的出色论文,“ 弹性分布式数据集:内存中群集计算的容错抽象 ”。此外,Spark结合了驱动程序和工作者的概念,如下图所示。


扩展关系数据库,Apache Spark SQL+DataFrames版教程


通常,您可以通过从文件,数据库中读取数据,并行化现有集合甚至进行转换来创建RDD。通常,转换是可用于将数据转换为不同方面和维度的操作,具体取决于我们要处理和处理数据的方式。它们也被懒惰地求值,这意味着,即使您定义了一个转换,也要等到您执行一个action时才计算结果,这通常需要将结果返回给驱动程序(然后计算所有应用的转换!)。


扩展关系数据库,Apache Spark SQL+DataFrames版教程


向数据科学家和朋友FavioVázquez以及他的出色文章“ 使用Apache Spark进行深度学习 ” 大喊大叫,在那里我得到了一些出色的想法和内容,包括上图。看看这个!


既然我们了解了Spark工作原理的一般架构,那么让我们仔细研究一下Spark SQL。通常,如在覆盖Spark生态系统的图中所见,Spark SQL作为Spark之上的库运行。下图更详细地介绍了Spark SQL的典型体系结构和接口。


扩展关系数据库,Apache Spark SQL+DataFrames版教程


该图清楚地显示了各种SQL接口,可以通过JDBC / ODBC或命令行控制台进行访问,以及集成到Spark支持的编程语言中的DataFrame API(我们将使用Python)。DataFrame API非常强大,并且允许用户最终混合过程代码和关系代码!UDF等高级功能(用户定义的功能)也可以在SQL中公开,BI工具可以使用该功能。


Spark DataFrames非常有趣,可以帮助我们利用Spark SQL的功能,并根据需要组合其过程范式。Spark DataFrame基本上是具有相同架构的行(行类型)的分布式集合。它基本上是一个组织成命名列的Spark数据集。这里要注意的一点是,数据集是DataFrame API的扩展,它提供了类型安全的,面向对象的编程接口。因此,它们仅在Java和Scala中可用,因此,我们将专注于DataFrames。


扩展关系数据库,Apache Spark SQL+DataFrames版教程


DataFrame等效于关系数据库中的表(但在后台进行了更多优化),并且还可以通过与Spark(RDD)中的“本地”分布式集合类似的方式进行操作。Spark DataFrame具有一些有趣的属性,下面将介绍其中一些。


  1. 与RDD不同,DataFrame通常跟踪其架构并支持各种关系操作,这些操作可导致更优化的执行。

  2. 可以从表中构造DataFrame,就像在大数据基础架构中现有的Hive表一样,甚至可以从现有的RDD中构造表。

  3. 可以使用直接SQL查询以及使用DataFrame DSL(特定于域的语言)来操纵DataFrame,在这里我们可以使用各种关系运算符和转换器,例如where和groupBy。

  4. 而且,每个DataFrame都还可以看作是行对象的RDD,从而允许用户调用过程性Spark API(例如map)。

  5. 最后,与传统的Dataframe API(Pandas)不同,Spark DataFrames是惰性的,因为每个DataFrame对象代表一个计算数据集的逻辑计划,但是直到用户调用特殊的“输出操作”(例如保存)。


这应该使您对Spark SQL,DataFrames,基本功能,概念,体系结构和接口有足够的了解。让我们通过查看性能基准来结束本节。


性能


没有正确的优化就发布新功能可能是致命的,构建Spark的人们进行了大量的性能测试和基准测试!让我们看一些有趣的结果。第一个显示一些结果的图如下所示。


扩展关系数据库,Apache Spark SQL+DataFrames版教程


在这些实验中,他们使用AMPLab大数据基准比较了Spark SQL与Shark和Impala的性能,该基准使用Pavlo等人开发的Web分析工作负载。基准测试包含四种类型的查询,这些查询使用不同的参数来执行扫描,聚合,联接和基于UDF的MapReduce作业。使用柱状Parquet格式压缩后的数据集为110GB数据。我们看到,在所有查询中,Spark SQL都比Shark快得多,并且通常与Impala竞争。Catalyst优化器对此负责,这减少了CPU开销(我们将简要介绍)。在许多此类查询中,此功能使Spark SQL在基于C ++和LLVM的Impala引擎中具有竞争力。与Impala的最大差距在于查询3a Impala选择了更好的联接计划,因为查询的选择性使得其中一个表非常小。


下图显示了DataFrames和常规Spark API和Spark + SQL的更多性能基准


扩展关系数据库,Apache Spark SQL+DataFrames版教程


最后,下图显示了使用不同语言的DataFrames与RDD的良好基准测试结果,这为如何优化DataFrames提供了有趣的视角。


扩展关系数据库,Apache Spark SQL+DataFrames版教程


性能的秘诀:Catalyst优化器


为什么Spark SQL如此快速和优化?原因是由于新的可扩展优化器Catalyst基于Scala中的函数编程构造。尽管我们在这里不会详细介绍Catalyst,但是值得一提,因为它有助于优化DataFrame操作和查询。


扩展关系数据库,Apache Spark SQL+DataFrames版教程


Catalyst的可扩展设计具有两个目的


  • 轻松向Spark SQL添加新的优化技术和功能,尤其是解决围绕大数据,半结构化数据和高级分析的各种问题

  • 易于扩展优化器-例如,通过添加特定于数据源的规则,这些规则可以将过滤或聚合推入外部存储系统或支持新数据类型


Catalyst支持基于规则的优化和基于成本的优化。尽管过去已经提出了可扩展的优化器,但它们通常需要使用复杂的领域特定语言来指定规则。通常,这导致学习曲线和维护负担很大。相反,Catalyst使用Scala编程语言的标准功能(例如模式匹配),以使开发人员可以使用完整的编程语言,同时仍使规则易于指定。


扩展关系数据库,Apache Spark SQL+DataFrames版教程


Catalyst的核心是一个通用库,用于表示树并应用规则对其进行操作。在此框架的顶部,它具有关系查询处理专用的库(例如,表达式,逻辑查询计划),以及处理查询执行不同阶段的几组规则:分析,逻辑优化,物理计划和代码生成以进行编译Java字节码查询的一部分。




加群扫码 ↓ 备注 “ 进群 ” (广告勿扰)

【海牛大数据交流群】
扩展关系数据库,Apache Spark SQL+DataFrames版教程


往期推荐





 唔~要这个 ↓↓↓