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

vsnjm48y  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(288)

我在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错误。
由于文件通常被分割成几个块,所以它们可以分布在所有数据节点之间。
这样的询问可能吗?我想使用hadoopmapreducejavaapi或apachepig,但我不知道如何应用时间框架条件。

llycmphe

llycmphe1#

hdfs在将文件分割成块时不考虑新行,因此一行可能被分割成两个块。但是,mapreduce会这样做,因此输入文件中的一行将由单个Map器处理。
2012-10-20 00:05:00; 开始
...
sql错误-678:错误消息
...
2012-10-20 00:47:20; 结束
如果文件大于块大小,则上述行更有可能分为两个块并由不同的Map器处理。可以覆盖fileinputformat.issplitable(),以确保单个日志文件由单个Map器处理,而不是由多个Map器处理。
hadoop将使用kv对调用用户定义的map函数,其中k是文件偏移量,值是输入文件中的行。需要一个示例变量来存储开始时间,以便在稍后调用用户定义的map函数时对照结束时间进行检查。
这不是一种有效的方法,因为单个Map器正在处理特定的Map文件,并且不是分布式的。
另一种方法是对日志文件进行预处理,将相关行组合成一行。这样,日志文件中的相关行将仅由单个Map器处理。
仅供参考,不使用fileinputformat.issplitable()的更复杂的方法也是可行的,但这需要解决。
必须评估每种方法的利弊,并选择正确的方法。

相关问题