SEO外包平台,我们为您提供专业的企业网站SEO整站优化外包服务 SEO设置

SEO外包平台

专注于企业网站SEO整站优化外包服务

大数据-实战-电商日志分析项目

作者:jcmp      发布时间:2021-04-13      浏览量:0
1 需求分析站长工具: http:/

1 需求分析

站长工具: http://seo.chinaz.com/

项目模块

用户基本信息分析

新增访客 活跃访客 总访客 新增会员 活跃会员 总会员 指标不能脱离维度。

浏览器分析

在用户基本信息分析基础上增加浏览器维度 -> 维度组合 某指标在多个模块出现 -> 合并MR。

地域信息分析

请求中包含ip -> 解析 -> 描点 手机定位(可能被禁止)。

订单分析

总数 成功数 退款数...

2 数据源

分析数据不能影响web系统 js埋点 nginx拿ip地址,请求封装 数据最终落地hdfs。

数据

en 事件名称 ver 版本号 pl 平台 sdk sdk类型 b_rst 浏览器分辨率 b_iev 浏览器信息 u_ud 用户\访客唯一标示 l 客户端语言 u_mid 会员id u_sd 会话id c_time 客户端时间 p_url 当前页面url p_ref 上一页面url tt 当前页面标题 ca event事件的catagory名称 ac event事件的action名称 kv_* event事件的自定义属性 du event事件的持续时间 oid 订单id on 订单名称 cua 支付金额。

launch事件

页面加载时触发 新增用户使用

pageview事件

用户访问或刷新页面时触发

chargeRequest事件

下订单时程序主动调用

event事件

访客或用户调用业务事件触发

javasdk

支付成功事件等 web系统和nginx系统可能不在同一机器,走网络可能网络延迟断开等导致web系统阻塞 -> 异步。

3 架构图

7 edraw max画架构图 start uml画时序图 etl -> 存储 -> 分析(mr hive) -> mysql。

java-sdk异步发送,队列保证顺序,队列满阻塞问题 nginx获取ip保存到本地log flume监控本地log -> hdfs hdfs按时间目录存放,flume可以自动在hdfs中创建文件夹 ip解析可以放到etl中 第三方工具分析ua获得浏览器信息 rowkey设计 筛选hbase数据进行mr分析 mr实现OutputFormat类写入mysql sqoop可以把mysql和hive的数据双向导入,基于mr hive和hbase进行列映射,hive直接操作hbase避免数据冗余。

4 nginx记录日志

<>

安装nginx

tar -zxvf tengine-2.1.0.tar.gzyum install gcc pcre-devel openssl-devel -y./configuremake && make installcd /usr/local/nginx/sbin./nginx# 修改配置文件------------http {... log_format my_format ... server {... location = /log.gif { default_type image/gif; access_log /opt/data/access.log my_format; }------------cd /etc/rc.d/init.dvi nginx------------#!/bin/sh## nginx - this script starts and stops the nginx daemon## chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \# proxy and IMAP/POP3 proxy server# processname: nginx# config: /etc/nginx/nginx.conf# config: /etc/sysconfig/nginx# pidfile: /var/run/nginx.pid # Source function library.. /etc/rc.d/init.d/functions # Source networking configuration.. /etc/sysconfig/network # Check that networking is up.[ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/local/nginx/sbin/nginx"prog=$(basename $nginx) NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` options=`$nginx -V 2>&1 | grep 'configure arguments:'` for opt in $options; do if [ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done} start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval} stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval} restart() { configtest || return $? stop sleep 1 start} reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo} force_reload() { restart} configtest() { $nginx -t -c $NGINX_CONF_FILE} rh_status() { status $prog} rh_status_q() { rh_status >/dev/null 2>&1} case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2esac------------chmod +x nginxchkconfig --add nginxsystemctl restart nginx &

5 flume日志收集

http://flume.apache.org/ flume source可以配多个web节点,flume会有单点故障问题 可以向不同目的地发送数据(配置kafka) 一般与kafka组合使用 使用rpc从java中取数据。

单节点配置

