龙空技术网

基于Apache Spark SQL和DataFrames的大数据架构

虫虫安全 731

前言:

而今姐妹们对“apachetilesiframe”大概比较关切,各位老铁们都想要了解一些“apachetilesiframe”的相关内容。那么小编同时在网摘上搜集了一些关于“apachetilesiframe””的相关内容,希望朋友们能喜欢,看官们一起来学习一下吧!

规模化横向扩展一直是关系数据库的心头止痛,在9012的今天,绝大多数的企业都收集和存储了丰富的数据仓库,而且迫切需要利用这些数据来分析、可视化指导自己企业决策和完善产品服务功能。关系数据库可以解决大多数的数据问题,但是扩展性问题尤其在数据源、数据量、约束、模式、ETL(extract-transform-load),访问和查询模式等方面则会捉襟见肘,大数据分析需求迫在眉睫。本文将虫虫给家家介绍,在立足关系数据的基础上,利用Apache Spark-Spark SQL和DataFrames实现大数据分析和关系数据库横向扩展等问题。

关系数据库危机和大数据分析

关系理论和关系数据库构造了这个世界数据存储的基石。从此数据的存储和查询变得简单方便。而且人性化的SQL语言,深受码农和大家的喜爱,成了世界上流行最广泛的语言之一,虽然绝大多数的人都不回编程,但是都会写一点点的SQL语句。但是,随着数据量和种类的增加,由于关系数据库的扩展性问题,导致在分析和处理大型数据应用时候出现了种种不足,现代数据仓库需要解决如下典型的问题

1、处理不同类型和数据源,包括结构化,半结构化和非结构化数据;

2、需要在各种数据源之间建立ETL管道,可能会导致开发大量特定的自定义代码,而且这些代码会随时时间不断累积导致技术债务。

3、能够执行基于传统商业智能(BI)分析和高级分析(机器学习,统计建模等),后者在关系系统中执行绝对具有挑战性。

为了补充关系数据库的不足大数据分析开始出现了。此前基于谷歌三大论文出现的Hadoop和MapReduce模式使得大数据分析成功落地。Hadoop真正解决了大数据分析的问题,并的业界取得了巨大的成功。但是,Hadoop集群太庞大,并且只提供了低级的基于过程编程的接口,不易于使用,往往为了实现一个很简单的功能,比如数据格式转换,也要要编写大量的Java代码来实现。于是Spark应用而生,彻彻底底的解决了大数据分析中容错,高级抽象和易用性等等问题,基于内存的计算性能得到了极大改善,基于实时流处理和交互式模式解决了数据及时性和响应性的需求性。

此后,Hive,Pig和Shark等处理框架和和系统相继出现,为大数据存储提供了丰富的关系接口和程序式查询机制。但是这些工具要么只支持关系型,要么基于程序式,我们只能使用其中一种处理模式。

那么有没有一种支持两种处理方式的框架呢?答案是肯定的,这就是本文的主角 Apache Spark SQL。Apache Spark SQL基于上面提到的Shark框架,它有机地把两种处理模式结合起来,供用户按需选择,实现大规模地数据的执行数据查询,检索和分析。

Spark SQL和DataFrame简介

Spark SQL的架构通过两个组件来支持关系模式和程式模型两种处理模式:

Spark SQL提供了一个DataFrame API,可以对外部数据源和Spark的内置分布式集群进行大规模的关系处理。

为了支持大数据中的各种各样的数据源和算法,Spark SQL引入了一种名为Catalyst的新型可扩展优化器,可以方便地为机器学习等高级数据分析添加数据源、优化规则和数据类型。

从本质上讲,Spark SQL利用了Spark的强大功能在大数据上分布式大规模地执行内存计算。Spark SQL提供了高性能的SQL操作,兼容Apache Hive(一种流行的大数据仓库框架)支持的结构和组件,包括数据格式,用户定义函数(UDF)和元数据库Metastore。Spark还提供了功能帮助企业从大数据源和企业数据仓库(如JSON,Hive,Parquet等)中提取各种数据格式,执行关系处理和过程处理的组合,以实现更复杂的高级分析。

目标

Spark SQL于2014年5月首次发布,是Spark项目中最活跃的组件之一。而 Apache Spark则是大数据处理领域最活跃的开源项目,有数以百计的开发者参与开发。Spark SQL已经被企业大量采纳和使用。著名社交网络脸书Facebook就基于Apache Spark构建了一个60 TB+的大规模生产集群。该集群用于线上业务数据排序,此前使用的是Hive,不仅耗时而且问题多多。利用Spark重构后性能极大提高,架构也更趋完美,主线处理逻辑有以前的三步(Filter-Aggregate-shard)到现在一步。

