使用 hadoop mapreduce 作业从日志文件分析时间范围内的总错误条目发生率

Posted

技术标签:

【中文标题】使用 hadoop mapreduce 作业从日志文件分析时间范围内的总错误条目发生率【英文标题】:Analyze total error entry occurance in a time frame from log files with a hadoop mapreduce job 【发布时间】: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,但我不知道如何应用时间框架条件。

【问题讨论】:

【参考方案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 页面的提示也很好,非常好。下次发帖前我一定会提前查看常见问题解答;)

以上是关于使用 hadoop mapreduce 作业从日志文件分析时间范围内的总错误条目发生率的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop中mapreduce作业日志是如何生成的

hadoop MapReduce - 从作业任务(task)管理员角度调优

如何从 Eclipse 调试 hadoop mapreduce 作业?

用于日志分析的 Map Reduce 作业未在 Hadoop 2.7.3 伪分布式模式下运行

Hadoop MapReduce 作业成功完成,但未向 DB 写入任何内容

Hadoop MapReduce 流式传输 - 确保我已处理所有日志文件的最佳方法