我需要使用map reduce一个接一个地解析Apache访问日志和tomcat日志。很少有字段从tomcat日志中提取并从Apache log中休息。我需要根据时间戳合并/映射提取的字段,并将这些映射字段导出到传统的关系数据库(例如MySQL)。
我可以使用正则表达式或猪来解析和提取信息。我面临的挑战是如何将两个日志中提取的信息映射到单个聚合格式或文件以及如何将此数据导出到MYSQL。
我正在考虑的几种方法
1)将解析后的Apache访问日志和tomcat日志中的map reduce输出写入单独的文件,并将它们合并到一个文件中(同样基于时间戳)。将此数据导出到MySQL。
2)使用Hbase或Hive在hadoop中以表格格式存储数据并将其导出到MySQL
3)使用JDBC直接将map reduce的输出写入MySQL。
哪种方法最可行,也请建议您知道的任何其他替代解决方案。
答案 0 :(得分:2)
几乎总是优先考虑使用更小,更简单的MR作业并将它们链接在一起,而不是拥有大型复杂的作业。我认为你最好的选择就是选择#1之类的东西。换句话说:
您可以在同一步骤中执行连接和转换(1和2)。使用地图进行转换并执行缩减边连接。
这听起来不像你需要/想要随机访问的开销所以我不会看HBase。这不是它的强项(尽管你可以通过在时间戳中查找HBase中的每条记录,查看它是否存在,合并记录,或者只是插入,如果它不存在,那么你可以在随机访问意义上做到这一点)很慢,相对而言)。 Hive可以方便地存储两种格式的“统一”结果,但您仍然需要将记录转换为该格式。
你绝对不想让reducer直接写入MySQL。这有效地在数据库上创建了DDOS攻击。考虑一个由10个节点组成的集群,每个节点运行5个reducers,你将有50个并发写入器到同一个表。随着群集的增长,您将非常快速地超过最大连接数并阻塞RDBMS。
所有这些都说,如果您正在考虑完整的日志记录,请问自己将这么多数据放入数据库是否有意义。这些数据量正是Hadoop本身用于存储和处理长期的案例类型。如果您正在计算这些数据的聚合,请务必将其投入MySQL。
希望这有帮助。