背景:
我有一个包含日志信息的配置单元表“log”。此表每小时加载一次新的日志数据。我想对过去2天的日志做一些快速分析,所以我想把最后48小时的数据提取到我的关系数据库中。
为了解决上述问题,我创建了一个staging配置单元表,该表由配置单元sql查询加载。在将新数据加载到staging表之后,我使用sqoop查询将新日志加载到关系数据库中。
问题是sqoop正在将数据批量加载到关系数据库中。所以在任何特定的时间,我只有特定时间的部分日志。
这将导致错误的分析输出。
问题:
1). 如何使这个sqoop数据加载具有事务性,即要么导出所有记录,要么不导出任何记录。
2). 构建这个数据管道的最佳方法是什么呢?这里的整个过程是配置单元表->暂存表->关系表。
技术细节:
hadoop版本1.0.4
Hive-0.9.0
sqoop-1.4.2版
2条答案
按热度按时间jv4diomz1#
hive和hadoop是非常好的技术,可以让您的分析在mapreduce任务中运行,通过利用多个节点来快速执行分析。
为了你的利益。首先,对配置单元表进行分区。我猜您将所有日志存储在一个配置单元表中。因此,当您运行查询时
sql。。。。其中日志数据>'17/10/2013 00:00:00'
然后有效地查询到目前为止收集的所有数据。相反,如果您使用分区,比如说每天一个分区,您可以在查询中定义
式中,p\u date=20131017或p\u date=20131016
hive是分区的,现在知道只读取这两个文件,所以假设您每天有10gb的日志,那么在一个不错的hadoop集群中,hive查询应该在几秒钟内成功
vmdwslir2#
你应该可以用它来做这件事
sqoop
通过使用名为--staging-table
. 它基本上充当一个辅助表,用于暂存导出的数据。暂存的数据最终在单个事务中移动到目标表。因此,通过这样做,您不应该有部分数据的一致性问题。(来源:sqoop文档)