【问题标题】:Analyze total error entry occurance in a time frame from log files with a hadoop mapreduce job使用 hadoop mapreduce 作业从日志文件分析时间范围内的总错误条目发生率
【发布时间】:2012-10-24 09:04:29
【问题描述】:

我有大量的日志文件存储在 HDFS 中,如下所示:

2012-10-20 00:05:00; BEGIN
...
SQL ERROR -678: Error message
...
2012-10-20 00:47:20; END

我想知道某个时间范围内某些 sql 错误代码出现的频率,例如: 从 2012 年 10 月 20 日凌晨 0:00 到 2012 年 10 月 20 日凌晨 1:00 发生了多少 678 个 SQL 错误。

由于文件通常被分成几个块,它们可以分布在所有数据节点之间。

这样的查询可能吗?我想使用 hadoop mapreduce Java API 或 Apache Pig,但我不知道如何应用时间框架条件。

【问题讨论】:

    标签: hadoop mapreduce apache-pig hdfs bigdata


    【解决方案1】:

    HDFS 在将文件拆分为块时不会考虑新行,因此单行可能会被拆分为两个块。但是,MapReduce 可以,因此输入文件中的一行将由单个映射器处理。

    2012-10-20 00:05:00;开始
    ...
    SQL 错误 -678:错误信息
    ...
    2012-10-20 00:47:20;结束

    如果文件大于块大小,则上述行更有可能位于两个块中并由不同的映射器处理。 FileInputFormat.isSplitable() 可以是overwritten 以确保单个日志文件由单个映射器处理,而不是由多个映射器处理。

    Hadoop 将使用 KV 对调用用户定义的映射函数,其中 K 是文件偏移量,值是输入文件中的行。需要一个实例变量来存储 BEGIN 时间,以便在以后调用用户定义的 map 函数时检查 END 时间。

    这不是一种有效的方法,因为单个映射器正在处理一个特定的映射文件并且没有分发。

    另一种方法是预处理日志文件,将相关行合并为一行。这样,日志文件中的相关行将仅由单个映射器处理。

    仅供参考,不使用 FileInputFormat.isSplitable() 的更复杂的方法也是可行的,但这需要解决。

    必须评估每种方法的优缺点并选择正确的方法。

    【讨论】:

    • 很好的回答,谢谢,FAQ 页面的提示也很好,非常好。下次发帖前我一定会提前查看常见问题解答;)
    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 2013-02-26
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多