在当今的大数据技术世界中,人们很容易迷失方向。大数据技术种类繁多,似乎每天都有新的技术出现。然而,如此快速的发展仅仅是问题的一半。真正的问题在于,人们很难理解现有技术的功能和预期用途。
为了找到适合他们需求的技术,IT 经理经常对它们进行对比。我们还进行了一项学术研究,以明确区分 Apache Hive 和 Apache HBase 这两项重要的技术,它们经常用于 Hadoop 实施项目中。
数据模型比较
Apache Hive 的数据模型
要理解 Apache Hive 的数据模型,您应该熟悉它的三个主要组成部分:表(table)、分区(partition)和桶(bucket)。
Hive 的 表(table) 与关系数据库表没有太大区别(主要区别在于表之间没有关系)。Hive 的表可以是托管表(managed table)或外部表(external table)。为了理解这两种类型之间的区别,让我们看看加载数据(load data)和删除表(drop a table)操作。当您将数据加载到托管表(managed table)中时,您实际上是将数据从 Hadoop 分布式文件系统 (HDFS) 的内部数据结构移动到 Hive 目录(也在 HDFS 中)。当您删除这样的表时,您将从目录中删除它包含的数据。对于外部表(external table),Hive 不会将数据加载到 Hive 目录中,而是创建一个“幽灵表(ghost-table)”,指示实际数据在 HDFS 中的物理存储位置。因此,当您删除外部表时,数据不会受到影响。
托管表和外部表都可以进一步分解为分区(partitions)。分区表示基于分区键(partition key)分组在一起的表行。每个分区都作为 Hive 目录中的一个单独文件夹存储。例如,下表可以基于国家/地区进行分区,每个国家/地区的行将存储在一起。当然,这个例子是简化的。在现实生活中,您将处理超过三个分区,每个分区中的行数也远不止四个,分区将帮助您显着减少分区键查询执行时间。
Customer ID | Country | State/Province | City | Gender | Family status | … |
---|---|---|---|---|---|---|
00001 | US | Nebraska | Beatrice | F | Single | … |
00002 | Canada | Ontario | Toronto | F | Married | … |
00003 | Brasil | Para | Belem | M | Married | … |
00004 | Canada | Ontario | Toronto | M | Married | … |
00005 | US | Nebraska | Aurora | M | Single | … |
00006 | US | Arizona | Phoenix | F | Single | … |
00007 | US | Texas | Austin | F | Married | |
… | … | … | … | … |
您可以将数据进一步分解为桶(buckets),这样更易于管理,并能加快查询执行速度。让我们以前面示例中的美国数据分区为例,并根据 Customer ID 列将其聚类到桶中。当您指定桶的数量时,Hive 会将哈希函数应用于所选列,该函数会为分区中的每一行分配一个哈希值,然后将行“打包”到一定数量的桶中。因此,如果我们在分区中有 1000 万个 Customer ID,并将桶的数量指定为 50,则每个桶将包含大约 20 万行。因此,如果您需要查找有关特定客户的数据,Hive 将直接转到相关的桶以查找信息。
Apache HBase 的数据模型
HBase 也将数据存储在 表(tables) 中。HBase 表中的单元格按 行键(row keys) 和 列族(column families) 组织。每个列族都有一组存储属性(例如,行键加密和数据压缩规则)。此外,还有 列限定符(column qualifiers) 以简化数据管理。行键和列限定符都没有分配数据类型(它们始终被视为字节)。
Row key | Geography | Demographics | ||||
---|---|---|---|---|---|---|
Customer ID | Country | State | City | Gender | Family status | … |
00001 | US | Texas | Austin | F | Single | … |
00002 | Canada | Ontario | Toronto | F | Married | … |
00003 | Brasil | Para | Belem | M | Married | … |
00004 | Canada | Ontario | Toronto | M | Married | … |
00005 | US | Arizona | Phoenix | M | Single | … |
00006 | US | Nebraska | Aurora | F | Single | … |
00007 | US | Nebraska | Beatrice | F | Married | |
… | … | … | … |
每个 单元格(cell) 都有一个时间戳,或者换句话说,带有创建时间的标记。此信息在读取操作期间至关重要,因为它允许识别最新(因此也是最新)的数据版本。您可以在写入操作期间指定时间戳,否则,HBase 会自动为单元格提供当前时间戳。
表中的数据按行键进行字典序排序,为了将密切相关的数据存储在一起,开发人员需要设计一个良好的行键组成算法。
至于 分区(partitioning),HBase 会根据行键自动进行分区。不过,您可以通过更改每个分区的起始和结束行键来管理此过程。
关于数据模型的关键要点
- Hive 和 HBase 都能够以某种方式组织数据,以便快速访问所需数据并减少查询执行时间(尽管它们的分区方法不同)。
- Hive 和 HBase 都充当数据管理代理。当有人说 Hive 或 HBase 存储数据时,实际上意味着数据存储在数据存储中(通常在 HDFS 中)。这意味着您的 Hadoop 事业的成功不仅仅取决于技术选择,还强烈依赖于其他 重要因素,例如正确计算所需的集群大小以及无缝集成所有架构组件。
查询性能
Hive 作为分析查询引擎
Hive 专门设计用于支持数据分析。为了成功执行此任务,它使用其专用的 Hive 查询语言(Hive Query Language) (HiveQL),该语言与针对分析优化的 SQL 非常相似。
最初,Hive 将 HiveQL 查询转换为 Hadoop MapReduce 作业,从而简化了开发人员的生活,他们可以绕过更复杂的 MapReduce 代码。在 Hive 中运行查询通常需要一些时间,因为 Hive 会扫描所有可用的数据集(除非另有说明)。可以通过指定 Hive 必须处理的分区和桶来限制扫描数据量。无论如何,那是批处理。如今,Apache Hive 也能够将查询转换为 Apache Tez 或 Apache Spark 作业。
最早版本的 Hive 不提供 记录级更新、插入和删除,这是 Hive 最严重的限制之一。此功能仅在 0.14.0 版本中出现(尽管有一些 约束:例如,您的表的文件格式应为 ORC)。
HBase 作为支持查询的数据管理器
作为数据管理器,HBase 本身不适用于分析查询。它没有专用的查询语言。为了运行 CRUD(创建、读取、更新和删除)和搜索查询,它有一个基于 JRuby 的 shell,它提供了 简单的数据操作可能性,例如 Get、Put 和 Scan。对于前两个操作,您应该指定行键,而扫描操作则在整个行范围内运行。
HBase 的主要目的是为 HDFS 提供随机数据输入/输出。与此同时,可以肯定地说,HBase 通过实现一致的读取来促进快速分析。这之所以成为可能,是因为 HBase 将数据写入到一台服务器,而无需比较来自不同节点的多个数据版本。此外,HBase 非常擅长处理追加操作。 它也支持更新和删除,但处理这两个操作的效果不是那么完美。
索引
在 Hive 3.0.0 中,索引已被删除。在此之前,可以为列创建索引,但更快的查询的优势应该与写入操作期间索引的成本以及存储索引所需的额外空间进行权衡。无论如何,Hive 的数据模型及其将数据分组到桶(可以为任何列创建,而不仅仅是键列)的能力提供了一种类似于索引提供的方法。
HBase 支持多层索引。但是,您必须再次考虑获得读取查询响应与较慢的写入以及与存储索引相关的成本之间的权衡。
关于查询性能的关键要点
- 运行分析查询正是 Hive 的任务。HBase 的初始任务是摄取数据以及运行 CRUD 和搜索查询。
- 虽然 HBase 很好地处理了行级更新、删除和插入,但 Hive 社区正在努力消除这个障碍。
总结
Hive 和 HBase 之间有很多相似之处。两者都是数据管理代理,并且都与 HDFS 紧密相连。这两者之间的主要区别在于,HBase 专为执行 CRUD 和搜索查询而设计,而 Hive 则用于分析查询。这两种技术相辅相成,经常在 Hadoop 咨询项目中一起使用,以便企业可以充分利用这两种应用程序的优势。
评论已关闭。