【问题标题】:Storage of parsed log data in hadoop and exporting it into relational DB在hadoop中存储解析的日志数据并将其导出到关系数据库中
【发布时间】:2010-06-20 19:13:20
【问题描述】:

我需要使用 map reduce 依次解析 Apache 访问日志和 tomcat 日志。从 tomcat 日志中提取的字段很少,从 Apache 日志中提取。我需要根据时间戳合并 /map 提取的字段,并将这些映射的字段导出到传统的关系数据库(例如 MySQL)中。

我可以使用正则表达式或 pig 解析和提取信息。我面临的挑战是如何将两个日志中提取的信息映射到单个聚合格式或文件中,以及如何将这些数据导出到 MYSQL。

我想到的几种方法

1) 将解析后的 Apache 访问日志和 tomcat 日志的 map reduce 输出写入单独的文件,并将它们合并到一个文件中(再次基于时间戳)。将此数据导出到 MySQL。

2) 使用 Hbase 或 Hive 将数据以表格式存储在 hadoop 中并导出到 MySQL

3) 使用 JDBC 直接将 map reduce 的输出写入 MySQL。

哪种方法最可行,还请建议您知道的任何其他替代解决方案。

【问题讨论】:

    标签: hadoop mapreduce logparser


    【解决方案1】:

    拥有更小、更简单的 MR 工作并将它们链接在一起几乎总是比拥有大型、复杂的工作更可取。我认为您最好的选择是使用#1之类的东西。换句话说:

    1. 将 Apache httpd 日志处理为统一格式。
    2. 将 Tomcat 日志处理成统一格式。
    3. 使用任何有意义的逻辑连接 1 和 2 的输出,将结果写入相同的格式。
    4. 将生成的数据集导出到您的数据库。

    您可能可以在同一步骤中执行连接和转换(1 和 2)。使用 map 进行转换并进行 reduce side join。

    听起来您不需要/想要随机访问的开销,所以我不会看 HBase。这不是它的强项(尽管您可以通过在 HBase 中按时间戳查找每条记录,查看它是否存在,合并记录,或者如果它不存在则简单地插入,从而在随机访问意义上做到这一点,但是这个相对来说非常慢)。 Hive 可以方便地存储两种格式的“统一”结果,但您仍然必须将记录转换为该格式。

    绝对不想让reducer直接写入MySQL。这有效地创建了对数据库的 DDOS 攻击。考虑一个由 10 个节点组成的集群,每个节点运行 5 个 reducer,您将有 50 个并发写入同一个表。随着集群的增长,您将很快超过最大连接数并阻塞 RDBMS。

    所有这些,如果您正在考虑完整的日志记录,请问问自己将这么多数据放入数据库是否有意义。这种数据量正是 Hadoop 本身旨在长期存储和处理的案例类型。如果您正在计算这些数据的聚合,请务必将其放入 MySQL。

    希望这会有所帮助。

    【讨论】:

    • 谢谢 Eric 我正在使用基于文件的方法,在数据库中合并数据的方式略有变化,而不是在 mapreduce 中进行。来自两个日志的解析数据将存储到两个单独的暂存表中,并且这些暂存表被连接以获得将存储在最终表中的最终聚合数据。对于将这么多数据放入数据库是否有意义的问题,解析的数据将聚合过滤后的有用数据,与日志文件记录相比,这些数据非常少。将数据存储到关系数据库中的原因是允许传统应用程序访问该数据
    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多