首页 理论教育大数据上构建SQL引擎:分布式数据库技术

大数据上构建SQL引擎:分布式数据库技术

【摘要】:图18.8传统数据库上的SQL引擎传统数据库上的SQL引擎如图18.8所示。数据修改成为HDFS的固有局限。简单来说,SQL大数据引擎必须应对这些挑战。概括起来,大数据上的SQL引擎主要包含四种不同的方案。这种Hadoop引擎上的SQL优势在于执行特定SQL查询和实施数据调查与发现,可以直接用于数据分析,在BI工具上自动生成SQL代码。图18.9在Hadoop上构建SQL引擎的方法3.减少SQL查询延迟的方法数据规模和I/O开销越大,查询所需要花费的时间越长。

图18.8 传统数据库上的SQL引擎

传统数据库上的SQL引擎如图18.8所示。其中,查询处理器用来分析用户请求(查询),通过查阅数据字典验证语义,进行优化,生成优化后的执行计划。存储引擎按执行计划存取数据。

目前使用最广的RDBMS往往运行在SMP的体系架构上。SMP的体系架构包括多个处理器,每个CPU有自己的存储引擎,内存和I/O则为每个CPU共享。SMP的体系架构很难应对数据仓库应用所需的大量数据迁移和处理大量数据的负载。原因主要是数据需要在计算机背板和I/O通道上移动。

SQL引擎也可工作在分析数据库上。分析数据库用于数据仓库和商务智能(BI)应用方面,支持低延迟的负载分析查询。这时会使用MPP体系架构,如Teradata数据仓库,但是这种架构解决方案价格昂贵、可伸缩性差。

1.对HDFS而言为什么DML难以实现

HDFS是目前处理大数据常用的工具,但是其体系架构主要支持只读运算,即WORM(write once read many)。HDFS支持数据添加,但不支持数据更新。数据修改成为HDFS的固有局限。因此大多数SQL解决方案不支持Hadoop上的DML操作。有些供应商通过使用日志记录更新请求,然后选择适当时机合并修改请求,将归并后的修改实施到原始数据上。

经验告诉我们,关系型数据库在面对超越一定数据集大小的时候,鉴于性能和可伸缩性的缘故,能力受到了限制。有一些技术,如数据的人工分片与分割(sharding and partitioning),可以用来解决这个问题。尽管如此,问题还没真正解决。分布式系统的主要挑战是如何在集群上让分布连接能延迟实现。要解决这个问题,需让数据在网络上高速迁移,达到很快的速度和高的吞吐能力。

减少在通信链路上迁来迁去的数据量是一个重要挑战。开发出适应各种数据集(特别是半结构化数据)上的可伸缩算法,从而实现和结构化数据上一样的SQL性能是一个挑战。为了适应日益增长的数据集大小,已经使用了各种不同的技术,压缩或格式化数据可使数据存取开销最小。

简单来说,SQL大数据引擎必须应对这些挑战。

Hadoop上的第一个SQL引擎是Hive,由Facebook于2009年开发。Hive在Hadoop上实现低延迟SQL,但有固有的局限性。这主要是由于Hive采用的体系架构将SQL查询转换为Map Reduce这种面向批处理的系统。复杂的SQL查询需要多轮Map Reduce过程,而每轮结束需要将临时数据写入磁盘,下一轮又要从磁盘读出数据以便进一步处理。数据随着磁盘I/O在网络里传来传去,导致系统速度变慢。

显然,Map Reduce并非为适应优化很长的数据流水线而设计的。

2.大数据上的SQL解决方案

解决大数据上SQL的负载问题,有几种解决方案,例如,面向批处理负载的SQL、面向交互处理负载的SQL和面向流负载的SQL等。

概括起来,大数据上的SQL引擎主要包含四种不同的方案。

(1)构建一个翻译层,将SQL查询翻译成等价的MapReduce代码,执行在计算集群。

Hive就是这种解决方案的样例,它是面向批处理负载的SQL解决方案。它使用Map Reduce和Apache Tez[6]作为中间层。中间层运行针对海量数据集的复杂作业,包括ETL和生成数据“流水线”(见图18.9(c))。

(2)借助现存关系型引擎,并结合40多年的研究和开发成果,包括所有的存储引擎和查询优化技术等,使之更强壮(见图18.9(d))。

