【问题标题】:Hive or HBase or any other option?Hive 或 HBase 或任何其他选项?
【发布时间】:2016-10-15 22:24:56
【问题描述】:

现在我收到了这个问题,可能需要人们提供一些意见。

我有一个传统的 rdbms(例如 sql server)存储每天更新的数据。我想利用 Hadoop 生态系统,所以第一步可能是将数据从我们的 rdbms 导出到 Hadoop 数据存储。我还想对数据存储进行增量更新,可能是每晚。我不确定该使用哪一个。

当我们考虑增量更新时,Hive 似乎不是正确的选择(如果这个假设不正确,请纠正我),那么 HBase 或任何其他合适的选择呢?

【问题讨论】:

  • 像 impala 这样的选项是特定于平台的。我建议你做一个 POC 并找出最适合你的。请查看我的更新答案。

标签: database hadoop hive hbase hdfs


【解决方案1】:

Hadoop 生态系统包括一个名为 Sqoop 的工具,旨在解决您所描述的问题:将数据从 RDBMS 拉入 Hadoop。它支持几种进行增量更新的方法。它需要 JBDC 或 JNDI 连接到您的数据库,并且对于某些数据库能够使用高性能选项。它是 Hadoop 中更好的工具之一。

当我说“进入 Hadoop”时,这可能意味着几件事,但通常是 a) 作为存储在 Hadoop 分布式文件系统 (HDFS) 上的一组文件,或 b) 存储在 hBase 中的数据。从技术上讲,hBase 只是在 HDFS 上存储文件的另一种方式。

Hive 是 HDFS 之上的一个层,它允许您将导出到 HDFS 文件的 RDBMS 表视为仍在 SQL Server 数据库中。嗯,有点。 Hive 可以使用类似 SQL 的语言查询多种文件格式。

HDFS 有一个您需要了解的特殊挑战:无法像常规数据库中那样更新行。 HDFS 文件是“一次写入多次读取”的设计。通常,您可以将一个数据集沿某个自然分区分割成多个文件,这样如果您确实需要更新一条记录,您只需重写与该分区关联的文件——年+月是一种常见的分区方案。

因此,如果您正在 Sqoop'ing 一个其记录永远不会更改的数据库,那么您可以简单地附加到您的 HDFS 文件。这对于事务、日志或其他类似的数据来说很好,因为它通常永远不会改变。但是更新的记录(例如客户姓名或电子邮件)会使问题变得更加困难。

hBase 通过透明地管理现有记录的更新,消除了这种 HDFS 限制。但是 hBase 是一个键值存储数据库;键可能是您的 RDBMS 的主键,值需要是记录的其余部分。这并不可怕,但它可能很麻烦。

我相信 Hive 上的最新版本(或者可能与 Hive 功能相似的 Impala)允许更新,同时仍以更灵活的格式存储数据。

所以 Sqoop 是您想要的工具,但请仔细考虑一旦数据进入 Hadoop 后您将要如何处理这些数据 - 这是一个非常非常不同的东西,而不仅仅是一个可以变得非常大的数据库。

【讨论】:

    【解决方案2】:

    1)数据摄取:可以考虑SQOOP

    2) 增量更新:

    您可以使用 hbase 进行增量更新,使用 hive 外部表(hbase 存储处理程序)。

    请看https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration

    也看看这个my answer

    像 Impala 这样的选项是特定于平台的(cloudera),可以重复使用 hive 元存储。但查询处理速度比 Hive 快。

    impala 中的一些关键功能使其速度更快。

    1. 它不使用 map/reduce,这非常昂贵 单独的jvm。它运行单独的 Impala 守护进程来拆分查询 并并行运行它们并在最后合并结果集。

    2. 它的大部分操作都是在内存中完成的。

    3. 它使用 hdfs 进行存储,对于大文件来说速度很快。它 尽可能多地缓存从查询到结果再到数据。

    4. 支持parquet等新文件格式,即柱状文件 格式。因此,如果您使用这种格式,查询会更快 您只访问几列 大多数时候。

    【讨论】:

      猜你喜欢
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      相关资源
      最近更新 更多