背景:
我有一个包含日志信息的Hive Table“log”。该表每小时加载一次新的日志数据。我想在过去的两天内对日志进行一些快速分析,所以我想将最后48小时的数据提取到我的关系数据库中。
为了解决上述问题,我创建了一个由HIVE SQL查询加载的临时配置单元表。将新数据加载到临时表后,我使用sqoop Query将新日志加载到关系数据库中。
问题是sqoop正在将数据加载到BATCH中的关系数据库中。因此,在任何特定时间,我只有特定小时的部分日志。
这导致错误的分析输出。
问题:
1)。如何使这个Sqoop数据加载事务,即导出所有记录或导出所有记录。
2)。什么是构建此数据管道的最佳方法,其中Hive Table的整个过程 - >临时表 - >关系表。
技术细节:
Hadoop版本1.0.4
Hive- 0.9.0
Sqoop - 1.4.2
答案 0 :(得分:1)
您应该可以使用名为sqoop
的选项使用--staging-table
执行此操作。这样做基本上充当用于暂存导出数据的辅助表。分阶段数据最终在单个事务中移动到目标表。因此,通过这样做,您不应该对部分数据存在一致性问题。
(来源:Sqoop documentation)
答案 1 :(得分:1)
Hive和Hadoop是如此出色的技术,可以让您的分析在MapReduce任务中运行,通过利用多个节点非常快速地执行分析。
将此用于您的利益。首先对Hive表进行分区。 我想你将所有日志存储在一个Hive表中。因此,当您运行查询并且有
时SQL .... WHERE LOG_DATA> '17 / 10/2013 00:00:00'
然后,您可以有效地查询到目前为止收集的所有数据。 相反,如果您使用分区 - 假设您可以在查询中定义每天一个
WHERE p_date = 20131017或p_date = 20131016
Hive已分区,现在知道只读取这两个文件 因此,假设您每天获得10 GB的日志 - 那么HIVE QUERY应该会在几秒钟内在一个体面的Hadoop集群中成功