我目前正在将我网页上的所有活动记录到文件access.log中的nginx web-server。此文件由于其格式而无法理解,我希望通过将这些日志文件导出到Hadoop Hive来分析它们。但是,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"
发布于 2012-06-05 13:08:43
给定您提供的日志行作为示例,您应该能够在HDFS数据之上创建一个Hive表,而不会出现任何问题。
要开始使用,可以使用MetadataTypedColumnsetSerDe或RegexSerDe。当记录的字段由相同的字符分隔时,通常使用MetadataTypedColumnsetSerDe。这是在CREATE TABLE
语句中使用ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
时默认使用的SerDe。不需要显式指定SerDe。
当所有记录都与特定的正则表达式匹配时,通常使用RegexSerDe。您可以在此正则表达式上使用grouping来提取将作为列数据的片段。here是可用的RegexSerDe示例
请注意,RegexSerDe的性能比LazySimpleSerDe差,所以在可能的情况下您应该更喜欢使用LazySimpleSerDe。
还请注意,无论您使用什么SerDe,Hive目前都有一个限制,即表中的一条记录必须出现在一个Hive中。换句话说,您不能让一条记录溢出到数据文件的多行中(如果数据是XML格式,这很常见),也不能让多条记录出现在一行中。有一些方法可以绕过这一限制,但如果可能的话,请避免这种情况。
发布于 2012-06-02 19:54:21
对于这样的任务,sed可能是最好也是最简单的工具。
https://stackoverflow.com/questions/10851038
复制相似问题