假设将MySQL/Postgres嵌入Hadoop集群的每个数据节点,构造一个软件层次,在这个层次底下的分布式文件系统中存取数据。这种RDBMS引擎与数据节点配合,再与数据节点通信并从HDFS读数据,将之翻译成符合自己的数据格式。

(3)构建新的查询引擎,与数据节点共处在同一个计算节点,在HDFS数据上工作并直接执行SQL查询。这种查询引擎使用查询分离器(query splitter)将查询分割成一个或几个底层的数据处理器(handlers)(如HDFS、HBase、关系数据引擎、索引擎等),存取和处理数据(见图18.9(b))。

Drill[7]和Impala[8]是可以在HDFS上实现交互SQL查询。这种Hadoop引擎上的SQL优势在于执行特定SQL查询和实施数据调查与发现,可以直接用于数据分析,在BI工具上自动生成SQL代码。

(4)使用现有的分析数据库(部署在与Hadoop集群不同的集群上),与Hadoop集群上的节点交互,使用专用的连接器(proprietary connector)从HDFS获取数据,但在分析引擎上执行SQL查询。这类外部分析引擎可以集成起来,使用Hive或HCatalog[9]里的元数据可以在HDFS数据上无缝工作。典型产品如Teradata(见图18.9(a))。

图18.9 在Hadoop上构建SQL引擎的方法

3.减少SQL查询延迟的方法

数据规模和I/O开销越大,查询所需要花费的时间越长。许多研究和发明聚焦于存储层实现优化,减小数据集的规模。

可从以下三个方面来改进性能。

●写性能:如何使写数据变得很快。(www.chuimin.cn)

●部分读性能:如何使读数据集里的某些列变得很快。

●完整读性能:如何使读数据集里的每个列变得很快。

不同格式的数据差异很大。为大数据选择最佳的数据格式,本质上可以改进查询处理的性能。下面讨论一些数据格式。

1)Text/CSV文件

逗号分割值(comma-separated values,CSV)文件不支持块压缩,这样,Hadoop中的CSV文件常有重要的读性能开销问题。CSV文件不存储元数据,使用时必须知道文件是如何写进去的,模式演化的支持有限。

2)JSON[10]记录

不像CSV文件,JSON在数据里存储元数据,支持模式演化。与CSV文件一样,JSON文件不支持块压缩。

3)Avro[11]格式

Avro格式在数据里存储元数据,允许指定独立的模式,以便读该文件。Avro格式支持的索引,可以定义新的独立模式让用户重新命名、添加、删除和修改字段的数据类型,也可分解Avro文件和支持块压缩。

4)顺序文件

顺序文件(sequence files)使用二进制格式存储数据,其结构和CSV文件的结构相似。顺序文件不在数据里存储元数据,因此,唯一的模式演化选项是添加新字段。顺序文件不支持块压缩。

5)RC文件

RC(record columnar)文件是Hadoop里的第一个列式文件格式。RC文件的优势是压缩和查询性能。写RC文件需要的存储和计算开销大于非列式文件,写起来一般也慢。

6)ORC文件

ORC(optimized RC)文件的发明优化了Hive中的性能,其压缩性能优于RC文件的,查询速度更快,但不支持模式演化。

7)Parquet文件

Parquet也是Hadoop中一种列式存储格式,允许压缩,以改进查询性能。与RC文件和ORC文件不同,这种文件的格式支持有限的模式演化。可以将新的列添加到已有的Parquet格式里。

每种格式适合不同的情况。格式的选择要考虑使用方式、环境和负载情况。

●Hadoop分布。

●模式演化(schema evolution):数据结构是否随着时间的变化而变化。

●处理需求(processing requirements):考虑数据的负载和所用的工具。

●读/写需求(read/write requirements):读/写方式是只读、读/写还是只写。

●抽取需求(exporting/extraction requirements):是否从Hadoop抽取数据输入到外部数据库引擎或其他平台?

●存储需求(storage requirements):数据量是否是一个重要因素?

数据压缩是否对存储十分重要?

对于Map Reduce作业的中间数据来说,顺序文件是一种好的解决方案。ORC(Hortonworks/Hive)或Parquet(Cloudera/Impala)不错,但它们创建时间较长,也不能更新。

如果模式随时可能变化,Avro是一种好的选择,但是查询性能不如ORC或Parquet。当从Hadoop抽取数据到数据库时,CSV文件很不错。