大数据离线项目实践之sdk数据收集

大数据
后台-插件-广告管理-内容页头部广告(手机)

数据收集的方案

收集的方式:通过在客户端嵌入SDK的方式收集用户行为数据(SDK:一段收集数据的代码,放到客户端)

以事件作为数据收集的最小单位,当用户在系统或者APP上触发定义的事件的时候,产生数据,SDK将产生的数据发送到Nginx服务器上(通过url发送)

js sdk的事件(模拟前端)

launch事件:标识访客第一次访问的事件

pageView事件:标识用户浏览页面的事件

event事件:包容性最强的事件

chargeRequest事件:标识订单产生事件

找到我们的项目中的文件analytics.js,阅读分析下

 

修改这个地址

 

部署启动访问

http://localhost:8080/sdk_test/

 

后台监控nginx的日志

 

点击页面

 

观察后台日志,有新的日志出现

 

java sdk的事件(模拟后端)

chargeSuccess事件:标识订单支付成功事件

chargeRefund事件:标识订单退款事件

 

修改机器IP

 

启动主方法

 

同样检测nginx日志,发现日志也在读取

 

这就是模拟前后端的日志采集,但是目前日志显示不是很清晰,这就需要我们修改nginx的日志产生格式了

修改linux中nginx日志产生的格式

$remote_addr ---- ip地址

$msec ----访问时间,时间戳,毫秒

$request_uri ---用户请求参数,从客户端捕获到的用户行为数据都会封装到这个字段里

$remote_addr^A$msec^A$request_uri

同时将下面的日志生成目录放开

access_log logs/access.log main;

 

sbin/nginx -t 检测nginx.conf是否配置ok

 

定义好后重启Nginx服务器

sbin/nginx -s reload

 

我们重新点击页面采集下数据

 

查看日志的变化

 

我们可以将项目部署到虚拟机中使用

我们再虚拟机中准备一个Tomcat

 

解压

tar -zxvf apache-tomcat-8.5.24.tar.gz -C /opt/bigdata/

 

将项目打包sdk_test.war

 

将sdk_test.war拷贝到Tomcat下webapps目录

cp sdk_test.war /opt/bigdata/apache-tomcat-8.5.24/webapps/

 

启动tomcat

bin/startup.sh

 

重新查看webapps,多了sdk_test

 

在浏览器访问

http://masterhbase:8080/sdk_test/demo.html

 

点击demo,后台日志也可以出现

 

数据上传

(1)shell脚本发送日志数据(日志量较小)

(2)flume上传到hdfs(日志量较大)

shell脚本发送日志数据

在nginx目录下创建一个目录:mkdir scripts

 

创建脚本:vim cut_nginx_log.sh

 

授权chmod 755 cut_nginx_log.sh

 

一些命令

date +"%Y%m%d" 今天的日期

date -d "1 day ago" +"%Y%m%d" 昨天的日期

date -d "-1 day" +"%Y%m%d" 昨天的日期

编写脚本

#!/bin/bash
#获取昨天日期
YESTERDAY=$(date -d "1 day ago" +"%Y%m%d")
#定义日志目录
DATALOG=/opt/bigdata/nginx-1.12.2/logs
#切割昨天的日志
/bin/mv ${DATALOG}/access.log ${DATALOG}/access_${YESTERDAY}.log
#重启Nginx服务器生产access.log文件
/opt/bigdata/nginx-1.12.2/sbin/nginx -s reload
 

执行下脚本,没出现问题

 

我们查看日志,已经被切割了

 

可以定义一个crontab定时任务

crontab -e

00 00 * * * /opt/bigdata/nginx-1.12.2/scripts/cut_nginx_log.sh

 

创建脚本:vim put_log_hdfs.sh

 

授权chmod 755 put_log_hdfs.sh

 

编写脚本

#!/bin/bash
#获取昨天日期
YESTERDAY=$(date -d "1 day ago" +"%Y%m%d")
#定义日志目录
DATALOG=/opt/bigdata/nginx-1.12.2/logs
#定义HADOOP_HOME
HADOOP_HOME=/opt/bigdata/hadoop-2.7.3
#将日志上传到hdfs
${HADOOP_HOME}/bin/hdfs dfs -put ${DATALOG}/access_${YESTERDAY}.log /nginx_log
 

执行脚本

 

查看HDFS上,数据已经上传

 

同样可以加入定时

定时执行crontab:crontab –e

00 01 * * * /opt/bigdata/nginx-1.12.2/scripts/put_log_hdfs.sh

这里就不写了

查看任务:crontab –l

需要重启crontab:service crond restart

 

flume上传到hdfs

创建flume配置文件

touch flume-nginx-hdfs.properties

 
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -f /opt/bigdata/nginx-1.12.2/logs/access_20200113.log
# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://masterhbase:8082/flume/nginxlog/roll/%y%m%d/%H
a1.sinks.k1.hdfs.rollInterval = 600
a1.sinks.k1.hdfs.rollSize = 1048576
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.minBlockReplicas = 1
a1.sinks.k1.hdfs.useLocalTimeStamp = true
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue= 1
a1.sinks.k1.hdfs.roundUnit = hour
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
 

source类:

exec 监控文件:access.log

Spooling Directory 监控目录:spoolDir=nginx-1.12.2/logs

channel类:

memory: 比较吃内存,但是速度比较快,数据不安全

file:文件比较安全,但是传输速度较慢

sink类:

hdfs:离线分析以及数据备份

kafka:流式计算 storm/spark

执行

bin/flume-ng agent -n a1 -c conf -f conf/flume-nginx-hdfs.properties -Dflume.root.logger=INFO,console

 

可以看到数据已经上传了

 
后台-插件-广告管理-内容页尾部广告(手机)
标签:

评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。