Big SQL 有何重要意义?

向关系 DBMS 用户介绍 IBM 用于 Hadoop 的 SQL 技术

如果您专门研究过关系数据库管理技术,那么您或许听到过 “大数据” 和开源 Apache Hadoop 项目的许多信息。或许您还听说过 IBM 提供的新的 Big SQL 技术,该技术使 InfoSphere® BigInsights™ 用户能够使用行业标准的 SQL 查询 Hadoop 数据。本文将介绍 Big SQL,回答关系 DBMS 用户拥有的许多关于这项 IBM 技术的常见问题。

Cynthia M. Saracco, 高级软件工程师, IBM

照片:Cynthia SaraccoCynthia M. Saracco 是 IBM 硅谷实验室的一名高级解决方案架构师,专门研究新兴技术和信息管理。她拥有超过 25 年的软件行业经验,编写了 3 部图书和 70 多篇科技论文,拥有 7 项专利。


developerWorks 大师作者

Uttam Jain, 软件架构师, IBM

Uttam JainUttam Jain 是 IBM 硅谷实验室的一位软件架构师。在参与构建 Big SQL 之前,他参与 DB2 for Linux, UNIX, and Windows 编译器、运行时和存储/内核领域的研究已有 12 年。他目前的研究兴趣在于分布式系统和查询优化。



2013 年 7 月 29 日

大数据:它对分析和管理信息的 IT 专业人员非常有用。但一些专业人员很难理解如何使用大数据,因为最流行的大数据平台之一 Apache Hadoop 带来了大量新技术,包括新的查询和脚本语言。

Big SQL 是 IBM 的基于 Hadoop 的平台 InfoSphere BigInsights 的 SQL 接口。Big SQL 旨在让 SQL 开发人员能够轻松地掌握对 Hadoop 管理的数据的查询。它使数据管理员能够为 Hive、HBase 或他们的 BigInsights 分布式文件系统中存储的数据创建新表。此外,LOAD 命令使管理员能够在 Big SQL 表中填入来自各种来源的数据。而且 Big SQL 的 JDBC 和 ODBC 驱动程序使许多现有的工具可使用 Big SQL 查询分布式数据。

不过,Big SQL 并没有将 Hadoop 转变为一种大型的分布式关系数据库。如果您想知道 Big SQL 能够做什么,我们在这里将介绍它的基本知识,并尝试澄清一些常见的误解,还会回答关系 DBMS 用户常常遇见的关于这项新技术的许多问题。

Big SQL 概述

Big SQL 是一个软件层,使 IT 专业人员可使用熟悉的 SQL 语句在 BigInsights 中创建表和查询数据。为此,程序员将会使用标准的 SQL 语法,并在某些情况下使用 IBM 创建的 SQL 扩展,使得利用某些基于 Hadoop 的技术变得非常轻松。稍后我们会更详细地介绍这些主题。

为了让您了解 Big SQL 到底是什么,图 1 给出了它的架构,并介绍了如何将它融入 BigInsights Enterprise Edition 2.1 平台中。(如果您不熟悉 BigInsights,请参阅 参考资料 一节中列出的介绍性文章。)

图 1. Big SQL 架构
该图显示了 Big SQL 架构

如顶部所示,Big SQL 支持来自 Linux® 和 Windows® 平台的 JDBC 和 ODBC 客户端访问。此外,Big SQL LOAD 命令可直接从多种关系 DBMS 系统(受 Netezza 技术支持的 IBM PureData™ Systems for Analytics、DB2® 和 Teradata)以及存储在本地或 BigInsights 分布式文件系统中的文件读取数据。BigInsights EE 2.1 可配置为支持 Hadoop Distributed File System (HDFS) 或 IBM 的 General Parallel File System with the File Placement Optimizer (GPFS-FPO)。

SQL 查询引擎支持连接、联合、分组、常见的表表达式、窗口函数,以及其他熟悉的 SQL 表达式。此外,通过优化提示和配置选项,您还可以改变数据访问策略。根据查询的性质、数据量和其他因素,Big SQL 可以使用 Hadoop 的 MapReduce 框架并行处理各种查询任务,或者在单个节点上的 Big SQL 服务器上本地执行您的查询,无论哪种方式最适合您的查询。

