数据分析一般分为两种,一种是在线一种是离线
流程:
一般都是对于日志文件的采集和分析
场景实例(某个电商网站产生的用户访问日志(access.log)进行离线处理与分析的过程)
1、需求:
基于MapReduce的处理方式,最后会统计出某一天不同省份访问该网站的uv与pv(pv就是点击量,uv是独立访客量)。
上图比较典型的Nginx负载均衡+KeepAlive高可用集群架构,访问的信息日志就存在每台web服务器上
日志文件内容如下:
1001211.167.248.22eecf0780-2578-4d77-a8d6-e2225e8b9169406041GET/topHTTP/1.0408nullnull15231881227671003222.68.207.11eecf0780-2578-4d77-a8d6-e2225e8b9169202021GET/tologinHTTP/1.1504nullMozilla/5.0(Windows;U;WindowsNT5.1)Gecko/20070309Firefox/2.0.0.31523188123267100161.53.137.50c3966af9-8a43-4bda-b58c-c11525ca367b01GET/update/passHTTP/1.0302nullnull15231881237681000221.195.40.1451aa3b538-2f55-4cd7-9f46-6364fdd1e48700GET/user/addHTTP/1.1200nullMozilla/4.0(compatible;MSIE7.0;WindowsNT5.2)15231881242691000121.11.87.1718b0ea90a-77a5-4034-99ed-403c800263dd202021GET/topHTTP/1.0408nullMozilla/5.0(Windows;U;WindowsNT5.1)Gecko/20070803Firefox/1.5.0.121523188120263其每个字段的说明如下:
2、数据采集:
不同的WebServer上都会部署一个Agent用于该Server上日志数据的采集,之后,不同WebServer的FlumeAgent采集的日志数据会下沉到另外一个被称为FlumeConsolidationAgent(聚合Agent)的FlumeAgent上,该FlumeAgent的数据落地方式为输出到HDFS。
刚刚采集到HDFS中的原生数据,我们也称为不规整数据,即目前来说,该数据的格式还无法满足我们对数据处理的基本要求,需要对其进行预处理,转化为我们后面工作所需要的较为规整的数据,所以这里的数据清洗,其实指的就是对数据进行基本的预处理,以方便我们后面的统计分析,所以这一步并不是必须的,需要根据不同的业务需求来进行取舍,只是在我们的场景中需要对数据进行一定的处理。
原来的日志数据格式是如下的:
所以按照上面的分析,我们希望预处理之后的日志数据包含如下的数据字段:
我们采用MapReduce来对数据进行预处理,预处理之后的结果,我们也是保存到HDFS中,即采用如下的架构:
数据清洗的过程主要是编写MapReduce程序,而MapReduce程序的编写又分为写Mapper、Reducer、Job三个基本的过程。但是在我们这个案例中,要达到数据清洗的目的,实际上只需要Mapper就可以了,并不需要Reducer,原因很简单,我们只是预处理数据,在Mapper中就已经可以对数据进行处理了,其输出的数据并不需要进一步经过Redcuer来进行汇总处理。
所以下面就直接编写Mapper和Job的程序代码。
将上面的mr程序打包后上传到我们的Hadoop环境中,这里,对2018-04-08这一天产生的日志数据进行清洗,执行如下命令:
yarnjardata-extract-clean-analysis-1.0-SNAPSHOT-jar-with-dependencies.jar\cn.xpleaf.dataClean.mr.job.AccessLogCleanJob\hdfs://ns1/input/data-clean/access/2018/04/08\hdfs://ns1/output/data-clean/access观察其执行结果:
......18/04/0820:54:21INFOmapreduce.Job:Runningjob:job_1523133033819_000918/04/0820:54:28INFOmapreduce.Job:Jobjob_1523133033819_0009runninginubermode:false18/04/0820:54:28INFOmapreduce.Job:map0%reduce0%18/04/0820:54:35INFOmapreduce.Job:map50%reduce0%18/04/0820:54:40INFOmapreduce.Job:map76%reduce0%18/04/0820:54:43INFOmapreduce.Job:map92%reduce0%18/04/0820:54:45INFOmapreduce.Job:map100%reduce0%18/04/0820:54:46INFOmapreduce.Job:Jobjob_1523133033819_0009completedsuccessfully18/04/0820:54:46INFOmapreduce.Job:Counters:31......可以看到MapReduceJob执行成功!
经过数据清洗之后,就得到了我们做数据的分析统计所需要的比较规整的数据,下面就可以进行数据的统计分析了,即按照业务需求,统计出某一天中每个省份的PV和UV。
我们依然是需要编写MapReduce程序,并且将数据保存到HDFS中,其架构跟前面的数据清洗是一样的:
现在我们已经得到了规整的数据,关于在于如何编写我们的MapReduce程序。
因为要统计的是每个省对应的pv和uv,pv就是点击量,uv是独立访客量,需要将省相同的数据拉取到一起,拉取到一块的这些数据每一条记录就代表了一次点击(pv+1),这里面有同一个用户产生的数据(通过mid来唯一地标识是同一个浏览器,用mid进行去重,得到的就是uv)。
而拉取数据,可以使用Mapper来完成,对数据的统计(pv、uv的计算)则可以通过Reducer来完成,
即Mapper的各个参数可以为如下:
Mapper
Reducer
将上面的mr程序打包后上传到我们的Hadoop环境中,这里,对前面预处理之后的数据进行统计分析,执行如下命令:
yarnjardata-extract-clean-analysis-1.0-SNAPSHOT-jar-with-dependencies.jar\cn.xpleaf.dataClean.mr.job.ProvincePVAndUVJob\hdfs://ns1/output/data-clean/access\hdfs://ns1/output/pv-uv观察其执行结果:
......18/04/0822:22:42INFOmapreduce.Job:Runningjob:job_1523133033819_001018/04/0822:22:49INFOmapreduce.Job:Jobjob_1523133033819_0010runninginubermode:false18/04/0822:22:49INFOmapreduce.Job:map0%reduce0%18/04/0822:22:55INFOmapreduce.Job:map50%reduce0%18/04/0822:22:57INFOmapreduce.Job:map100%reduce0%18/04/0822:23:03INFOmapreduce.Job:map100%reduce100%18/04/0822:23:03INFOmapreduce.Job:Jobjob_1523133033819_0010completedsuccessfully18/04/0822:23:03INFOmapreduce.Job:Counters:49......可以看到MapReduceJob执行成功!
我们可以下载其结果数据文件,并用Notepadd++打开查看其数据信息:
至此,就完成了一个完整的数据采集、清洗、处理的完整离线数据分析案例。