1

我需要使用 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。

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

4

1 回答 1

2

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

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

您可能可以在同一步骤中执行连接和转换(1 和 2)。使用地图进行转换并进行减少侧连接。

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

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

综上所述,如果您正在考虑完整的日志记录,请问问自己将这么多数据放入数据库是否有意义。这种数据量正是 Hadoop 本身旨在长期存储和处理的案例类型。如果你正在计算这些数据的聚合,无论如何,把它扔到 MySQL 中。

希望这可以帮助。

于 2010-07-10T23:24:33.843 回答