2

使用百度开放云分析网站日志

网站日志包含用户访问信息,通过日志分析我们可以了解网站的访问量、网页访问次数、网页访问人数、频繁访问时段等等,以便获取用户行为以优化网站的商业价值。由于网站每天会产生海量的日志,非常适合使用百度MapReduce(简称BMR)这样的托管Hadoop服务。同时,BMR集成了Hive和Hue,开发者可以在友好的界面中通过SQL语句就能分析海量日志,大大降低了使用门槛。

下面将通过一个具体的例子来展示如何通过BMR来分析网站日志。

创建BMR集群

请登录百度开放云管理控制台并创建集群,根据提示完成配置步骤。注意,在软件配置设置栏内,镜像类型请选择Hadoop 2.6并确保添加Hive和Hue应用。不出几分钟BMR集群便可创建完毕。

分析网站日志

Hue是一个开源的Apache Hadoop 图形界面系统,通过使用Hue我们可以在浏览器中与Hadoop集群交互来分析处理数据,例如创建数据集、执行Hive查询等。

为了方便用户试用,BMR提供了一站式Hue的访问,在集群详情页内可以找到Hue的网址,输入集群用户名密码即可登录。那些需要使用SSH Tunnel登录的方法太老旧啦!

登录Hue以后可以借助File Browser上传Nginx日志,示例数据可以从这里下载,为了简单起见就放在/user/root下面:

web-log-via-hue-04

在分析之前,首先需要根据网站日志建立一张Hive表。在Hue菜单栏中选择查询编辑器、Hive,并输入以下SQL语句:

DROP TABLE IF EXISTS access_logs;
CREATE EXTERNAL TABLE access_logs (
  remote_addr STRING comment 'client IP',
  time_local STRING comment 'access time',
  request STRING comment 'request URL',
  status STRING comment 'HTTP status',
  body_bytes_sent STRING comment 'size of response body',
  http_referer STRING comment 'referer',
  http_cookie STRING comment 'cookies',
  remote_user STRING comment 'client name',
  http_user_agent STRING comment 'client browser info',
  request_time STRING comment 'consumed time of handling request',
  host STRING comment 'server host',
  msec STRING comment 'consumed time of writing logs'
)
COMMENT 'web access logs'
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  "input.regex" = "([0-9\\.]+) - \\[([^\\]]+)\\] \"([^\"]*)\" ([\\d]+) ([\\d]*) \"([^\"]*)\" \"([^\"]*)\" ([\\S]+) \"([^\"]*)\" ([0-9\\.]+) ([\\S]+) ([0-9\\.]+)"
)
STORED AS TEXTFILE
LOCATION "/user/root";

这样,Hive会重建access_logs表,然后通过正则表达式来解析日志文件。注意LOCATION需要跟上传日志文件所对应,比如/user/root。当然,BMR还支持从对象存储BOS上读取数据,以后有机会再解释。

成功创建access_logs表之后,便可以在Hive Editor左侧的辅助菜单中刷新数据库,找到access_logs表并预览示例数据:

web-log-via-hue-01

定了表之后,便可以进行查询了。比如,以下语句可以统计网页请求的结果:

SELECT status, count(1)
FROM access_logs
GROUP BY status

切换到图表页,还可以以饼图的形式可视化数据:

web-log-via-hue-02

使用下面的语句可以了解哪个时段网页访问量最大:

SELECT hour(from_unixtime(unix_timestamp(time_local, 'dd/MMMM/yyyy:HH:mm:ss Z'))) AS hour, count(1) AS pv
FROM access_logs
GROUP BY hour(from_unixtime(unix_timestamp(time_local, 'dd/MMMM/yyyy:HH:mm:ss Z')))

切换到图表页,可以以柱状图来可视化结果:

web-log-via-hue-03

可见大量的访问在晚上九点,是不是需要在这段时间多投放一些广告呢?

 



张 琪

2 Comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注