tar -zxvf apache-flume-1.6.0-bin.tar.gzcp flume-env.sh.template flume-env.shvi flume-env.sh---------export JAVA_HOME=/opt/java--------vi /etc/profileflume-ng version# 创建flume配置文件vi /root/flumedir/option--------a1.sources = r1a1.sinks = k1a1.channels = c1a1.sources.r1.type = netcata1.sources.r1.bind = node-02a1.sources.r1.port = 44444a1.sinks.k1.type = loggera1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100a1.sources.r1.channels = c1a1.sinks.k1.channel = c1 flume-ng agent --conf-file option --name a1 -Dflume.root.logger=INFO,console--------# node-03测试flumeyum install -y telnettelnet node-02 44444。

配置双节点

# 修改node-02 option--------a1.sources = r1a1.sinks = k1a1.channels = c1a1.sources.r1.type = netcata1.sources.r1.bind = node-02a1.sources.r1.port = 44444a1.sinks.k1.type = avroa1.sinks.k1.hostname = node-03a1.sinks.k1.port = 10086a1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100a1.sources.r1.channels = c1a1.sinks.k1.channel = c1 flume-ng agent --conf-file option --name a1 -Dflume.root.logger=INFO,console--------# 修改node-03 option--------a1.sources = r1a1.sinks = k1a1.channels = c1a1.sources.r1.type = avroa1.sources.r1.bind = node-03a1.sources.r1.port = 10086a1.sinks.k1.type = loggera1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100a1.sources.r1.channels = c1a1.sinks.k1.channel = c1 flume-ng agent --conf-file option --name a1 -Dflume.root.logger=INFO,console--------

监控文件配置

# vi option3------------a1.sources = r1a1.sinks = k1a1.channels = c1a1.sources.r1.type = execa1.sources.r1.command = tail -F /root/dfun.loga1.sinks.k1.type = avroa1.sinks.k1.hostname = node-03a1.sinks.k1.port = 10086a1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100a1.sources.r1.channels = c1a1.sinks.k1.channel = c1 flume-ng agent --conf-file option --name a1 -Dflume.root.logger=INFO,console-----------touch /root/dfun.log# dfun.log复制多行:.,$y# 粘贴p。

从目录读取

a1.sources = r1a1.sinks = k1a1.channels = c1a1.sources.r1.type = spooldira1.sources.r1.channels = ch-1a1.sources.r1.spoolDir = /root/abca1.sources.r1.fileHeader = falsea1.sinks.k1.type = loggera1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100a1.sources.r1.channels = c1a1.sinks.k1.channel = c1 flume-ng agent --conf-file option --name a1 -Dflume.root.logger=INFO,console。

上传到hdfs

-----------a1.sources = r1a1.sinks = k1a1.channels = c1a1.sources.r1.type = execa1.sources.r1.command = tail -F /root/dfun.loga1.sinks.k1.type = hdfsa1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%Sa1.sinks.k1.hdfs.filePrefix = events-a1.sinks.k1.hdfs.round = truea1.sinks.k1.hdfs.roundValue = 10a1.sinks.k1.hdfs.roundUnit = minutea1.sinks.k1.hdfs.useLocalTimeStamp = truea1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100a1.sources.r1.channels = c1a1.sinks.k1.channel = c1------------# 追加文件内容,查看hdfs创建情况echo "hello dfun hello flume" >> dfun.log。

6 ETL

nginx log写入hdfs

# flume配置--------------a1.sources = r1a1.sinks = k1a1.channels = c1a1.sources.r1.type = execa1.sources.r1.command = tail -F /opt/data/access.loga1.sinks.k1.type = hdfsa1.sinks.k1.hdfs.path = hdfs://dfun/log/%Y%m%da1.sinks.k1.hdfs.rollCount = 0a1.sinks.k1.hdfs.rollInterval = 0a1.sinks.k1.hdfs.rollSize = 10240a1.sinks.k1.hdfs.idleTimeout = 5a1.sinks.k1.hdfs.fileType = DataStreama1.sinks.k1.hdfs.useLocalTimeStamp = truea1.channels.c1.type = memorya1.channels.c1.capacity = 1000a1.channels.c1.transactionCapacity = 100a1.sources.r1.channels = c1a1.sinks.k1.channel = c1-----------# 浏览器访问页面,日志写入hdfs。

ip免费地址库: http://ip.taobao.com/ 系统不要依赖于第三方网站服务,可以把数据库down下来。