对 Big SQL 感兴趣的组织通常在内部拥有丰富的 SQL 技能,以及一个基于 SQL 的商业智能应用程序和查询/报告工具套件。对于不熟悉 Hadoop 的组织而言,能够利用现有技能和工具(并且可能重用部分现有应用程序)的概念可能非常有吸引力。确实如此,一些拥有构建于 DBMS 系统之上的大型数据仓库的公司正在寻找基于 Hadoop 的平台,使用该平台作为卸载 “冷的” 或不常用数据的潜在目标,同时仍然支持查询访问。在其他情况下,组织会依靠 Hadoop 来分析和过滤非传统数据(比如日志、传感器数据、社交媒体帖子等),最终将此信息的子集或集合提供给他们的关系仓库,以扩充其产品、客户或服务视图。

在这些和其他一些情况下,Big SQL 可能发挥着重要作用。但是,认为 Big SQL 会取代关系 DBMS 技术是不恰当的。Big SQL 旨在为基于 Hadoop 的基础架构提供补充并在 BigInsights 中利用该架构。关系 DBMS 系统的一些常见特性在 Big SQL 中并不存在,而且一些 Big SQL 特性在大多数关系 DBMS 系统中都不存在。例如,Big SQL 支持查询数据,但不支持 SQL UPDATEDELETE 语句。INSERT 语句仅支持用于 HBase 表。Big SQL 表可能包含具有复杂数据类型的列,比如 structarray,而不是简单的 “扁平” 行。而且还支持一些基础存储机制,包括:

  • 存储在 HDFS 或 GPFS-FPO 中的分割文件(比如逗号分隔文件)
  • 顺序文件格式、RCFile 格式等格式的 Hive 表。(Hive 是 Hadoop 的数据仓库实现)
  • HBase 表(HBase 是 Hadoop 的基于键值或基于列的数据存储)

我们更详细分析一下 Big SQL,以便更深入地了解它的功能。


使用 Big SQL

BigInsights 包括一些用于 Big SQL 的工具和接口,它们与您在大多数关系 DBMS 系统中找到的工具和接口非常相似。前面已经提到,Big SQL 通过一个 JDBC Type 4 驱动程序或一个 32 位或 64 位 ODBC 驱动程序,为 Java™ 技术、C 和 C++ 应用程序开发人员提供 JDBC 和 ODBC 支持。这些 Big SQL 驱动程序包含对流行功能的支持,比如预处理语句、数据库元数据 API 和对正在运行的语句的取消。

此外,BigInsights Eclipse 插件还使得 Java 开发人员能够创建、测试和细化 Big SQL 查询和应用程序。图 2 给出了此插件的一些方面,包括一个针对 Big SQL 的 JDBC 服务器连接(可在前台找到)和一次 Big SQL 测试运行的结果(显示在右下角的窗格中)。

图 2. BigInsights Eclipse 插件包含对 Big SQL 开发的支持
该图表明 BigInsights Eclipse 插件包含对 Big SQL 开发的支持

对于 Big SQL 查询的交互式调用,BigInsights 提供了一个命令行接口(JSqsh shell)和一个基于 Web 的接口(通过 BigInsights Web 控制台访问)。这些工具对编写活动脚本和设计工作原型非常有用。

各种支持 JDBC 和 ODBC 数据源的 IBM 和非 IBM 软件也可以配置为使用 Big SQL。这方面的一个示例包括:Cognos Business Intelligence 使用 Big SQL 的 JDBC 接口来查询数据,生成报告,并执行其他分析功能。

像 BigInsights 中的其他许多组件一样,Big SQL 是一种服务,管理员可在需要时通过 Web 控制台或命令窗口启动(或停止)它。


创建表和加载数据

可以想象,要使用 Big SQL,则需要有人创建表并填入数据。而且,您可能已经想到,Big SQL 支持使用 CREATE TABLE 语句和 LOAD 命令来完成此任务。尽管这些操作的基本语法在您看来或许非常熟悉,但您对表创建和数据加载的某些方面可能并不熟悉。这是因为它们是为利用某些基于 Hadoop 的技术而设计的。

请考虑 清单 1 中所示的例子。(如果熟悉 Cognos Business Intelligence 10.2 提供的示例 GOSALES 数据仓库数据库,您就会发现这个示例是它的一个表的简化版本。参见 参考资料,获取 Cognos 数据库示例的详细信息的链接。)

清单 1. 创建一个 Big SQL 表并向其中加载来自本地文件的数据
create table mygosales.product_brand_lookup (
product_brand_code int,
product_brand_en varchar(180)
)
row format delimited fields terminated by '\t';

