我想解析fidonet mailer binkd生成的日志文件,这些日志文件是多行的,而且混合性更差:多个示例可以写入一个日志文件,例如:
27 Dec 16:52:40 [2484] BEGIN, binkd/1.0a-545/Linux -iq /tmp/binkd.conf
+ 27 Dec 16:52:40 [2484] session with 123.45.78.9 (123.45.78.9)
- 27 Dec 16:52:41 [2484] SYS BBSName
- 27 Dec 16:52:41 [2484] ZYZ First LastName
- 27 Dec 16:52:41 [2484] LOC City, Country
- 27 Dec 16:52:41 [2484] NDL 115200,TCP,BINKP
- 27 Dec 16:52:41 [2484] TIME Thu, 27 Dec 2012 21:53:22 +0600
- 27 Dec 16:52:41 [2484] VER binkd/0.9.6a-173/Win32 binkp/1.1
+ 27 Dec 16:52:43 [2484] addr: 2:1234/56.78@fidonet
- 27 Dec 16:52:43 [2484] OPT NDA CRYPT
+ 27 Dec 16:52:43 [2484] Remote supports asymmetric ND mode
+ 27 Dec 16:52:43 [2484] Remote requests CRYPT mode
- 27 Dec 16:52:43 [2484] TRF 0 0
*+ 27 Dec 16:52:43 [1520] done (from 2:456/78@fidonet, OK, S/R: 0/0 (0/0 bytes))*
+ 27 Dec 16:52:43 [2484] Remote has 0b of mail and 0b of files for us
+ 27 Dec 16:52:43 [2484] pwd protected session (MD5)
- 27 Dec 16:52:43 [2484] session in CRYPT mode
+ 27 Dec 16:52:43 [2484] done (from 2:1234/56.78@fidonet, OK, S/R: 0/0 (0/0 bytes))
因此,日志文件不仅是多行的,每个会话的行数不可预测,而且还可以在多个记录之间进行混合,就像会话1520在会话2484的中间完成一样。在hadoop中,解析这样一个文件的正确方向是什么?或者我应该逐行解析,然后以某种方式将它们合并到一个记录中,然后使用另一组作业将这些记录写入sql数据库?
谢谢。
2条答案
按热度按时间plupiseo1#
hadoop的正确方向是开发自己的输入格式,记录阅读器将逐行读取输入并生成逻辑记录。
可以说-实际上你也可以在mapper中实现-它可能会简单一点。缺点是它不是hadoop的标准打包代码,因此它的可重用性较差。
在我看来,您提到的其他方向对于hadoop来说并不“自然”。特别是-为什么要使用所有复杂的(昂贵的)洗牌机器来连接已经在手的几行。
62o28rlo2#
首先,解析文件不是你想要做的;您正试图从数据中提取一些信息。
在您的案例中,您可以考虑多步骤mr作业,其中第一个mr作业基本上(部分地)按会话id对您的输入进行排序(进行一些过滤?一些聚合?多个减速机?),然后减速机或下一个mr作业将进行实际计算。
如果不解释您试图从日志文件中提取什么,就很难给出更明确的答案。
另外,如果你的数据很小,也许你可以在没有mr机器的情况下处理它?