通过对技术论坛的apache common日志进行分析,开发该系统的目的是分了获取一些业务相关的指标,这些指标在第三方工具中无法获得的;计算论坛关键指标,供运营者决策。
1.把日志数据上传到HDFS中进行处理
- 如果是日志服务器数据较小、压力较小,可以直接使用shell命令把数据上传到HDFS中;
- 如果是日志服务器数据较大、压力较答,使用NFS在另一台服务器上上传数据;
- 如果日志服务器非常多、数据量大,使用flume进行数据处理;
2.使用MapReduce对HDFS中的原始数据进行清洗;
3.使用Hive对清洗后的数据进行统计分析;
4.使用Sqoop把Hive产生的统计结果导出到mysql中;
5.如果用户需要查看详细数据的话,可以使用HBase进行展现;
flume(源是文件夹,目的是hdfs和hbase,管道是文件)
flume配置文件(从本地监控目录上传日志文件到hdfs中)
mapreduce
数据清洗结果
hadoop fs -cat /user/elon/bbs_cleaned/2013_05_30/part-r-00000
设计表、预分区
hive(表、视图)、自定义函数
## 存放数据的主分区表
hive -e "ALTER TABLE bbs ADD PARTITION(logdate='2013_05_30') LOCATION 'hdfs://hadoop:9000/user/elon/bbs_cleaned/2013_05_30';"
## create hive table everyday
## 统计单日PV数
hive -e "CREATE TABLE bbs_pv_2013_05_30 AS SELECT COUNT(1) AS PV FROM bbs WHERE logdate='2013_05_30';"
## 统计单日注册数
hive -e "CREATE TABLE bbs_reguser_2013_05_30 AS SELECT COUNT(1) AS REGUSER FROM bbs WHERE logdate='2013_05_30' AND INSTR(url,'member.php?mod=register')>0;"
## 统计单日访问IP用户数
hive -e "CREATE TABLE bbs_ip_2013_05_30 AS SELECT COUNT(DISTINCT ip) AS IP FROM bbs WHERE logdate='2013_05_30';"
## 统计单日跳出数
hive -e "CREATE TABLE bbs_jumper_2013_05_30 AS SELECT COUNT(1) AS jumper FROM (SELECT COUNT(ip) AS times FROM bbs WHERE logdate='2013_05_30' GROUP BY ip HAVING times=1) e;"
## 以上四个结果汇总到一张表统计
hive -e "CREATE TABLE bbs_2013_05_30 AS SELECT '2013_05_30', a.pv, b.reguser, c.ip, d.jumper FROM bbs_pv_2013_05_30 a JOIN bbs_reguser_2013_05_30 b ON 1=1 JOIN bbs_ip_2013_05_30 c ON 1=1 JOIN bbs_jumper_2013_05_30 d ON 1=1;"
sqoop、MySQL
sqoop export --connect jdbc:mysql://hadoop:3306/bbs --username root --password 123456 --table bbs_logs --fields-terminated-by '\001' --export-dir 'hdfs://hadoop:9000/user/hive/warehouse/bbs_2013_05_30'
当最终分析的论坛指标数据导出到MySQL中时,之前那些临时表就可以删除了。在下面的自动调度中,实现临时表删除。
要想通过脚本实现每天自动调度进行日志分析,就必须用到shell脚本,将命令都封装在shell脚本中,通过每天日期的迭代和定时任务设置,实现自动调度分析日志。
1.在 crontab-e 中实现定时任务设置。
2.在 bbs_daily.sh 脚本中每日调度一次bbs_common.sh
脚本,传入每日的日期参数,实现任务调度。
3.在 bbs_common.sh 调用命令脚本实现日志分析过程,得到分析指标结果。