1.1 某论坛日志,数据分为两部分组成,原来是一个大文件,是56GB;以后每天生成一个文件,大约是150-200MB之间;
1.2 日志格式是apache common日志格式;
1.3 分析一些核心指标,供运营决策者使用;
1.4 开发该系统的目的是分了获取一些业务相关的指标,这些指标在第三方工具中无法获得的;
2.1 把日志数据上传到HDFS中进行处理
如果是日志服务器数据较小、压力较小,可以直接使用shell命令把数据上传到HDFS中;
如果是日志服务器数据较大、压力较答,使用NFS在另一台服务器上上传数据;
如果日志服务器非常多、数据量大,使用flume进行数据处理;
2.2 使用MapReduce对HDFS中的原始数据进行清洗;
2.3 使用Hive对清洗后的数据进行统计分析;
2.4 使用Sqoop把Hive产生的统计结果导出到mysql中;
2.5 如果用户需要查看详细数据的话,可以使用HBase进行展现;
[root@node1 hadoop-2.5.1]# hadoop fs -mkdir -p /tbbs_logs
得到前一天的时间
[root@node1 apache_logs]# date --date='1 days ago' +%Y_%m_%d
[root@node1 apache_logs]# date --date='2 days ago' +%Y_%m_%d
yesterday=`date --date='1 days ago' +%Y_%m_%d`
hadoop fs -put /opt/modules/hive-1.2.1/data/apache_logs/access_${yesterday}.log /tbbs_logs
[root@node1 data]# crontab -e
* 1 * * * upload_to_hdfs.sh
hive> CREATE EXTERNAL TABLE tbbs(ip string, atime string, url string)
> PARTITIONED BY (logdate string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY '\t'
> LOCATION 'hdfs://node1:8020/tbbs_cleaned/';
hive> ALTER TABLE tbbs
> ADD PARTITION(logdate='2016_03_25')
> LOCATION '/tbbs_cleaned/2016_03_25';
hive> LOAD DATA INPATH 'hdfs://node1:8020/tbbs_cleaned/tbbs.dat' INTO TABLE tbbs partition(logdate='2016_03_25');
hive> desc formatted tbbs;
把代码增加到upload_to_hdfs.sh中,内容如下
hive -e "ALTER TABLE tbbs ADD PARTITION(logdate='${yesterday}') LOCATION '/tbbs_cleaned/${yesterday}';"
hive> CREATE TABLE tbbs_pv_2016_03_25 AS SELECT COUNT(1) AS PV FROM tbbs WHERE logdate='2016_03_25';
hive> select * from tbbs_pv_2016_03_25;
CREATE TABLE tbbs_reguser_2016_03_25 AS SELECT COUNT(1) AS REGUSER FROM tbbs WHERE logdate='2016_03_25'
AND INSTR(url,'member.php?mod=register')>0;
hive> select * from tbbs_reguser_2016_03_25;
CREATE TABLE tbbs_ip_2016_03_25 AS SELECT COUNT(DISTINCT ip) AS IP FROM tbbs WHERE logdate='2016_03_25';
hive> select * from tbbs_ip_2016_03_25;
hive> CREATE TABLE tbbs_jumper_2016_03_25 AS SELECT COUNT(1) AS jumper FROM (SELECT COUNT(ip) AS times FROM tbbs WHERE logdate='2016_03_25' GROUP BY ip HAVING times=1) e;
hive> select * from tbbs_jumper_2016_03_25;
hive> CREATE TABLE tbbs_2016_03_25 AS SELECT '2016_03_25', a.pv, b.reguser, c.ip, d.jumper FROM tbbs_pv_2016_03_25 a JOIN tbbs_reguser_2016_03_25 b ON 1=1 JOIN tbbs_ip_2016_03_25 c ON 1=1 JOIN tbbs_jumper_2016_03_25 d ON 1=1;
hive> select * from tbbs_2016_03_25;