load hive data local inpath '/home/user1/data/product.tsv'
overwrite into table mygosales.product_brand_lookup;

CREATE TABLE 语句创建一个包含两列的 Hive 表;第一列捕获一个数字代码,将它用作产品品牌的标识符,第二列捕获该品牌的一段英文描述。此语句的最后一行指定了该数据将用来存储(和想要的)输入数据的格式:以包含制表符分隔的字段的行格式。(顺便说一下,Big SQL 会与 Hive 和表定义共享其目录。所以,当我们使用词汇 “Hive 表” 时,我们指的是一个 Big SQL 表。除了一些例外情况之外,通过 Big SQL 创建的表可由 Hive 查询,反之亦然。)

清单 1 给出了 Big SQL 表的多个可能存储选项中的一个。例如,您可以创建一个外部管理的 Hive 表,其中的数据将位于分布式文件系统中的一个 Hive 数据库的外部。因此,丢弃这样一个来自 Big SQL 的表仅会删除元数据,而不是实际数据。或者您可使用 HBase 作为基础存储管理器,在此情况下您的 CREATE TABLE 语句将包含在 SQL 列与 HBase 列之间建立映射的语法,包括列族和一个行键。如果不熟悉 Hive 或 HBase,请参见 参考资料

我们快速看看 清单 1 中的 LOAD 语句。这里,我们提供了本地文件系统中我们希望加载到表中的一个文件的完整路径。给定我们的表定义,此文件中的每个记录必须包含两个由 \t(制表符)分隔的字段(一个整数和一个字符串)。OVERWRITE 子句告诉 Big SQL 将表的内容替换为文件中包含的数据。尽管 清单 1 中未显示,如果该数据已存在于您的 BigInsights 分布式文件系统中,您可消除将数据加载到表中的需求。为此,需要创建一个外部表,其中包含一个 LOCATION 子句指定现有的数据所在的位置。

此外,有一些创建表和加载数据的选项会影响数据库设计和应用程序用法。例如,基于 Hadoop 的系统常常用于存储各种类型的半结构化数据,比如 JSON 数据。直接使用 Hive 的开发人员常常依靠自定义的序列化器和去序列化器 (SerDes) 来读取和写入此数据。因此,Big SQL 还支持自定义 SerDes,支持您在创建时为表指定需要的 SerDe 类名。

InfoSphere BigInsights Quick Start 版

InfoSphere BigInsights 是 IBM 基于开源 Apache Hadoop 项目的大数据产品。它包含核心 Hadoop(Hadoop Distributed File System、MapReduce)和 Hadoop 生态系统中的多个其他项目,比如 Pig、Hive、HBase 和 ZooKeeper。此外,BigInsights 包含各种各样扩展了此平台的价值的 IBM 技术,包括高级分析工具、应用程序加速器、开发工具、平台改进和企业软件集成。许多这些功能都已在 Quick Start 版中提供,您可以免费下载此版本用于非生产用途。了解更多信息试用

关系 DBMS 系统中许多通用的数据类型都受 Big SQL 支持,包括 Hive 或 HBase 无法直接支持的一些数据类型。Big SQL 数据类型包含各种数字格式(比如整数、小数、浮点和双精度)、字符串数据(CHAR(length)、VARCHAR(length)STRING)和 TIMESTAMP。其他日期/时间数据格式应存储为 TIMESTAMP 值或字符串类型。不支持大对象和 VARGRAPHIC 类型。

此版本不支持视图和用户定义的约束,这二者在关系数据库中很常见。参照完整性约束和特定于域的约束应在应用程序级别上执行。无需使用 GRANTREVOKE 语句来限制数据访问,管理员可使用标准的 Hadoop 命令指定 Hive 数据的文件系统访问特权。因此,应在表级别上考虑特权,而不是在行或列级别上。

这些对经验丰富的关系数据库管理员或设计人员意味着什么?如果您打算在 Hadoop 中创建一个简单的测试数据库,那么可以使用 Big SQL 轻松完成。诚然,BigInsights 的 Quick Start 版包含创建一个 GOSALES 数据仓库数据库版本的脚本和分步教程(参见 参考资料)。但是,在 BigInsights 中设计生产数据库意味着您需要理解某些基于 Hadoop 的技术,以便能够以适合该平台的方式实现您的设计。


查询数据

