8 个值得关注的 SQL-on-Hadoop 框架

  • 孙镜涛

2014 年 6 月 27 日

话题:语言 & 开发架构

数据的操作语言是 SQL,因此很多工具的开发目标自然就是能够在 Hadoop 上使用 SQL。这些工具有些只是在 MapReduce 之上做了简单的包装,有些则是在 HDFS 之上实现了完整的数据仓库,而有些则介于这两者之间。这样的工具有很多,来自于Shoutlet的软件开发工程师 Matthew Rathbone 最近发表了一篇文章,他列举了一些常用的工具并对各个工具的应用场景和未来进行了分析。

Apache Hive

Hive 是原始的 SQL-on-Hadoop 解决方案。它是一个开源的 Java 项目,能够将 SQL 转换成一系列可以在标准的 Hadoop TaskTrackers 上运行的 MapReduce 任务。Hive 通过一个 metastore(本身就是一个数据库)存储表模式、分区和位置以期提供像 MySQL 一样的功能。它支持大部分 MySQL 语法,同时使用相似的 database/table/view 约定组织数据集。Hive 提供了以下功能:

  • Hive-QL,一个类似于 SQL 的查询接口
  • 一个命令行客户端
  • 通过中央服务支持元数据共享
  • JDBC 驱动
  • 多语言 Apache Thrift 驱动
  • 一个用于创建自定义函数和转换的 Java API

何时使用它?

Hive是一个几乎所有的 Hadoop 机器都安装了的实用工具。Hive 环境很容易建立,不需要很多基础设施。鉴于它的使用成本很低,我们几乎没有理由将其拒之门外。

但是需要注意的是,Hive的查询性能通常很低,这是因为它会把 SQL 转换为运行得较慢的 MapReduce 任务。

Hive的未来

Hortonworks 目前正在推进Apache Tez 的开发以便于将其作为新的 Hive 后端解决现在因为使用 MapReduce 而导致的响应时间慢的问题。

Cloudera Impala

Impala 是一个针对 Hadoop 的开源的“交互式”SQL 查询引擎。它由Cloudera构建,后者是目前市场上最大的 Hadoop 供应商之一。和 Hive 一样,Impala 也提供了一种可以针对已有的Hadoop 数据编写 SQL 查询的方法。与 Hive 不同的是它并没有使用 MapReduce 执行查询,而是使用了自己的执行守护进程集合,这些进程需要与 Hadoop 数据节点安装在一起。Impala 提供了以下功能:

  • ANSI-92 SQL 语法支持
  • HIVE-QL 支持
  • 一个命令行客户端
  • ODBC 驱动
  • 与 Hive metastore 互操作以实现跨平台的模式共享
  • 一个用于创建函数和转换的 C++ API

何时使用它?

Impala 的设计目标是作为 Apache Hive 的一个补充,因此如果你需要比 Hive 更快的数据访问那么它可能是一个比较好的选择,特别是当你部署了一个 Cloudera、MapR 或者 Amazon Hadoop 集群的时候。但是,为了最大限度地发挥 Impala 的优势你需要将自己的数据存储为特定的文件格式(Parquet),这个转变可能会比较痛苦。另外,你还需要在集群上安装 Impala 守护进程,这意味着它会占用一部分 TaskTrackers 的资源。Impala 目前并不支持 YARN。

Impala的未来

Cloudera 已经开始尝试将 Impala 与 YARN 集成,这让我们在下一代 Hadoop 集群上做 Impala 开发的时候不再那么痛苦。

Presto

Presto 是一个用 Java 语言开发的、开源的“交互式”SQL 查询引擎。它由Facebook构建,即 Hive 最初的创建者。Presto 采用的方法类似于 Impala,即提供交互式体验的同时依然使用已有的存储在 Hadoop 上的数据集。它也需要安装在许多“节点”上,类似于 Impala。Presto 提供了以下功能:

  • ANSI-SQL 语法支持 (可能是 ANSI-92)
  • JDBC 驱动
  • 一个用于从已有数据源中读取数据的“连接器”集合。连接器包括:HDFS、Hive 和 Cassandra
  • 与 Hive metastore 交互以实现模式共享

何时使用它?

Presto 的目标和 Cloudera Impala 一样。但是与 Impala 不同的是它并没有被一个主要的供应商支持,所以很不幸你在使用Presto 的时候无法获得企业支持。但是有一些知名的、令人尊敬的技术公司已经在产品环境中使用它了,它大概是有社区的支持。与 Impala 相似的是,它的性能也依赖于特定的数据存储格式(RCFile)。老实地说,在部署 Presto 之前你需要仔细考虑自己是否有能力支持并调试 Presto,如果你对它的这些方面满意并且相信 Facebook 并不会遗弃开源版本的 Presto,那么使用它。

Shark

