3.2.4 Spark SQL在交互式计算中的应用

更新于 2026年10月10日 版权声明
3.2.4 Spark SQL在交互式计算中的应用

1)Spark简介

许多行业广泛使用Hadoop来分析大数据。原因是Hadoop框架基于一个简单的编程模型(MapReduce),它支持可扩展、灵活、容错和成本有效的计算解决方案。

Spark是基于内存计算的大数据并行计算框架,是一种快速、通用、可扩展的大数据分析引擎。它于2009年诞生于加州大学伯克利分校的AMP实验室,2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache顶级项目。目前,Spark生态系统发展成为一个包含多个子项目的集合,其中包含Spark SQL、Spark Streaming、GraphX、MLlib等子项目。Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark集群部署在大量廉价硬件之上。

Spark是在借鉴了MapReduce之上发展而来的,继承了其分布式并行计算的优点,并对MapReduce进行了改进。首先,Spark把中间数据放到内存中,迭代运算效率高。MapReduce中间计算结果需要保存到磁盘上,这样势必影响整体速度,而Spark支持DAG图的分布式并行计算的编程框架,减少了迭代过程中数据对磁盘的访问,提高了处理效率。其次,Spark容错性高。Spark引进了RDD (Resilient Distributed Dataset,弹性分布式数据集)的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即允许基于数据衍生过程)对它们进行重建。另外在RDD计算时可以通过CheckPoint来实现容错。最后,Spark更加通用。MapReduce只提供了Map和Reduce两种操作,Spark提供的数据集操作类型有很多,大致分为Transformations和Actions两大类。Transformations包括Map、Filter、FlatMap、Sample、GroupByKey、ReduceByKey、Union、Join、Cogroup、MapValues、Sort等多种操作类型,同时还提供Count。Actions包括Collect、Reduce、Lookup和Save等操作。总之,Spark是MapReduce的替代方案,而且兼容HDFS、Hive,还可融入Hadoop的生态系统,以弥补MapReduce的不足。

图3⁃15是大数据处理技术的演进过程,在大数据处理技术中,Hadoop和Spark是两个并行处理框架,相比较于Hadoop来说,Spark具有以下的特性。

(1)速度快

Spark有助于在Hadoop集群中运行应用程序,在内存中速度提高100倍,在磁盘上运行时提高10倍,这可以通过减少对磁盘的读/写操作的数量来实现。它将中间处理数据存储在内存中。

图示

图3⁃15 大数据处理技术演进图

(2)易用

Spark支持Java、Python、Scala和R的API,还支持超过80种高级算法,使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala的Shell,可以非常方便地在这些Shell中使用Spark集群来验证解决问题的方法。

(3)通用

Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用。Spark统一的解决方案非常具有吸引力,毕竟任何公司都想用统一的平台去处理遇到的问题,减少开发和维护的人力成本和部署平台的物力成本。

(4)兼容性

Spark可以非常方便地与其他的开源产品进行融合。比如,Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,并且可以处理所有Hadoop支持的数据,包括HDFS,HBase和Cassandra等。这对已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark的强大处理能力。Spark也可以不依赖第三方的资源管理和调度器,它实现了独立的集群模式(Standalone)作为其内置的资源管理和调度框架,这样进一步降低了Spark的使用门槛,使得所有人都可以非常容易地部署和使用Spark。

2)Spark生态圈

如图3⁃16所示,Spark生态圈是以Spark Core为核心,从HDFS、Amazon S3和HBase等持久层读取数据,以Mesos,YARN和自身携带的Standalone为资源管理器调度作业完成Spark应用程序的计算。这些应用程序可以来自不同的组件,如Spark Shell/Spark Submit的批处理、Spark Streaming的实时处理应用、Spark SQL的交互式查询、MLlib/MLbase的机器学习、GraphX的图处理和SparkR的数学计算等。

图示

图3⁃16 Spark生态系统

3)Spark SQL概述

Spark SQL是Spark用来处理结构化数据的一个模块,它提供了非常强大的API。Spark SQL允许开发人员直接处理RDD,以及查询存储在Hive、HBase上的外部数据。

