MapReduce&Hive应用程序设计



>我有一个设计问题,在我的CDH 4.1.2(Cloudera)安装中,我每天都有滚动日志数据转储到HDFS中。我有一些报告来计算每天的成功率和失败率。

我有两种方法

  1. 将每日日志数据加载到 Hive 表中并创建复杂查询。
  2. 每天预先运行一个MapReduce作业以生成摘要(基本上是几行),并继续附加到一个公共文件,即 Hive 表。 稍后在运行报告时,我可以使用简单的选择查询来获取摘要。

我试图了解两者中哪个是更好的方法,或者是否有更好的方法。

第二种方法在合并文件方面增加了一些复杂性。如果不合并,我会有很多非常小的文件,这似乎是一个坏主意。

感谢您的投入。

谢谢

Hive 似乎非常适合此类任务,并且应该相当简单:

  • 在 Hive 中创建一个应按天分区的EXTERNAL表。目标是将转储数据的目录直接位于 Hive 表中。您可以在日常日志中指定字段的分隔符,如下所示,我使用逗号:

    create external table mytable(...) partitioned by (day string) row format delimited keys terminated by ',' location '/user/hive/warehouse/mytable`
    
  • 在 HDFS 中转储数据时,请确保将其转储到 day= 的同一目录中,以便将其识别为 Hive 分区。例如在/user/hive/warehouse/mytable/day=2013-01-23.

  • 然后,需要让 Hive 知道此表具有新分区:

    alter table mytable add partition (day='2013-01-23')
    
  • 现在,Hive 元存储知道你的分区,你可以运行摘要查询。确保仅通过指定... where day='2013-01-23'来查询分区

您可以轻松地编写脚本以每天在cron或其他东西中运行并获取当前日期(例如使用shell date命令),并在执行上述步骤的shell脚本中替换变量。

相关内容

  • 没有找到相关文章

最新更新