Shark 是由 UC Berkeley 大学使用 Scala 语言开发的一个开源 SQL 查询引擎。与 Impala 和 Presto 相似的是,它的设计目标是作为 Hive 的一个补充,同时在它自己的工作节点集合上执行查询而不是使用 MapReduce。与 Impala 和 Presto 不同的是 Shark 构建在已有的 Apache Spark数据处理引擎之上。Spark 现在非常流行,它的社区也在发展壮大。可以将 Spark 看作是一个比 MapReduce 更快的可选方案。Shark 提供了以下功能:

  • 类似于 SQL 的查询语言支持,支持大部分Hive-QL
  • 一个命令行客户端(基本上是 Hive 客户端)
  • 与 Hive metastore 交互以实现模式共享
  • 支持已有的 Hive 扩展,例如 UDFs 和 SerDes

何时使用它?

Shark 非常有趣,因为它既想支持 Hive 功能又想极力地改善性能。现在有很多组织正在使用Spark,但是不确定有多少在用 Shark。我并不认为它的性能能够赶上 Presto 和 Impala,但是如果你已经打算使用 Spark 那么可以尝试使用一下 Shark,特别是 Spark 正在被越来越多的主要供应商所支持。

Apache Drill

Apache Drill 是一个针对 Hadoop 的、开源的“交互式”SQL 查询引擎。Drill 现在由MapR推动,尽管他们现在也支持 Impala。Apache Drill 的目标与 Impala 和 Presto 相似——对大数据集进行快速的交互式查询,同时它也需要安装工作节点(drillbits)。不同的是 Drill 旨在支持多种后端存储(HDFS、HBase、MongoDB),同时它的一个重点是复杂的嵌套数据集(例如 JSON)。不幸的是 drill 现在仅在 Alpha 阶段,因此应用还不是很广泛。Drill 提供了以下功能:

  • ANSI SQL 兼容
  • 能够与一些后端存储和元数据存储交互(Hive、HBase、MongoDB)
  • UDFs 扩展框架、存储插件

何时使用它?

最好别用。该项目依然在 Alpha 阶段,因此不要在生产环境中使用它。

HAWQ

Hawq 是EMC Pivotal 公司的一个非开源产品,作为该公司专有 Hadoop 版本“Pivotal HD”的一部分提供。Pivotal 宣称 Hawq 是“世界上最快的 Hadoop SQL 引擎”,已经发展了 10 年。然而这种观点难以得到证实。很难知道 Hawq 到底提供了哪些特性,但是可以收集到下面这些:

  • 完整的 SQL 语法支持
  • 能够通过Pivotal Xtension框架(PXF与 Hive 和 HBase 互操作
  • 能够与 Pivotal GemFire XD(内存实时数据库)互操作

何时使用它?

如果你使用由 Pivotal 公司提供的 Hadoop 版本那么就使用它,否则不使用。

BigSQL

Big Blue 有它自己的 Hadoop 版本,称为Big Insights。BigSQL 作为该版本的一部分提供。BigSQL 用于使用 MapReduce 和其他能够提供低延迟结果的方法(不详)查询存储在 HDFS 中的数据。从 BigSQL 的文档中可以了解到它大概提供以下功能:

  • JDBC 和 ODBC 驱动
  • 广泛的 SQL 支持
  • 可能有一个命令行客户端

何时使用它?

如果你是 IBM 的客户那么就使用它,否则不使用。

Apache Phoenix

Apache Phoenix 是一个用于Apache HBase的开源 SQL 引擎。它的目标是通过一个嵌入的 JDBC 驱动对存储在 HBase 中的数据提供低延迟查询。与之前介绍的其他引擎不同的是,Phoenix 提供了 HBase 数据的读、写操作。它的功能有:

  • 一个 JDBC 驱动
  • 一个命令行客户端
  • 批量加载数据的机制
  • 能够创建新表,或者映射到已有的 HBase 数据

何时使用它?

如果你使用 HBase 那么就使用它。尽管 Hive 能够从 HBase 中读取数据,但是 Phoenix 还提供了写入功能。不清楚它是否适合产品环境和事务,但是作为一个分析工具它的功能无疑足够强大。

Apache Tajo

Apache Tajo 项目的目的是在 HDFS 之上构建一个先进的数据仓库系统。Tajo 将自己标榜为一个“大数据仓库”,但是它好像和之前介绍的那些低延迟查询引擎类似。虽然它支持外部表和 Hive 数据集(通过HCatalog),但是它的重点是数据管理,提供低延迟的数据访问,以及为更传统的 ETL 提供工具。它也需要在数据节点上部署 Tajo 特定的工作进程。Tajo 的功能包括:

  • ANSI SQL 兼容
  • JDBC 驱动
  • 集成 Hive metastore 能够访问 Hive 数据集
  • 一个命令行客户端
  • 一个自定义函数 API

何时使用它?

虽然 Tajo 的一些基准测试结果非常漂亮,但是基准测试可能会有一些偏见,不能对其完全信任 。Tajo 社区现在也不够繁荣,在北美也没有主要的 Hadoop 供应商支持它。但是如果你在南韩,Gruter 是主要的项目赞助者,如果你使用他们的平台那么可能会得到他们良好的支持,否则的话最好还是使用 Impala 或者 Presto 这些引擎。


感谢郭蕾对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

语言 & 开发架构