在Hadoop生态中已经有了Hive、Pig等分析工具,为什么还会出现Spark SQL呢?在Hadoop发展过程中,为了给熟悉RDBMS但又不理解MapReduce的技术人员提供快速上手的工具,Hive应运而生,它是当时唯一运行在Hadoop上的SQL⁃on-Hadoop工具。但是,MapReduce在计算过程中大量的中间磁盘落地过程消耗了大量的磁盘I/O,严重地降低了运行效率。为了提高SQL⁃on-Hadoop的运行效率,大量的SQL⁃on-Hadoop工具开始产生,其中表现突出的有一个叫Shark的工具,Shark运行在Spark引擎上,从而使得SQL的查询速度得到了10~100倍的提升。

但是,随着Spark的发展,Shark对于Hive的太多依赖(如采用Hive的语法解析器、查询优化器等),与Spark的一站式处理(One Stack to Rule Them All)的既定方针不相匹配,制约了Spark各个组件的相互集成,于是就产生了Spark SQL。简单总结就是,Spark SQL的开发目的是为用户提供关系查询和复杂过程算法(如机器学习算法)混合应用,让此类应用在内存中执行分析,在几秒或几分钟内生成结果。Spark SQL具有以下特点:

(1)容易集成

Spark SQL将SQL查询与Spark程序无缝对接,它允许用户使用SQL或熟悉的DataFrame API在Spark程序内查询结构化数据,可应用于Java、Scala、Python和R语言。

(2)统一的数据访问方式

Spark SQL可使用同样的方式连接任何数据源,DataFrame和SQL提供了访问各种数据源的常用方式,包括Hive、Avro、Parquet、ORC、JSON和JDBC,用户甚至可以通过这些数据源直接加载数据。

(3)支持HQL查询

Spark SQL能够在现有数据仓库上运行SQL或HiveSQL查询,Spark SQL支持HiveQL语法、Hive SerDes(序列化和反序列化工具)和UDF(用户自定义函数),允许用户访问现有的Hive仓库。(https://www.daowen.com)

(4)标准的数据连接

Spark SQL通过JDBC或ODBC进行数据库连接,服务器模式为商业智能工具提供行业标准的JDBC和ODBC数据连接。

4)Spark SQL组件

DataFrame、SQLContext和JDBC数据源是Spark SQL最主要的三个组件。

(1)DataFrame

DataFrame是一个分布式的、按照命名列的形式组织的数据集合。DataFrame基于R语言中的data.frame概念,与关系型数据库中的数据库表类似。之前版本的Spark SQL API中的SchemaRDD已经更名为DataFrame。

可以通过调用RDD方法,把DataFrame的内容作为行值,从而能将DataFramc转换成RDD。

用户可以通过如下数据源创建DataFrame。

•已有的RDD。

•结构化数据文件。

•JSON数据集。

•Hive表。

•外部数据库。

(2)SQLContext

Spark SQL提供SQLContext封装Spark中的所有关系型功能。用户可以使用自己之前应用中的SparkContext创建SQLContext。下述代码片段展示了如何创建一个SQLContext对象。

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

此外,Spark SQL中的HiveContext提供的功能可以是SQLContext所提供功能的超集。用户可以在用HiveQL解析器编写查询语句以及从Hive表中读取数据时使用。在Spark程序中使用HiveContext不需要既有的Hive环境。

(3)JDBC数据源

JDBC数据源可用于通过JDBC API读取关系型数据库中的数据。相比于使用JdbcRDD,应该将JDBC数据源的方式作为首选,因为JDBC数据源能够将结果作为DataFrame对象返回,直接用Spark SQL处理或与其他数据源连接。

5)Spark SQL应用

Spark Shell启动后,就可以用Spark SQL API执行数据分析查询。

在本示例中,首先从文本文件中加载用户数据,然后从数据集中创建一个DataFrame对象,最后运行DataFrame函数,执行特定的数据选择查询。

文本文件customers.txt中的内容如下。

下述代码片段展示了可以在Spark Shell终端执行的Spark SQL命令。

除文本文件之外,也可以从其他数据源中加载数据,如JSON数据文件、Hive表,甚至可以通过JDBC数据源加载关系型数据库表中的数据。

图示

Spark SQL提供了十分友好的SQL接口,可以与来自多种不同数据源的数据进行交互,而且所采用的语法也是熟知的SQL查询语法。这对非技术类的项目成员,如数据分析师以及数据库管理员来说,是非常实用的。

关于HBase和Spark SQL数据库的操作实验过程可通过扫描二维码查看。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)