当前位置:首页 > 资讯 > 正文

2021-02-08/09 大数据课程笔记 day19day20 某大型网站日志分析离线系统

2021-02-08/09 大数据课程笔记 day19day20  某大型网站日志分析离线系统

概述

该部分的主要目标就是描述本次项目最终七个分析模块的界面展示。

工作流

分析

总述

在本次项目中我们分别从七个大的角度来进行分析,分别为:

 

下面就每个模块进行最终展示的分析。
注意几个概念:

  1. 用户/访客:表示同一个浏览器代表的用户。唯一标示用户
  2. 会员:表示网站的一个正常的会员用户。
  3. 会话:一段时间内的连续操作,就是一个会话中的所有操作。
  4. PV:访问页面的数量 pageview
  5. 在本次项目中,所有的计数都是去重过的。比如:活跃用户/访客,计算 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 中。

数据参数说明
  1. 创建 my.js,在 index.jsp 中通过 script 标签引入:
 
  1. 编辑 my.js
 

三种方式逐步递进,演示后面的时候,需要将前面的内容注释掉。

  1. 然后阅读 analytics.js 的 CookieUtil ,编写代码学习:
    将 my.js 的其它代码都注释掉,并添加以下代码:
 

然后测试。CookieUtil 具体的代码先不用研究。
4. var tracker 分析

 
  1. window.AE
  2. autoLoad()阅读相关的代码,onLaunch事件、onPageView事件会自动触发。
  3. onChargeRequest事件在demo2.jsp中点击按钮触发
  4. onEventDuration事件在demo3.jsp中点击按钮触发
Java代码分析

AnalyticsEngineSDK、SendDataMonitor 看明白之后,运行 Test 类看控制台信息。

安装 nginx 或者 tengine

  1. 安装依赖
    安装:
  2. 上传与解压
  3. 配置 Nginx
    https://blog.csdn.net/qq_44745905/article/details/configure
  4. 编译与安装
    make && make install
    默认安装目录:
    /usr/local/nginx

配置 nginx 的 init 启动服务

  1. 在/etc/init.d/目录新建nginx,编辑如下内容:
 
 
 
  1. 并赋予可执行权限:
 
  1. 添加该文件到系统服务中去
 
  1. 查看是否添加成功
 
  1. 启动,停止,重新装载
 
  1. 设置开机启动 nginx
 
  1. 测试,打开浏览器,输入:http://192.168.20.71/ 出现 tengine 欢迎页面表示安装配置成功

日志定义

查看默认记录的日志
 
配置 tengine 的日志格式

官方文档地址:

 

http_host 显示服务器所在的地址
编辑 nginx.conf 文件:

 
 

重启加载 nginx

 
测试
  1. 查看新指定的日志目录和日志文件是否新建成功
 
  1. 测试日志是否记录:
    404 解决办法,在目录下上传一张 log.gif 图片:

Flume概述:

介绍
  1. 查看帮助
 
  1. 启动
 
 
  1. 打开一个连接 node2 的 xshell 终端,安装 telnet
 
  1. 查看 node1 的变化
 
  1. 启动 node3 上的 flume (由于 node1 发送给 node3 所以先启动 node3)
 

再复制一个 xshell 终端:

 
  1. 启动 node1 上的 flume
 
  1. Node2 上发消息给 node1
 
  1. Node1 上没有显示信息,而是 node3 上显示信息,这是因为 node1 接收到消息后,传递给了 node3
 

具体实现步骤:

  1. 先停掉 node1 和 node3 上的 flume
  2. 将 node1 上的 option.properties 拷贝 option_exec.properties ,并修改:
 
  1. 启动 node1 上的 flume
 
  1. 复制一个 node1 连接的 xshell 终端
 
  1. 然后在启动 flume 的终端中查看信息
 
Spooling Directory Source 案例
 

fileHeader 值为 true 表示显示信息从哪个文件中读取的,false 不显示。
具体配置步骤:

  1. 先停掉node1上的flume(ctrl+c)
  2. 将node1上的 拷贝,并修改:
 
  1. 启动 node1 上的 flume
 

启动后抛出以下异常:

 

这是因为目录没有创建,创建目录后再次启动,则解决了。

 
  1. 复制一个 node1 连接的 xshell 终端,/root/log 目录下拷贝文本文件
 
  1. 然后在启动 flume 的终端中查看信息
 
  1. 然后 cd 到 /root/log 目录下查看信息
 
  1. 先停掉 node1 上的 flume(ctrl+c)
  2. 修改
 
  1. 启动 node1 上的 flume
 

文件又被重新加载了依次。

  1. 进入 /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 上创建一个新的文件夹

  1. 启动 hadoop 集群上的 hdfs
  2. 先停掉 node1 上的 flume(ctrl+c)
  3. 将 node1 上的 option_sdir.properties 拷贝 option_hdfs1.properties,并修改:
 
 
  1. 启动 node1 上的 flume
 
  1. 通过浏览器访问 hdfs 目录,发现 /flume 并不存在。
  2. 复制一个 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
  1. Logger Sink
  2. Avro Sink(使用较多)
  3. Thrift Sink(使用较多)
 
  1. File Roll Sink
  2. ElasticSearchSink(使用较多)
  3. Kafka Sink(使用较多)

flume channel

  1. Memory Channel
 
  1. JDBC Channel
 
  1. File Channel
    磁盘上的某个文件,速度较慢。
  2. Kafka Channel

思考:
1、flume 如何收集 java 请求数据?
2、项目当中如何来做? 日志存放 /log/ 目录下 以 yyyyMMdd 为子目录 分别存放每天的数据

flume 应用在项目中的配置

  1. node1 上创建配置文件 project
 
  1. 启动 node1 上 flume
  1. 解压 flume 包拷贝 lib 下的所有 jar 包到项目的 lib 文件夹下
  2. 选择 Idea 项目中 lib 文件夹–>右键–>Add as Library
  3. 将类中的注释去掉,并修改端口
    client.init(“node3”, 10086);
    代码分析 AvroClient
  4. 启动 node3 上的 flume:
 
  1. 运行AvroClient.java类
  2. 查看node3上flume日志

解析思路:

  1. 通过^A进行拆分,不足四部分的数据不符合要求,过滤掉。
  2. ?后面的内容按照 & 进行拆分,参数en的值如果不是6种事件类型的过滤掉。
 

================================================
192.168.100.1 换算成地域
1574736498.958 时间
浏览器相关信息提取处理

项目搭建

  1. 将代码 /big_data_etl.zip 解压到项目 logpro 目录下
  2. 使用已存在的 big_data_etl 创建 Module。

解析IP地址到地域