定义了至少一个 Big SQL 表后,您可使用按照 SQL 标准语法来查询它。Big SQL 支持预测、限制、连接、联合、排序和分组数据的 SELECT 语句。子查询和常见的表表达式(以 WITH 子句开头的查询)也受到支持。Big SQL 提供了数十个内置的函数,包括一些专用于实现 Hive 兼容性的函数。它还支持窗口函数。如果需要,SQL 程序员还可以限制某个给定查询返回的行数。

清单 2 给出了一个连接来自 4 个 Big SQL 表的查询,得到一个包含 3 列的结果集并将返回的行数限制为 50。

清单 2. Big SQL 连接查询示例
SELECT pnumb.product_name, sales.quantity,
  meth.order_method_en
FROM
  gosalesdw.sls_sales_fact sales,
  gosalesdw.sls_product_dim prod,
  gosalesdw.sls_product_lookup pnumb,
  gosalesdw.sls_order_method_dim meth
WHERE
  pnumb.product_language='EN'
  AND sales.product_key=prod.product_key
  AND prod.product_number=pnumb.product_number
AND meth.order_method_key=sales.order_method_key
LIMIT 50;

前面已经提到过,Big SQL 支持复杂的数据类型,比如 arraystruct。或许您想知道如何查询包含这些类型的列的表。我们使用 清单 3 中的示例稍微分析一下如何这么做。

首先,清单 3 创建一个包含 3 列的 EMPLOYEES 表,其中 2 列基于复杂的数据类型。PHONE 列存储一个电话号码数组,而 ADDRESS 列存储一个包含 4 个字段的结构,这 4 个字段组成一个美国邮件地址,包括街道名称、城市名称、州名称和邮政编码。使用冒号 (:) 分隔 PHONE 和 ADDRESS 列中的各项。

加载一些示例数据后(显示为清单中的一条注释),Big SQL 用户可使用针对 PHONE 数据的简单数组表示法和针对 ADDRESS 数组的路径表达式来查询此数据。清单 3 中最后一条语句获取所有员工的姓名、第一个电话号码和 ZIP 编码。

