2010-06-20 55 views
1

我有要求使用map reduce一个接一个地解析Apache访问日志和tomcat日志。很少的字段正在从tomcat日志中提取,并从Apache日志中提取。我需要根据时间戳合并/映射提取的字段,并将这些映射字段导出到传统的关系数据库(例如MySQL)中。将分析后的日志数据存储在hadoop中并将其导出到关系数据库中

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

几种方法我想到的

1)收件地图的输出从两个解析Apache访问日志和Tomcat日志减少到单独的文件,并合并这些到一个文件中(同样基于时间戳)。将这些数据导出到MySQL。

2)使用HBase的或配置单元以表的格式的数据存储在Hadoop和导出到MySQL

3)直接写图的输出用JDBC减少到MySQL。

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

回答

2

让更小,更简单的MR作业和链接在一起比创建大型复杂作业几乎总是可取的。我认为你最好的选择是像#1一样。换句话说:

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

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

它听起来不像你需要/想要随机存取的开销,所以我不会看HBase。这并不是它的强项(尽管你可以通过随时查看HBase中的每条记录的时间戳,查看它是否存在,合并记录,或者只是插入,如果它不存在,但是这比较慢)。 Hive可以很方便地存储这两种格式的“统一”结果,但您仍然必须将记录转换为该格式。

绝对不想让reducer直接写入MySQL。这有效地在数据库上创建了DDOS攻击。考虑一个由10个节点组成的集群,每个节点运行5个reducer,你将有50个并发写入者到同一个表中。随着群集的增长,您将非常快速地超过max连接并扼杀RDBMS。

所有这一切说,问自己是否有道理把这么多的数据到数据库中,如果你正在考虑全面的日志记录。这一数据量恰恰是Hadoop本身用于长期存储和处理的情况。如果你计算这些数据的总量,无论如何,把它扔进MySQL。

希望这会有所帮助。

+0

谢谢埃里克 我正在使用基于文件的方法在数据库中合并数据的轻微更改,而不是在mapreduce中执行它。来自两个日志的解析数据将被存储到两个单独的登台表中,并将这些登台表连接起来以获取最终的汇总数据,这些数据将存储在决赛桌中。 对于将这么多数据放入数据库是否合理的问题,解析后的数据将被汇总为与日志文件记录相比非常少的过滤的有用数据。将数据存储到关系数据库中的原因是允许传统应用程序访问该数据 – 2010-07-11 03:33:21

相关问题