我在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,但我不知道如何应用时间框架条件。
1条答案
按热度按时间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()的更复杂的方法也是可行的,但这需要解决。
必须评估每种方法的利弊,并选择正确的方法。