1

我想解析由 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 数据库?

谢谢。

4

2 回答 2

1

Hadoop 的正确方向是开发自己的输入格式,记录阅读器将逐行读取输入并生成逻辑记录。
可以说——你实际上也可以在 mapper 中做到这一点——它可能会更简单一些。缺点是它不是 hadoop 此类代码的标准打包,因此可重用性较差。

在我看来,你提到的其他方向对于 hadoop 来说并不“自然”。具体来说 - 为什么要使用所有复杂(且昂贵)的洗牌机器将已经在手的几条生产线连接在一起。

于 2012-12-30T08:36:39.533 回答
0

首先,解析文件不是你想要做的;您正在尝试从数据中提取一些信息。

在您的情况下,您可以考虑多步 MR 作业,其中第一个 MR 作业基本上(部分)按 session_id 对您的输入进行排序(进行一些过滤?一些聚合?多个减速器?)然后减速器或下一个 MR 作业将进行实际计算。

如果不解释您试图从日志文件中提取的内容,就很难给出更明确的答案。

此外,如果您的数据很小,也许您可​​以在没有 MR 机器的情况下处理它?

于 2012-12-29T02:56:59.380 回答