如果您希望从分布式数据存储中查询数据,那么为什么不考虑将数据存储到Hbase中,这是一个构建在 Hadoop 和 HDFS 之上的分布式数据库。它在后台将数据存储到 HDFS 中,并提供类似于大型数据库的查询语义。在这种情况下,您不必担心向正确的数据节点发出查询。HBase 的查询语义(也称为 hadoop 数据库将负责相同的处理)。
为了方便查询并将数据存储到 Hbase 中,如果您的数据是时间序列数据,那么您还可以考虑使用OpenTSDB,它是 Hbase 的包装器,为您提供基于标签的简单查询语义,并与 GNUPlot 很好地集成,为您提供图表比如数据的可视化。
Hbase 非常适合对非常大的分布式数据存储进行随机读取/写入,但是,如果您的查询对批量写入/读取进行操作,Hive可能非常适合您的情况。与 Hbase 类似,它也构建在 Hadoop Map Reduce 和 HDFS 之上,并将每个查询转换为底层的 map-reduce 作业。Hive 最好的地方在于它提供了类似 SQL 的语义,并且您可以像在关系数据库上一样进行查询。就数据组织和 Hive 功能的基本介绍而言,您可能希望了解以下几点:
Hive 为存储在 HDFS 上的数据添加结构。表的模式存储在单独的元数据存储中。它将类似于 SQL 的语义转换为在后端的 HDFS 上运行的多个 map reduce 作业。
传统数据库遵循schema on write策略,一旦为表设计了schema,在写入数据本身时,会检查要写入的数据是否符合预定义的schema。如果不是,则拒绝写入。在 Hive 的情况下,情况正好相反。它在读取策略上使用模式。这两种政策都有各自的取舍。在写入模式的情况下,加载时间更长,加载速度更慢,因为在加载数据时会验证模式一致性。但是,它提供了更快的查询时间,因为它可以基于模式中的预定义列索引数据,但是可能存在在最初填充数据时无法指定索引的情况,这就是读取模式派上用场的地方。
Hive 非常适合批量访问,作为新更新的数据更新需要构建一个全新的表。此外,由于没有索引,查询时间比传统数据库慢。
Hive 将元数据存储到称为“Metastore”的关系数据库中。
Hive 中有 2 种表:
托管表 - 表的数据文件是预定义的,并被移动到 HDFS 上的 hive 仓库目录(通常,或任何其他 hadoop 文件系统)。当一个表被删除时,在这种情况下,元数据和数据都会从文件系统中删除。
外部表 - 在这里您可以懒惰地在表中创建数据。在这种情况下,没有数据移动到 Hive 仓库目录,并且模式/元数据与实际数据松散耦合。当一个表被删除时,只有元数据被删除,实际数据保持不变。如果您希望数据被多个数据库使用,它会很有帮助。使用相同的另一个原因可能是您需要在相同的基础数据上使用多个模式。