如何创建从 hive 表到关系数据库的数据管道
Posted
技术标签:
【中文标题】如何创建从 hive 表到关系数据库的数据管道【英文标题】:How to create a data pipeline from hive table to relational database 【发布时间】:2013-02-21 10:45:26 【问题描述】:背景:
我有一个包含日志信息的 Hive 表“日志”。该表每小时都会加载新的日志数据。我想对过去 2 天的日志进行一些快速分析,因此我想将过去 48 小时的数据提取到我的关系数据库中。
为了解决上述问题,我创建了一个由 HIVE SQL 查询加载的临时配置单元表。将新数据加载到暂存表后,我使用 sqoop Query 将新日志加载到关系数据库中。
问题是 sqoop 正在将数据加载到 BATCH 中的关系数据库中。因此,在任何特定时间,我只有特定小时的部分日志。
这会导致错误的分析输出。
问题:
1)。如何使这个 Sqoop 数据加载事务性,即要么导出所有记录,要么不导出任何记录。
2)。在 Hive 表 -> 暂存表 -> 关系表的整个过程中构建这个数据管道的最佳方法是什么。
技术细节:
Hadoop 版本 1.0.4 Hive- 0.9.0 Sqoop - 1.4.2
【问题讨论】:
【参考方案1】:您应该能够通过使用名为--staging-table
的选项对sqoop
执行此操作。它的作用基本上是充当用于暂存导出数据的辅助表。暂存数据最终在单个事务中移动到目标表。因此,通过这样做,您应该不会遇到部分数据的一致性问题。
(来源:Sqoop documentation)
【讨论】:
我有一个主 HIVE 表(主),我从中查询数据并将数据存储到与关系数据库相同的第二个配置单元表中。现在,如果我使用 --staging-table 选项,那么它将再创建一个临时表。恕我直言,当我处理大量数据时,这将对性能造成很大影响。有更好的方法吗?【参考方案2】:Hive 和 Hadoop 是非常棒的技术,可以让您的分析在 MapReduce 任务中运行,通过利用多个节点非常快速地执行分析。
利用它为您带来好处。首先对 Hive 表进行分区。 我猜您将所有日志存储在一个 Hive 表中。因此,当您运行查询并且您有一个
SQL .... WHERE LOG_DATA > '17/10/2013 00:00:00'
然后您就可以有效地查询您迄今为止收集的所有数据。 相反,如果您使用分区 - 假设您可以在查询中定义每天一个
在哪里 p_date=20131017 或 p_date=20131016
Hive 已分区,现在只知道读取这两个文件 因此,假设您每天有 10 GB 的日志 - 那么在一个体面的 Hadoop 集群中,HIVE QUERY 应该会在几秒钟内成功
【讨论】:
以上是关于如何创建从 hive 表到关系数据库的数据管道的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Fluent API 配置从 AspNetUsers 表到...的一对多关系
当某些列有几种不同的数据类型时,DynamoDB 表到 Hive?