我目前正将我网页上的所有活动记录到文件access.log中的nginx web-server。由于其格式,此文件难以理解,我希望通过将这些日志文件导出到Hadoop Hive来分析这些日志文件。但是,配置单元无法理解原始的nginx日志。因此,我计划将这些日志重新生成为JSON或CSV格式,然后将它们导出到hive,我可以在其中查询和分析日志。请给我一些工具/方法,让我能够完成上述工作。 目前我的nginx日志如下所示:
115.249.242.17 - - [01/Jun/2012:18:44:57 +0530] "GET /flashlayer?videoId=66127&playSessionId=VOD_66127_e04393db-0b40-44b1-aad8-aa2169ac71a710.32.6.1311338556485611&duration=0&playerState=playing&playerError=null HTTP/1.1" 200 86 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0"
答案 0 :(得分:1)
以您提供的日志行为例,您应该可以在HDFS数据之上创建一个Hive表而不会出现任何问题。
要开始使用,可以使用MetadataTypedColumnsetSerDe或RegexSerDe。
MetadataTypeColumnsetSerDe通常在记录的字段由相同字符(例如制表符或逗号等)分隔时使用。这是在ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
语句中使用CREATE TABLE
时默认使用的SerDe。无需明确指定SerDe。
当所有记录与特定正则表达式匹配时,通常使用RegexSerDe。您可以在此正则表达式上使用分组来提取您将创建列数据的片段。 RegexSerDe的示例可用here
请注意,RegexSerDe的性能比LazySimpleSerDe差,所以您应该尽可能使用LazySimpleSerDe。
另请注意,无论您使用什么SerDe,Hive目前都有一个限制,即您的表中的一条记录必须存在于一个Hive中。换句话说,您不能将记录溢出到数据文件的多行(非常常见,如果数据是XML格式),也不能在一行中存在多个记录。有办法解决这个限制,但如果可能的话,请避免这种情况。
答案 1 :(得分:-1)
可能 sed 是执行此类任务的最佳和最简单的工具。