清单 3. 使用复杂的数据类型
CREATE TABLE employees
(
  name VARCHAR(100),
  phones ARRAY<VARCHAR(12)>,
  address STRUCT<street:VARCHAR(100), city:VARCHAR(100), state:VARCHAR(2), zip:VARCHAR(5)>
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY ':';

/*
 table data :
Uttam,408-111-1111:408-222-2222,555 Bailey Ave:San Jose:CA:95141
Cindy,408-333-3333:408-444-4444,555 Bailey Ave:San Jose:CA:95141
*/

LOAD... ;

SELECT name, phones[1], address.zip FROM employees;

您可能已想象到,我们无法在这里介绍所有的 Big SQL 查询功能。有关的详细信息,请参阅 BigInsights 信息中心(参见 参考资料)。但是,我们稍后将讨论的一个查询主题包含一些查询优化提示。

现在让我们后退一步,看看 Big SQL 的其他一些方面。前面已经提到,BigInsights 2.1 中不支持 SQL UPDATEDELETE 语句,而且 INSERT 操作仅支持用于 HBase 表。要填充 Big SQL 表,您可直接从支持的关系 DBMS 系统或从文件加载数据。此外,也可发出 CREATE TABLE AS . . . . SELECT FROM . . . 语句,基于 Big SQL 查询结果集来创建新表。

传统事务管理不是 Hadoop 生态系统的一部分,所以 Big SQL 的运行未涉及到事务或锁管理。这表明提交和回滚操作不受支持,而且一些并发操作可能导致应用程序或查询错误。(例如,如果有人对一个正在被查询的表发出一条 LOAD . . . OVERWRITE 命令,查询将收到一条异常。)


性能考虑因素

因为在使用信息管理系统时,性能常常是一个关注点,所以我们将简略讨论一下 Big SQL 的一些性能考虑因素。Big SQL 将一个查询的执行分解为多个部分,比如连接、group-by 等。依赖于具体的查询、数据量、配置设置和其他因素,Big SQL 可顺序或并行执行这些部分。并行性是通过利用 Hadoop 的 MapReduce 框架来实现的。您可能已经想到,单个查询可能生成多个 MapReduce 作业。MapReduce 框架使用多个映射器或缩减程序 (reducer) 并行执行每个作业(任务)。这可能对针对大型数据集的复杂查询很有帮助。

但是,启动一个 MapReduce 作业涉及到一定量的处理开销。对于某些类型的查询,此开销可能超出并行处理的好处,比如助力小数据集或获取与一个特定 HBase 行键关联的数据的查询。在这些情况下,查询最好在单个节点上顺序执行。这有时称为 “本地” 查询执行,Big SQL 除了支持 MapReduce 并行性之外也支持此能力。

商用的关系 DBMS 系统采用了复杂的基于成本的优化器,参考与表大小、数据失真等相关的广泛统计信息,为它们的查询选择一种高效的数据访问策略。Big SQL 的查询优化器还会动态地参考某些统计信息来确定一种高效的数据访问策略。但是,在一些情况下,Big SQL 可能没有足够的统计信息可用。例如,它的基础数据源可能未提供这些信息。在这些情况下, Big SQL 程序员将优化提示嵌入其查询中可能有所帮助,因为这么做可使 Big SQL 生成更好的执行计划。提示可与查询执行模式(本地或并行)、连接方法、索引使用等相关。在 Big SQL 中,查询提示采用 /*+ name=value[, name=value ..] +*/ 的形式。

考虑 清单 4 中所示的查询,它将一个事实表 (FACT) 和一个维度表 (DIM) 相连接。请注意,维度表中关注的行数也存在限制。考虑到维度表通常比事实表小得多,而且我们的查询仅对维度表的一个行子集感兴趣,所以向 Big SQL 提供一条提示来表明维度表 “很小”,对我们而言,这是一种明智之举。当我们在 FROM 子句中应用该表后,此提示会立即出现。提供此提示可帮助 Big SQL 为此查询选择一种合适的连接方法,其中合格的行会转入内存中,与来自事实表的数据相连接。

清单 4. 在查询中嵌入一条提示
select * from fact, dim /*+ tablesize='small' +*/ 
where dim.dim_id = fact.dim_id
and dim.id < 100;

我们前面提到了索引,那么让我们简单地讨论一下。Big SQL 支持使用 CREATE INDEX 语句为 HBase 创建辅助索引。可以想象,这些索引可改进在加入索引的列上进行过滤的查询的运行时性能。HBase 索引可能基于单个键或复合键,使用 Big SQL 将数据插入 HBase 表中或将来自一个文件的数据加载到 HBase 表中会自动更新它的索引。但是,在 BigInsights 2.1 中,将来自远程关系数据库的数据加载到 HBase 表中不会自动更新表的辅助索引。相反,管理员需要丢弃并重新创建必要的索引。

在 Hadoop 中,程序员或管理员常常修改作业属性以调优运行时性能。尽管 Big SQL 会尝试选择最优的属性,如果需要的话,您可在服务器或查询级别上忽略这些属性。例如,清单 5 中的第一条语句修改了某个给定查询连接的一个特定的 MapReduce 作业属性。它指定每个后续查询为每 100 MB 表数据使用一个缩减任务。在清单的后面,该设置被忽略,这导致对该连接的后续查询为每 200 MB 表数据使用一个缩减任务。

清单 5. 设置一个 MapReduce 作业属性
SET bigsql.reducers.byte.per.reducer = 104857600;
-- All the MapReduce jobs spawned by all future queries
-- in this connection will use 1 reducer per 100MB of table data

SELECT …. ;

SET bigsql.reducers.byte.per.reducer = 209715200;
-- Now all the MapReduce jobs spawned by all future queries
-- in this connection will use 1 reducer per 200MB of table data

SELECT …. ;

结束语

Big SQL 为 IBM 基于 Hadoop 的平台带来了一个行业标准查询接口:InfoSphere BigInsights。尽管 Big SQL 未将 BigInsights 转变为一个关系 DBMS,但它确实为经验丰富的 SQL 用户提供了一种熟悉的方式来利用越来越流行的大数据分析和存储环境。

在本文中,我们介绍了 Big SQL 的基础知识,重点介绍了 BigInsights(和它的 Big SQL 支持)不同于传统的关系 DBMS 的一些领域。如果想了解有关的更多信息,可下载 BigInsights 的 Quick Start 版,参阅该产品的信息中心所提供的 “开发 Big SQL 查询来分析大数据” 教程,或者参阅 InfoSphere BigInsights 教程集合中的教程(参见 参考资料)。


致谢

感谢以下人员为本文提供材料或帮助审阅本文(按字母顺序排名):Bruce Brown、Seeling Cheung、Scott Gray、Mark Hager、Ellen Patterson 和 Bert Van der Linden。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=938982
ArticleTitle=Big SQL 有何重要意义?
publish-date=07292013