
概述
该部分的主要目标就是描述本次项目最终七个分析模块的界面展示。
工作流
分析
总述
在本次项目中我们分别从七个大的角度来进行分析,分别为:
下面就每个模块进行最终展示的分析。
注意几个概念:
- 用户/访客:表示同一个浏览器代表的用户。唯一标示用户
- 会员:表示网站的一个正常的会员用户。
- 会话:一段时间内的连续操作,就是一个会话中的所有操作。
- PV:访问页面的数量 pageview
- 在本次项目中,所有的计数都是去重过的。比如:活跃用户/访客,计算 uuid 的去重后的个数。
用户基本信息分析模块
用户基本信息分析模块主要是从用户/访客和会员两个主要角度分析浏览相关信息,包括但不限于新增用户,活跃用户,总用户,新增会员,活跃会员,总会员以及会话分析等。下面就各个不同的用户信息角度来进行分析:
用户分析
该分析主要分析新增用户、活跃用户以及总用户的相关信息。
新访客:老访客(活跃访客中) = 1:7~10
活跃用户,是相对于“流失用户”的一个概念,是指那些会时不时地光顾下网站,并为网站带来一些价值的用户。
简单理解就是经常访问该网站的用户,如浏览商品了,下单了,收藏了等行为。
会员分析
会话分析
Hourly分析
浏览器信息分析模块
在用户基本信息分析的基础上添加一个浏览器这个维度信息。
浏览器用户分析
浏览器会员分析
浏览器会话分析
浏览器 PV 分析
地域信息分析模块
主要分析各个不同省份的用户和会员情况。
活跃访客地域分析
跳出率分析
分析各个不同地域的跳出率情况。
用户访问深度分析模块
该模块主要分析用户的访问记录的深度,用户在一个会话中访问页面的数量。
外链数据分析模块
主要分析各个不同外链端带来的用户访问量数据。
外链就是指在别的网站导入自己网站的链接。导入链接对于网站优化来说是非常重要的一个过程。导入链接的质量(即导入链接所在页面的权重)间接影响了我们的网站在搜索引擎中的权重。
意义在于要不要做这个外链推广。
外链偏好分析
外链会话(跳出率)分析
订单数据分析模块
事件分析模块
虚拟机分配:
node1 |
hadoop,hbase,mysql-server,nginx,flume |
node2 |
hadoop,hbase,zookeeper,hiveserver2 |
node3 |
hadoop,hbase,zookeeper,hiveserver2,sqoop, |
node4 |
hadoop,hbase,zookeeper,beeline |
概述
该文档的主要作用是为了开发人员参考可以参考本文档,了解 js sdk 的集成方式以及提供的各种不同的 api。
注意:不采用 ip 来标示用户的唯一性,我们通过在 cookie 中填充一个 uuid 来标示用户的唯一性。
埋点:
初级埋点:在产品流程关键部位植相关统计代码,用来追踪每次用户的行为,统计关键流程的使用程度。
中级埋点:植入多段动作代码,追踪用户在该模块每个界面上的系列行为,事件之间相互独立
高级埋点:联合公司工程、ETL 采集分析用户全量行为,建立用户画像,还原用户行为模型,作为产品分析、优化的基础。
Js sdk 执行工作流
数据参数说明
在各个不同事件中收集不同的数据发送到 nginx 服务器,但是实际上这些收集到的数据还是有一些共性的。下面将所用可能用到的参数描述如下:
参数名称 |
类型 |
描述 |
en |
string |
事件名称, eg: e_pv |
ver |
string |
版本号, eg: 0.0.1 |
pl |
string |
平台, eg: website,iso,android |
sdk |
string |
Sdk类型, eg: js java |
b_rst |
string |
浏览器分辨率,eg: 1800*678 |
b_iev |
string |
浏览器信息useragent 火狐控制台输入:window.navigator.userAgent"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0" |
u_ud |
string |
用户/访客唯一标识符 |
l |
string |
客户端语言 |
u_mid |
string |
会员id,和业务系统一致 |
u_sd |
string |
会话id |
c_time |
string |
客户端时间 |
p_url |
string |
当前页面的url |
p_ref |
string |
上一个页面的url |
tt |
string |
当前页面的标题 |
ca |
string |
Event事件的Category名称 |
ac |
string |
Event事件的action名称 |
kv_* |
string |
Event事件的自定义属性 |
du |
string |
Event事件的持续时间 |
oid |
string |
订单id |
on |
string |
订单名称 |
cua |
string |
支付金额 |
cut |
string |
支付货币类型 |
pt |
string |
支付方式 |
PC 端事件分析
Launch 事件
Pageview 事件
chargeRequest 事件
Event 事件
其他 api 方法
概述
该文档的主要作用是为了开发人员参考可以参考本文档,了解 java sdk 的集成方式以及提供的各种不同的方法。注意:由于在本次项目中 java sdk 的作用主要就是发送支付成功/退款成功的信息给 nginx 服务器,所有我们这里提供的是一个简单版本的 java sdk。
Java sdk 执行工作流
程序后台事件分析
chargeSuccess 事件
参数 |
类型 |
是否必填 |
描述 |
orderId |
string |
是 |
订单id |
memberId |
string |
是 |
会员id |
集成方式
直接将 java 的 sdk 引入到项目中即可,或者添加到 classpath 中。
数据参数说明
- 创建 my.js,在 index.jsp 中通过 script 标签引入:
- 编辑 my.js
三种方式逐步递进,演示后面的时候,需要将前面的内容注释掉。
- 然后阅读 analytics.js 的 CookieUtil ,编写代码学习:
将 my.js 的其它代码都注释掉,并添加以下代码:
然后测试。CookieUtil 具体的代码先不用研究。
4. var tracker 分析
- window.AE
- autoLoad()阅读相关的代码,onLaunch事件、onPageView事件会自动触发。
- onChargeRequest事件在demo2.jsp中点击按钮触发
- onEventDuration事件在demo3.jsp中点击按钮触发
Java代码分析
AnalyticsEngineSDK、SendDataMonitor 看明白之后,运行 Test 类看控制台信息。
安装 nginx 或者 tengine
- 安装依赖
安装:
- 上传与解压
- 配置 Nginx
https://blog.csdn.net/qq_44745905/article/details/configure
- 编译与安装
make && make install
默认安装目录:
/usr/local/nginx
配置 nginx 的 init 启动服务
- 在/etc/init.d/目录新建nginx,编辑如下内容:
- 并赋予可执行权限:
- 添加该文件到系统服务中去
- 查看是否添加成功
- 启动,停止,重新装载
- 设置开机启动 nginx
- 测试,打开浏览器,输入:http://192.168.20.71/ 出现 tengine 欢迎页面表示安装配置成功
日志定义
查看默认记录的日志
配置 tengine 的日志格式
官方文档地址:
http_host 显示服务器所在的地址
编辑 nginx.conf 文件:
重启加载 nginx
测试
- 查看新指定的日志目录和日志文件是否新建成功
- 测试日志是否记录:
404 解决办法,在目录下上传一张 log.gif 图片:
Flume概述:
介绍
- 查看帮助
- 启动
- 打开一个连接 node2 的 xshell 终端,安装 telnet
- 查看 node1 的变化
- 启动 node3 上的 flume (由于 node1 发送给 node3 所以先启动 node3)
再复制一个 xshell 终端:
- 启动 node1 上的 flume
- Node2 上发消息给 node1
- Node1 上没有显示信息,而是 node3 上显示信息,这是因为 node1 接收到消息后,传递给了 node3
具体实现步骤:
- 先停掉 node1 和 node3 上的 flume
- 将 node1 上的 option.properties 拷贝 option_exec.properties ,并修改:
- 启动 node1 上的 flume
- 复制一个 node1 连接的 xshell 终端
- 然后在启动 flume 的终端中查看信息
Spooling Directory Source 案例
fileHeader 值为 true 表示显示信息从哪个文件中读取的,false 不显示。
具体配置步骤:
- 先停掉node1上的flume(ctrl+c)
- 将node1上的 拷贝,并修改:
- 启动 node1 上的 flume
启动后抛出以下异常:
这是因为目录没有创建,创建目录后再次启动,则解决了。
- 复制一个 node1 连接的 xshell 终端,/root/log 目录下拷贝文本文件
- 然后在启动 flume 的终端中查看信息
- 然后 cd 到 /root/log 目录下查看信息
- 先停掉 node1 上的 flume(ctrl+c)
- 修改
- 启动 node1 上的 flume
文件又被重新加载了依次。
- 进入 /root/log 目录查看
flume sinks
HDFS Sink (使用较多)
别名 |
描述 |
%t |
Unix时间戳,毫秒 |
%{host} |
替换名为"host"的事件header的值。支持任意标题名称。 |
%a |
星期几的短名,即Mon, Tue, … |
%A |
星期几的全名,即Monday, Tuesday, … |
%b |
月份短名,即Jan, Feb, … |
%B |
月份全名,即January, February, … |
%c |
时间和日期,即Thu Mar 3 23:05:25 2005 |
%d |
day of month (01) |
%e |
day of month without padding (1) |
%D |
date; same as %m/%d/%y |
%H |
hour (00…23) |
%I |
hour (01…12) |
%j |
day of year (001…366) |
%k |
小时 ( 0…23) |
%m |
月份 (01…12) |
%n |
不加前缀的月份 (1…12) |
%M |
分钟(00…59) |
%p |
locale’s equivalent of am or pm |
%s |
seconds since 1970-01-01 00:00:00 UTC |
%S |
second (00…59) |
%y |
年份最后两位 (00…99) |
%Y |
year (2010) |
%z |
+hhmm数字时区 (for example, -0400) |
属性名称 |
默认值 |
说明 |
channel |
- |
|
type |
- |
组件类型名称,必须是 hdfs |
hdfs.path |
- |
HDFS路径,如hdfs://mycluster/flume/mydata |
hdfs.filePrefix |
FlumeData |
flume在hdfs目录中创建文件的前缀 |
hdfs.fileSuffix |
- |
flume在hdfs目录中创建文件的后缀。 |
hdfs.inUsePrefix |
- |
flume正在写入的临时文件的前缀 |
hdfs.inUseSuffix |
.tmp |
flume正在写入的临时文件的后缀 |
hdfs.rollInterval |
30 |
多长时间写一个新的文件 (0 = 不写新的文件),单位秒 |
hdfs.rollSize |
1024 |
文件多大写新文件单位字节(0: 不基于文件大小写新文件) |
hdfs.rollCount |
10 |
当写一个新的文件之前要求当前文件写入多少事件(0 = 不基于事件数写新文件) |
hdfs.idleTimeout |
0 |
多长时间没有新增事件则关闭文件(0 = 不自动关闭文件)单位为秒 |
hdfs.batchSize |
100 |
写多少个事件开始向HDFS刷数据 |
hdfs.codeC |
- |
压缩格式:gzip, bzip2, lzo, lzop, snappy |
hdfs.fileType |
SequenceFile |
当前支持三个值:SequenceFile,DataStream,CompressedStream。(1)DataStream不压缩输出文件,不要设置codeC (2)CompressedStream 必须设置codeC |
hdfs.maxOpenFiles |
5000 |
最大打开多少个文件。如果数量超了则关闭最旧的文件 |
hdfs.minBlockReplicas |
- |
对每个hdfs的block设置最小副本数。如果不指定,则使用hadoop的配置的值。1 |
hdfs.writeFormat |
- |
对于sequence file记录的类型。Text或者Writable(默认值) |
hdfs.callTimeout |
10000 |
为HDFS操作如open、write、flush、close准备的时间。如果HDFS操作很慢,则可以设置这个值大一点儿。单位毫秒 |
hdfs.threadsPoolSize |
10 |
每个HDFS sink的用于HDFS io操作的线程数 (open, write, etc.) |
hdfs.rollTimerPoolSize |
1 |
每个HDFS sink使用几个线程用于调度计时文件滚动。 |
hdfs.round |
false |
支持文件夹滚动的属性。是否需要新建文件夹。如果设置为true,则会影响所有的基于时间的逃逸字符,除了%t。 |
hdfs.roundValue |
1 |
该值与roundUnit一起指定文件夹滚动的时长,会四舍五入 |
hdfs.roundUnit |
second |
控制文件夹个数。多长时间生成新文件夹。可以设置为- second, minute 或者 hour. |
hdfs.timeZone |
Local Time |
Name of the timezone that should be used for resolving the directory path, e.g. America/Los_Angeles. |
hdfs.useLocalTimeStamp |
false |
一般设置为true,使用本地时间。如果不使用本地时间,要求flume发送的事件header中带有时间戳。该时间用于替换逃逸字符 |
案例1:每 5 秒在 hdfs 上创建一个新的文件夹
- 启动 hadoop 集群上的 hdfs
- 先停掉 node1 上的 flume(ctrl+c)
- 将 node1 上的 option_sdir.properties 拷贝 option_hdfs1.properties,并修改:
- 启动 node1 上的 flume
- 通过浏览器访问 hdfs 目录,发现 /flume 并不存在。
- 复制一个 node1 连接的 xshell 终端,/root/log 目录下拷贝文本文件
案例3:五秒写入到一个文件中
Hive Sink (使用较多)
属性名 |
默认值 |
说明 |
channel |
- |
|
type |
- |
组件类型名称,必须是 hive |
hive.metastore |
- |
元数据仓库地址,如 thrift://node3:9083 |
hive.database |
- |
数据库名称 |
hive.table |
- |
表名 |
hive.partition |
- |
逗号分割的分区值,标识写到哪个分区 可以包含逃逸字符 如果表分区字段为: |
callTimeout |
10000 |
Hive和HDFS的IO操作超时时间,比如openTxn,write,commit,abort等操作。单位毫秒 |
batchSize |
15000 |
一个hive的事务允许写的事件最大数量。 |
roundUnit |
minute |
控制多长时间生成一个文件夹的单位:second,minute,hour |
HBase Sink (使用较多)
属性名称 |
默认值 |
描述 |
channel |
- |
|
type |
- |
组件类型名称,必须是hbase |
table |
- |
hbase的表名 |
columnFamily |
- |
列族的名称 |
zookeeperQuorum |
- |
对应于hbase-site.xml中hbase.zookeeper.quorum的值,指定zookeeper集群地址列表。 |
其它 Sink
- Logger Sink
- Avro Sink(使用较多)
- Thrift Sink(使用较多)
- File Roll Sink
- ElasticSearchSink(使用较多)
- Kafka Sink(使用较多)
flume channel
- Memory Channel
- JDBC Channel
- File Channel
磁盘上的某个文件,速度较慢。
- Kafka Channel
思考:
1、flume 如何收集 java 请求数据?
2、项目当中如何来做? 日志存放 /log/ 目录下 以 yyyyMMdd 为子目录 分别存放每天的数据
flume 应用在项目中的配置
- node1 上创建配置文件 project
- 启动 node1 上 flume
- 解压 flume 包拷贝 lib 下的所有 jar 包到项目的 lib 文件夹下
- 选择 Idea 项目中 lib 文件夹–>右键–>Add as Library
- 将类中的注释去掉,并修改端口
client.init(“node3”, 10086);
代码分析 AvroClient
- 启动 node3 上的 flume:
- 运行AvroClient.java类
- 查看node3上flume日志
解析思路:
- 通过^A进行拆分,不足四部分的数据不符合要求,过滤掉。
- ?后面的内容按照 & 进行拆分,参数en的值如果不是6种事件类型的过滤掉。
================================================
192.168.100.1 换算成地域
1574736498.958 时间
浏览器相关信息提取处理
项目搭建
- 将代码 /big_data_etl.zip 解压到项目 logpro 目录下
- 使用已存在的 big_data_etl 创建 Module。
解析IP地址到地域