通过Spark SQL要实现的主要目标是:

1.使用对开发者友好的API支持Spark程序(本机RDD)和外部数据源上的关系形处理。

2.使用已建立的DBMS技术提供高性能操作。

3.轻松实现新数据源的扩展,包括半结构化数据和适合联合查询的外部数据库

4.易于展实现高级算法分析,比如图处理,ML机器学习等。

架构和功能

Spark SQL和DataFrames的主要功能和架构图如下:

RDD(弹性分布式数据集)是Spark所有成功案例背后的最大贡献者。RDD定义了是一种数据结构,或者更确切地说是分布式内存的抽象层,它允许程序员在大型分布式集群上执行内存计算,同时保留容错等方面,并以并行化的方式实现计算和转换,并实现整个过程的跟踪和状态反馈。详细技术细节,可以参考论文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》(弹性分布式数据集:一种内存集群计算的容错抽象)

此外,Spark使用驱动程序和工作程序的概念,如下图所示。

通常可以通过从文件,数据库读取数据,合并甚至转化来实现RDD的创建。通常通过转换实现将数据转换为不同方面和维度的操作,具体取决分析挖掘和处理数据的方式。

在了解了Spark的架构和处理流程后后,我们再来说Spark SQL。Spark SQL作为Spark上的组件库运行,Spark生态系统中的位置如下所图所示。

图中首先是各层次的SQL接口,可以通过JDBC/ODBC或命令行终端访问。各语言的集成是通过DataFrame API。DataFrame API非常强大,通过它实现语言的统一调度管理以及和底层的交互,一些UDF(用户定义的函数)之类的高级函数也能通过SQL发布,并在BI工具中使用。

Spark DataFrame是具有相同模式的行(行类型)的分布式集合。它基本上是一个组织为命名列的Spark数据集。数据集是对DataFrame API的扩展和打包,它提供了一种类型安全的、面向对象的编程接口。因此,支持支持在Java和Scala中使用。

DataFrame等价于关系数据库中的表,并且还支持以Spark(RDD)中的"本机"分布式集合的方式进行操作。Spark DataFrames还有一些特性需要提及:

1.与RDD不同,DataFrame通常会跟踪其架构并支持各种关系操作,从而实现更优化的执行。

2. DataFrame可以从表构建,和Hive表一样,也可以从RDD构建。

3.可以直接使用SQL查询操作DataFrame,也可以使用DataFrame DSL。可以使用各种关系运算符和转换器,例如where和groupBy。

4.每个DataFrame可视为行对象的RDD,允许用户调用过程Spark API,例如map操作。

5.传统的数据帧API不同,Spark DataFrames是惰性的,每个DataFrame对象代表计算数据集的逻辑计划,在用户实际调用之前不会实际执行输出操作。

以上介绍了Spark SQL和DataFrames的基本功能,概念,体系结构和接口,最后我们在介绍下该架构的性能。

性能

在性能部分,我们首先来看看一个性能基准测试结果图。

在这些测试中,利用AMPLab大数据基准测试比较了Spark SQL与Shark以及Impala的性能。基准测试包含四种类型的查询:扫描,聚合,连接和基于UDF的MapReduce作业。结果显示在所有查询中,Spark SQL比Shark快得多,与Impala相当。Catalyst优化器负责系能优化。Spark SQL在许多查询中与基于C++和LLVM的Impala引擎竞争。

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

性能秘诀:Catalyst优化器

为什么Spark SQL如此快速和优化?和前面提到的一样是因为使用了Catalyst优化器。

Catalyst是基于Scala的函数式编程结构,atalyst的核心是一个用于表示树和应用规则来实现操纵的通用库。在此框架之上,它具有特定于关系查询处理的库(表达式,逻辑查询计划),以及处理查询执行的不同阶段的若干规则集:分析,逻辑优化,物理规划和编译的代码生成Java字节码的部分。

Catalyst支持基于规则和基于成本的优化。此前已有的可扩展优化器,往往需要复杂的特定领域的的语言来指定规则。这会导致显着的学习曲线和维护问题。而Catalyst则使用了Scala编程语言的标准功能,例如模式匹配等,使开发人员使用编程语言就实现领域规则的制定。Catalyst的核心是一个用于表示树和应用规则来实现操纵的通用库。在此框架之上,它具有特定于关系查询处理的库(表达式,逻辑查询计划),以及处理查询执行的不同阶段的若干规则集:分析,逻辑优化,物理规划和编译的代码生成Java字节码的部分。限于篇幅此处我们不对其技术细节进行详述。

标签: #apachetilesiframe