用Hive分析nginx日志——1

这里用到的nginx日志是网站的访问日志,比如:

[java] view plain copy
  1. 180.173.250.74 - - [08/Jan/2015:12:38:08 +0800"GET /avatar/xxx.png HTTP/1.1" 200 968   
  2. "http://www.iteblog.com/archives/994"   
  3. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)   
  4. Chrome/34.0.1847.131 Safari/537.36"  
这条日志里面含有9列(为了展示的美观,我在这里面加了换行符),每列之间是用空格分割的,每列的含义分别是客户端访问IP、用户标示、用户、访问时间、请求页面、请求状态、返回文件的大小、跳转来源、浏览器UA。如果想用一般的方法解析这条日志的话有点困难。但是如果我们会正则表达式的话,去匹配这九列数据还是很简单的:

[java] view plain copy
  1. ([^ ]*) ([^ ]*) ([^ ]*) (
    .
    ) (\".*?\") (-|[0-9]*) (-|[0-9]*) (\".*?\") (\".*?\")  
这样一来就可以匹配出每一列的值。而在Hive中我们是可以指定输入文件解析器(SerDe)的,并且在Hive中内置了一个org.apache.hadoop.hive.contrib.serde2.RegexSerDe正则解析器,我们可以直接使用它。所以整个建表语句可以这么写:

[java] view plain copy
  1. CREATE TABLE logs(  
  2.   host STRING,  
  3.   identity STRING,  
  4.   user STRING,  
  5.   time STRING,  
  6.   request STRING,  
  7.   status STRING,  
  8.   size STRING,  
  9.   referer STRING,  
  10.   agent STRING)  
  11. ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'  
  12. WITH SERDEPROPERTIES (  
  13.   "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (\\[.*\\]) (\".*?\") (-|[0-9]*)   
  14.                 (-|[0-9]*) (\".*?\") (\".*?\")",  
  15.   "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"  
  16. )  
  17. STORED AS TEXTFILE;  
将日志放置到这个表的目录下,gz格式和未知压缩格式都可以直接被Hive解析。用下面语句可以查询出每小时访问量超过20的IP:

[java] view plain copy
  1. hive> select substring(time, 214) date ,host, count(*) as count   
  2. from logs   
  3. group by substring(time, 214), host   
  4. having count > 20   
  5. sort by date, count;  
  6.   
  7. 29/Dec/2014:00  47.18.236.106   24  
  8. 29/Dec/2014:02  81.215.34.45    70  
  9. 29/Dec/2014:04  66.249.64.18    23  
  10. 29/Dec/2014:04  66.249.64.22    24  
  11. 29/Dec/2014:09  119.145.14.213  44  
  12. 29/Dec/2014:09  113.90.78.63    52  
  13. 29/Dec/2014:10  106.39.255.133  26  
  14. 29/Dec/2014:10  211.99.9.68 30  
  15. 29/Dec/2014:10  60.10.71.97 33  
  16. 29/Dec/2014:10  222.128.29.21   76  
  17. 29/Dec/2014:11  91.237.69.17    56  
  18. 29/Dec/2014:11  211.151.238.52  144  
  19. 29/Dec/2014:12  222.92.189.35   26  
  20. 29/Dec/2014:12  218.85.130.110  31  
  21. 29/Dec/2014:12  218.4.189.13    77  
  22. 29/Dec/2014:13  61.57.231.254   30  
  23. 29/Dec/2014:13  124.207.11.123  33  
  24. 29/Dec/2014:14  134.134.139.76  22  
  25. 29/Dec/2014:14  218.15.33.28    27  
  26. 29/Dec/2014:14  218.247.17.100  67  
  27. 29/Dec/2014:15  116.235.244.139 31  
  28. 29/Dec/2014:15  101.231.119.202 52  
  29. 29/Dec/2014:15  183.11.249.158  64  
  30. 29/Dec/2014:16  116.235.244.139 22  
  31. 29/Dec/2014:16  211.151.238.52  30  
  32. 29/Dec/2014:16  123.138.184.84  53  
  33. 29/Dec/2014:17  219.159.77.110  55  
  34. 29/Dec/2014:17  87.204.102.195  57  
  35. 29/Dec/2014:17  111.203.3.1 77  
  36. 29/Dec/2014:18  125.41.147.243  21  
  37. 29/Dec/2014:18  66.249.64.18    23  
  38. 29/Dec/2014:18  101.251.230.3   39  
  39. 29/Dec/2014:18  110.249.70.182  40  
  40. 29/Dec/2014:18  91.200.12.26    44  
  41. 29/Dec/2014:18  218.64.17.230   93  
  42. 29/Dec/2014:19  66.249.64.22    27  
  43. 29/Dec/2014:21  222.129.35.102  25  

或者是一些其他的操作。


如果你对Bash比较熟悉的话,那你完全可以不用到Hive,直接用awk、sort等函数来实现,比如我想知道今天访问量比较多的IP并对他们进行排序,取前10条的语句可以这么写:

[java] view plain copy
  1. [root@iteblog ]# awk '{print $1}' www.iteblog.com.access.log | sort | uniq -c |  
  2. > sort -nr | head -n 10  
  3.     241 46.119.121.149  
  4.     224 66.249.65.51  
  5.     220 66.249.65.49  
  6.     219 66.249.65.47  
  7.     210 211.151.238.52  
  8.     184 207.46.13.96  
  9.     183 157.55.39.44  
  10.     182 112.247.104.147  
  11.     173 157.55.39.239  
  12.     169 157.55.39.106  


文章来自过往记忆http://www.iteblog.com/archives/1250
展开阅读全文

没有更多推荐了,返回首页