1

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

我有两种方法

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

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

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

感谢您的意见。

谢谢

4

1 回答 1

3

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 或其他东西中运行并获取当前日期(例如使用 shelldate命令)并在执行上述步骤的 shell 脚本中替换变量。

于 2013-01-24T00:26:41.617 回答