spark apache_使用Apache Spark SQL和DataFrames扩展关系数据库

spark apache

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

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

本文将介绍利用关系数据库的强大功能而取得的一些卓越进展,但这些过程将使用Apache Spark的一些较新组件Spark SQL和DataFrames “按比例”进行。 最值得注意的是,我们将涵盖以下主题。

  1. 扩展关系数据库的动机和挑战
  2. 了解Spark SQL和DataFrames
    • 目标
    • 架构和功能
    • 性能
  3. 本系列的第二篇文章介绍了有关Spark SQL的实际案例研究/教程 ,并提供了动手示例

我们将研究努力工作的人们所面临的主要挑战和动机,并花费时间在Apache Spark中构建新组件,以便我们能够大规模执行SQL。 我们还将检查Spark SQL和DataFrame的主要体系结构,接口,功能和性能基准。 最后,但最重要的是,我们将介绍一个实际案例研究,该案例研究利用Spark SQL和DataFrames通过利用Databricks Cloud Platform for Spark分析基于KDD 99 Cup数据的入侵攻击。

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

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

  • 处理不同类型和数据源,可以是结构化,半结构化和非结构化
  • 建立往返于各种数据源的ETL管道,这可能导致开发许多特定的自定义代码,从而随着时间的推移增加技术负担
  • 具有执行基于传统商务智能(BI)的分析和高级分析(机器学习,统计建模等)的能力,而后者在关系系统中的执行无疑具有挑战性

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

Hadoop Map Reduce vs. Spark

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

但是,在现实世界中,大多数数据和分析管道可能涉及关系代码和过程代码的组合。 迫使用户选择其中之一,最终会使事情变得复杂,并增加用户在开发,构建和维护不同的应用程序和系统中的工作量。 Apache Spark SQL建立在前面提到的名为SharkSQL 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的一些有趣的事实,包括它的用法,采用和目标,其中一些我将再次从《 Spark中的关系数据处理 》的优秀原始论文中抄袭。 Spark SQL于2014年5月首次发布,现在可能是Spark中开发最活跃的组件之一。 Apache Spark无疑是大数据处理最活跃的开源项目,拥有数百名贡献者。

除了作为一个开源项目之外,Spark SQL已经开始被主流行业采用。 它已经被部署在非常大规模的环境中。 Facebook有一个关于“ Apache Spark @Scale:60 TB +生产用例 ”的出色案例研究。 该公司正在为实体排名进行数据准备,它的Hive工作过去要花几天时间并且面临许多挑战,但是Facebook能够使用Spark成功地扩展规模并提高性能。 看看他们在此旅程中面临的有趣挑战!

另一个有趣的事实是,三分之二的Databricks Cloud(运行Spark的托管服务)客户在其他编程语言中使用Spark SQL。 在本系列的第二部分中 ,我们还将展示在Databricks上使用Spark SQL的动手案例研究。

根据其创建者的定义,Spark SQL的主要目标是:

  1. 使用程序员友好的API在Spark程序内(在本机RDD上)和外部数据源上支持关系处理
  2. 使用已建立的DBMS技术提供高性能
  3. 轻松支持新数据源,包括半结构化数据和适合查询联合的外部数据库
  4. 使用高级分析算法(例如图形处理和机器学习)进行扩展

架构和功能

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

Spark ecosystem

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

Spark works with drivers and workers

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

RDD transformations

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

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

Spark SQL architecture and interfaces

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

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

DataFrames architecture

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

  1. 与RDD不同,DataFrame通常跟踪其架构并支持各种关系操作,这些操作可导致更优化的执行。
  2. 可以从表中构造DataFrame,就像在大数据基础架构中现有的Hive表一样,甚至可以从现有的RDD中构造表。
  3. 可以使用直接SQL查询以及使用DataFrame DSL(特定于域的语言)来操纵DataFrame,在这里我们可以使用各种关系运算符和转换器,例如where和groupBy。
  4. 而且,每个DataFrame都还可以视为行对象的RDD,从而允许用户调用过程性Spark API(例如map)。
  5. 最后,Spark DataFrames与传统的Dataframe API(Pandas)不同,它是一个懒惰的,因为每个DataFrame对象代表一个计算数据集的逻辑计划,但是直到用户调用特殊的“输出操作”(例如保存)。

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

性能

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

Performance comparisons

在这些实验中,他们使用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选择了更好的联接计划,因为查询的选择性使得其中一个表非常小。

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

Spark DataFrames vs. RDDs and SQL

Spark DataFrames与RDD和SQL

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

Comparing Spark DataFrames and RDDs

比较Spark DataFrame和RDD

性能的秘诀:Catalyst优化器

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

Catalyst

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

  • 轻松向Spark SQL添加新的优化技术和功能,尤其是解决围绕大数据,半结构化数据和高级分析的各种问题
  • 易于扩展优化器-例如,通过添加特定于数据源的规则,这些规则可以将过滤或聚合推入外部存储系统或支持新数据类型

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

Catalyst architecture

Catalyst的核心是一个通用库,用于表示树并应用规则对其进行操作。 在此框架之上,它具有特定于关系查询处理的库(例如,表达式,逻辑查询计划)以及处理查询执行不同阶段的几组规则:分析,逻辑优化,物理计划和代码生成以进行编译Java字节码查询的一部分。 有兴趣了解有关Catalyst的更多详细信息并进行深入研究吗? 您可以从Databricks中查看出色的“ 深入研究Spark SQL的Catalyst Optimizer ”。

单击本系列的第二篇文章,获得基于真实数据集的动手教程 ,以了解如何使用Spark SQL。


这篇文章最初出现在Medium的Towards Data Science频道上,经许可重新发布。


接下来要读什么

翻译自: https://opensource.com/article/19/3/sql-scale-apache-spark-sql-and-dataframes

spark apache

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值