大数据离线----【网站流量日志数据--自定义】

37.大数据之旅——网站流量统计项目 网站流量统计案例概述 背景说明 网站流量统计是改进网站服务的重要手段之一,通过获取用户在网站的行为,可以分析出哪些内容受到欢迎,哪些页面存在问题,从而使网站改进活动更具有针对性。 统计指标说明 常用的网站流量统计指标一般包括以下情况分析: 1)按在线情况分析 在线情况分析分别记录在线用户的活动信息,包括:来访时间、访客地域、来路页面、当前停留页面等,这些功能对企业实时掌握自身网站流量有很大的帮助... 阅读详情

1. 原理分析

在这里插入图片描述

分析 :

  1. 在采集数据的网页上进行埋点(在网页中预先加入小段 javascript 代码) , 编写采集数据的js(该js一般再用一个服务器去存储 , 为的就是解耦合 , 便于修改)

  2. 通过img标签的src属性解决跨域问题<img src="http://collection.itcast.cn/log.gif?name=allen&item=001">将数据传递给后端服务器

  3. 后端服务器执行步骤

    3.1接受请求 , 响应图片(log.gif)

    3.2 解析参数 , 保存数据

    3.3 设置cookie

  4. 埋点的js代码通常使用匿名JS函数(JS匿名函数自调用 , 执行且只执行一次 , 通常用于在页面加载的初始化相关操作)

扩展知识:js 自调用匿名函数
格式: (function(){})();
第一对括号向脚本返回未命名的函数;后一对空括号立即执行返回的未命名函数,括号内为匿名函数的参数。
自调用匿名函数的好处是,避免重名,自调用匿名函数只会在运行时执行一次,一般用于初始化。

2 . 设计实现

在这里插入图片描述

  • 2.1 确定搜集信息
名称途径备注
访问时间web serverNginx $msec
IPweb serverNginx $remote_add
域名JavaScriptdocument.domain
URLJavaScriptdocument.URL
页面标题JavaScriptdocument.title
分辨率JavaScriptwindow.screen.height & width
颜色深度JavaScriptwindow.screen.colorDepth
ReferrerJavaScriptdocument.referrer
浏览客户端web serverNginx $http_user_agent
客户端语言JavaScriptnavigator.language
访客标识cookieNginx $http_cookie
网站标识JavaScript自定义对象
状态码web serverNginx $status
发送内容量web serverNginx $body_bytes_sent
  • 2.2 确定埋点代码

  • 2.3 前端数据收集脚本

  • 2.4 后端脚本

    nginx 的 的 access_log 做日志收集,不过有个问题就是 nginx 配置本身的逻辑表达能力有限,所以选用 OpenResty做这个事情。

    OpenResty 是一个基于 Nginx 扩展出的高性能应用开发平台,内部集成了诸多有用的模块,其中的核心是通过 ngx_lua 模块集成了 Lua,从而在 nginx 配置文件中可以通过 Lua 来表述业务。
    Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
    首先,需要在 nginx 的配置文件中定义日志格式:

log_format tick
"$msec||$remote_addr||$status||$body_bytes_sent||$u_domain||$u_url|
|$u_title||$u_referrer||$u_sh||$u_sw||$u_cd||$u_lang||$http_user_ag
ent||$u_account";
  • 2.5 日志格式

日志格式主要考虑日志分隔符,一般会有以下几种选择:
固定数量的字符、制表符分隔符、空格分隔符、其他一个或多个字符、特的开始和结束文本。

  • 2.6 日志切分

日志收集系统访问日志时间一长文件变得很大,而且日志放在一个文件不便于管理。通常要按时间段将日志切分,例如每天或每小时切分一个日志。通过crontab 定时调用一个 shell 脚本实现,如下:

vi rotatelog.sh
#!/bin/bash
_prefix="/path/to/nginx"
time=`date +%Y%m%d%H`
mv ${_prefix}/logs/ma.log ${_prefix}/logs/ma/ma-${time}.log
kill -USR1 `cat ${_prefix}/logs/nginx.pid `

USR1 通常被用来告知应用程序重载配置文件

cat ${_prefix}/logs/nginx.pid 取 nginx 的进程号

然后再/etc/crontab 里加入一行:

59 * * * * root /path/to/directory/rotatelog.sh

补充 :

  • cookie session

    cookie是浏览器端用于标识访客信息

    cookie值不能够重复

  • nginx日志默认一直写在同一个文件中 越来越大 不利于后续数据分析

    按时间 每小时切割一次

    按大小 每50M切割

3 . 系统环境部署细心 , 细心 ,再细心

所有软件都上传到/export/software下 , 选择node-3作为nginx服务器

服务器中安装依赖
yum -y install gcc perl pcre-devel openssl openssl-devel
上传 LuaJIT-2.0.4.tar.gz 并安装 LuaJIT
tar -zxvf LuaJIT-2.0.4.tar.gz -C /usr/local/src/
cd /usr/local/src/LuaJIT-2.0.4/
make && make install PREFIX=/usr/local/luajit
设置 LuaJIT 环境变量
vi /etc/profile
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
source /etc/profile
创建 modules 文件夹,保存 nginx 依赖的模块
mkdir -p /usr/local/nginx/modules
上传 nginx 依赖的模块

set-misc-nginx-module-0.29.tar.gz
lua-nginx-module-0.10.0.tar.gz
ngx_devel_kit-0.2.19.tar.gz
echo-nginx-module-0.58.tar.gz

将依赖的模块直接解压到 modules 目录
tar -zxvf lua-nginx-module-0.10.0.tar.gz -C /usr/local/nginx/modules/
tar -zxvf set-misc-nginx-module-0.29.tar.gz -C /usr/local/nginx/modules/
tar -zxvf ngx_devel_kit-0.2.19.tar.gz -C /usr/local/nginx/modules/
tar -zxvf echo-nginx-module-0.58.tar.gz -C /usr/local/nginx/modules/
安装 openresty
tar -zxvf openresty-1.9.7.3.tar.gz -C /usr/local/src/
cd /usr/local/src/openresty-1.9.7.3/
./configure --prefix=/usr/local/openresty --with-luajit && make && make install
安装 nginx
tar -zxvf nginx-1.8.1.tar.gz -C /usr/local/src/
编译 nginx 并支持其他模块
cd /usr/local/src/nginx-1.8.1/

./configure --prefix=/usr/local/nginx \
--with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" \
--add-module=/usr/local/nginx/modules/ngx_devel_kit-0.2.19 \
--add-module=/usr/local/nginx/modules/lua-nginx-module-0.10.0 \
--add-module=/usr/local/nginx/modules/set-misc-nginx-module-0.29 \
--add-module=/usr/local/nginx/modules/echo-nginx-module-0.58

make -j2
make install
备注:如果对 linux 相关操作不熟,请严格按照上述步骤搭建环境,切记心细,心细,再心细。

4. 自定义采集数据实现

我们将node-1作为网站服务器 , node-3作为nginx服务器

4.1 方案一 : 网站流量日志

a) 创建页面 index.html,添加埋点代码,放入 nginx 默认目录 nginx/html 下。

埋点代码

  • 创建一个全局数组(_maq) , 用于放置各种配置
  • ma.async = true 的意思是异步调用外部 js 文件即不阻塞浏览器的解析,待外部 js 下载完成后异步执行。
  • 自调用匿名函数 , 用来引入埋点的JS
  • 放入nginx步骤(这里我们将node-1作为网站访问服务器)
    • 下载httpd yum -y install httpd
    • 启动Apache Service service httpd start
    • 将index.html上传到 /var/www/html目录下 , 上传前一定要注意linux地址的修改
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>welcom to itheima</title>	
	
		<script type="text/javascript">
		var _maq = _maq || [];
		_maq.push(['_setAccount', 'AllenWoon']);
	 	//JS自调用匿名函数
		(function() {
			var ma = document.createElement('script'); 
			ma.type = 'text/javascript';
			ma.async = true;
            //引入的数据搜集的脚本
			ma.src = 'http://192.168.244.153/ma.js';
			var s = document.getElementsByTagName('script')[0]; 
			s.parentNode.insertBefore(ma, s);
		})();
		</script>
	</head>
	<body>
		<h1 align="center">黑马程序员--云计算大数据</h1>
		
	</body>
</html>

b) 在默认目录 nginx/html 下添加一个数据采集脚本 ma.js。

数据搜集脚本

  • 定义一个对象(params)用于存储要搜集的数据
  • 从document , window , navigator等内置对象中获取需要的参数
  • 将埋点中获取的参数拼接到params上
  • 最后将参数都拼接到args上 , 通过args传递到后端(lua+nginx)脚本
  • Image对象请求后端脚本 , 并将请求的图片设置为(1*1) , 为的是不让图片的显示干扰业务的继续推进
(function () {
    var params = {};
    //Document对象数据
    if(document) {
        params.domain = document.domain || ''; 
        params.url = document.URL || ''; 
        params.title = document.title || ''; 
        params.referrer = document.referrer || ''; 
    }   
    //Window对象数据
    if(window && window.screen) {
        params.sh = window.screen.height || 0;
        params.sw = window.screen.width || 0;
        params.cd = window.screen.colorDepth || 0;
    }   
    //navigator对象数据
    if(navigator) {
        params.lang = navigator.language || ''; 
    }   
    //解析_maq配置
    if(_maq) {
        for(var i in _maq) {
            switch(_maq[i][0]) {
                case '_setAccount':
                    params.account = _maq[i][1];
                    break;
                default:
                    break;
            }   
        }   
    }   
    //拼接参数串
    var args = ''; 
    for(var i in params) {
        if(args != '') {
            args += '&';
        }   
        args += i + '=' + encodeURIComponent(params[i]);
    }   
 
    //通过Image对象请求后端脚本
    var img = new Image(1, 1); 
    img.src = 'http://192.168.244.153/log.gif?' + args;
})();

c) 修改 nginx 的配置文件,添加自定义相关业务逻辑。

后端脚本Nginx+Lua

  • 设置并发处理最大连接数
  • 常规nginx的http配置
  • server中的location , 用于请求URL的匹配
    • 创建伪装成gif文件的location , 用于记录日志文件
    • 创建内部的location , 用于内部调用 , 生成日志文件并存放
  • 进入nginxcd /usr/local/nginx>cd conf/> 逻辑删除之前的nginx.conf文件mv nginx.conf nginx.conf.bak>将下面的nginx.conf拷贝到当前目录即可>启动nginx , 首先回到cd /usr/local/nginx处 , 执行启动命令sbin/nginx -c conf/nginx.conf==>实时监测日志文件cd logs/ tail -f user_defined.log
worker_processes  2;
#每一个worker进程能并发处理(发起)的最大连接数
events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
					  
    log_format user_log_format "$msec||$remote_addr||$status||$body_bytes_sent||$u_domain||$u_url||$u_title||$u_referrer||$u_sh||$u_sw||$u_cd||$u_lang||$http_user_agent||$u_account";
    
    sendfile        on;  #允许sendfile方式传输文件,默认为off

    keepalive_timeout  65; #连接超时时间,默认为75s

    server {
        listen       80;
        server_name  localhost;
		location /log.gif {
			#伪装成gif文件
			default_type image/gif;    
			#nginx本身记录的access_log,日志格式为main
			access_log  logs/access.log  main;
		
			access_by_lua "
				-- 用户跟踪cookie名为__utrace
				local uid = ngx.var.cookie___utrace        
				if not uid then
					-- 如果没有则生成一个跟踪cookie,算法为md5(时间戳+IP+客户端信息)
					uid = ngx.md5(ngx.now() .. ngx.var.remote_addr .. ngx.var.http_user_agent)
				end 
				ngx.header['Set-Cookie'] = {'__utrace=' .. uid .. '; path=/'}
				if ngx.var.arg_domain then
				-- 通过subrequest到/i-log记录日志,将参数和用户跟踪cookie带过去
					ngx.location.capture('/i-log?' .. ngx.var.args .. '&utrace=' .. uid)
				end 
			";  
		
			#此请求资源本地不缓存
			add_header Expires "Fri, 01 Jan 1980 00:00:00 GMT";
			add_header Pragma "no-cache";
			add_header Cache-Control "no-cache, max-age=0, must-revalidate";
		
			#返回一个1×1的空gif图片
			empty_gif;
		}   
	
		location /i-log {
			#内部location,不允许外部直接访问
			internal;
		
			#设置变量,注意需要unescape
			set_unescape_uri $u_domain $arg_domain;
			set_unescape_uri $u_url $arg_url;
			set_unescape_uri $u_title $arg_title;
			set_unescape_uri $u_referrer $arg_referrer;
			set_unescape_uri $u_sh $arg_sh;
			set_unescape_uri $u_sw $arg_sw;
			set_unescape_uri $u_cd $arg_cd;
			set_unescape_uri $u_lang $arg_lang;
			set_unescape_uri $u_account $arg_account;

		
			#打开subrequest(子请求)日志
			log_subrequest on;
			#自定义采集的日志,记录数据到user_defined.log
			access_log logs/user_defined.log user_log_format;
		
			#输出空字符串
			echo '';
		}	
	
    }
}

d) 启动 nginx
sbin/nginx -c conf/nginx.conf

重启nginx==> sbin/nginx -s reload

e) 通过游览器访问 nginx

http://192.168.244.151/index.html

f) 观察自定义日志采集文件是否有对应的内容输出
tail -f logs/user_defined.log
此时还可以观察 nginx 默认的输出日志文件
tail -f logs/access.log
停止 nginx:
sbin/nginx –s stop

测试结果
1542023107.669||192.168.244.130||200||0||192.168.244.151||http://192.168.244.151/index.html||welcom to itheima||||768||1366||24||zh-CN||Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0||AllenWoon

4.2 方案二 : 页面点击事件

  • 前端埋点代码
    • 大致与方案一一致
    • 特殊 : 自定义了一个标签clstag , 用于触发点击事件
    • 同样的将这些静态文件(index2.html , page1.html , page2.html)以及jquery上传到node-1的/var/www/html/文件夹下即可

index2.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>welcom to itheima</title>
		<script src="/jquery-3.2.1.min.js">
		</script>
				 
		<script type="text/javascript">
		 var _maq = _maq || [];
		 _maq.push(['_setAccount', 'AllenWoon']);
		
		 $(function(){
		 $("a").click(function(){
				var clstag = $(this).attr("clstag");
				var _a_value = $(this).text();
				_maq.push(['_a_value',_a_value]);
				 clstag = clstag.split('|');
				for (i in clstag){ 
					_maq.push(['type'+i, clstag[i]]);
					}
					sendRequest();
				})
		});

		function sendRequest(){
				var ma = document.createElement('script'); 
				ma.type = 'text/javascript';
				ma.async = true;
				ma.src = 'http://192.168.244.153/ma.js';
				var s = document.getElementsByTagName('script')[0]; 
				s.parentNode.insertBefore(ma, s);
		}
		</script>
		
	</head>
	<body>
		<h1 align="center">黑马程序员--云计算大数据</h1>
		<a href="http://192.168.244.151/page1.html" target="_blank" clstag="click|index|page1">这是点击1</a><br/>
		
		<a href="http://192.168.244.151/page2.html" target="_blank" clstag="click|index|page2">这是点击2</a>
	</body>
</html>

page1.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>page1</title>	
	
		<script type="text/javascript">
		var _maq = _maq || [];
		_maq.push(['_setAccount', 'AllenWoon']);
	 
		(function() {
			var ma = document.createElement('script'); 
			ma.type = 'text/javascript';
			ma.async = true;
			ma.src = 'http://192.168.244.153/ma.js';
			var s = document.getElementsByTagName('script')[0]; 
			s.parentNode.insertBefore(ma, s);
		})();
        </script>
	</head>
	<body>
		<h1 align="center">黑马程序员--云计算大数据</h1>
		<h1 align="center">Page 1</h1>
	</body>
</html>

page2.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>page2</title>	
	
		<script type="text/javascript">
		var _maq = _maq || [];
		_maq.push(['_setAccount', 'AllenWoon']);
	 
		(function() {
			var ma = document.createElement('script'); 
			ma.type = 'text/javascript';
			ma.async = true;
			ma.src = 'http://192.168.244.153/ma.js';
			var s = document.getElementsByTagName('script')[0]; 
			s.parentNode.insertBefore(ma, s);
		})();
		</script>
	</head>
	<body>
		<h1 align="center">黑马程序员--云计算大数据</h1>
		<h1 align="center">page 2</h1>
	</body>
</html>
  • 数据搜集脚本
    • 将node-3中/usr/local/nginx/html 中之前的ma.js删除 , 将新的ma.js传输进来即可
(function () {
    var params = {};
    //Document对象数据
    if(document) {
        params.domain = document.domain || ''; 
        params.url = document.URL || ''; 
        params.title = document.title || ''; 
        params.referrer = document.referrer || ''; 
    }   
    //Window对象数据
    if(window && window.screen) {
        params.sh = window.screen.height || 0;
        params.sw = window.screen.width || 0;
        params.cd = window.screen.colorDepth || 0;
    }   
    //navigator对象数据
    if(navigator) {
        params.lang = navigator.language || ''; 
    }   
    //解析_maq配置
    if(_maq) {
        for(var i in _maq) {
            switch(_maq[i][0]) {
                case '_setAccount':
                    params.account = _maq[i][1];
                    break;
				case '_a_value':
                    params.avalue = _maq[i][1];
                    break;
				case 'type0':
                    params.type0 = _maq[i][1];
                    break;
				case 'type1':
                    params.type1 = _maq[i][1];
                    break;
				case 'type2':
                    params.type2 = _maq[i][1];
                    break;
                default:
                    break;
            }   
        }   
    }   
    //拼接参数串
    var args = ''; 
    for(var i in params) {
        if(args != '') {
            args += '&';
        }   
        args += i + '=' + encodeURIComponent(params[i]);
    }   
 
    //通过Image对象请求后端脚本
    var img = new Image(1, 1); 
    img.src = 'http://192.168.244.153/log.gif?' + args;
})();
  • 后端脚本
    • 将node-3/usr/local/nginx/conf中之前的nginx.conf删除 , 将新的nginx.conf传输进去
    • 对nginx进行重启即可 , 同样是先回到nginx目录下 , sbin/nginx -s reload
worker_processes  2;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
  	
    log_format user_log_format "$msec||$remote_addr||$status||$body_bytes_sent||$u_domain||$u_url||$u_title||$u_referrer||$u_sh||$u_sw||$u_cd||$u_lang||$http_user_agent||$u_account||$u_avalue||$u_type0||$u_type1||$u_type2";
    
    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
		location /log.gif {
			#伪装成gif文件
			default_type image/gif;    
			#nginx本身记录的access_log,日志格式为main
			access_log  logs/access.log  main;
		
			access_by_lua "
				-- 用户跟踪cookie名为__utrace
				local uid = ngx.var.cookie___utrace        
				if not uid then
					-- 如果没有则生成一个跟踪cookie,算法为md5(时间戳+IP+客户端信息)
					uid = ngx.md5(ngx.now() .. ngx.var.remote_addr .. ngx.var.http_user_agent)
				end 
				ngx.header['Set-Cookie'] = {'__utrace=' .. uid .. '; path=/'}
				if ngx.var.arg_domain then
				-- 通过subrequest到/i-log记录日志,将参数和用户跟踪cookie带过去
					ngx.location.capture('/i-log?' .. ngx.var.args .. '&utrace=' .. uid)
				end 
			";  
		
			#此请求不缓存
			add_header Expires "Fri, 01 Jan 1980 00:00:00 GMT";
			add_header Pragma "no-cache";
			add_header Cache-Control "no-cache, max-age=0, must-revalidate";
		
			#返回一个1×1的空gif图片
			empty_gif;
		}   
	
		location /i-log {
			#内部location,不允许外部直接访问
			internal;
		
			#设置变量,注意需要unescape
			set_unescape_uri $u_domain $arg_domain;
			set_unescape_uri $u_url $arg_url;
			set_unescape_uri $u_title $arg_title;
			set_unescape_uri $u_referrer $arg_referrer;
			set_unescape_uri $u_sh $arg_sh;
			set_unescape_uri $u_sw $arg_sw;
			set_unescape_uri $u_cd $arg_cd;
			set_unescape_uri $u_lang $arg_lang;
			set_unescape_uri $u_account $arg_account;
			set_unescape_uri $u_avalue $arg_avalue;
			set_unescape_uri $u_type0 $arg_type0;
			set_unescape_uri $u_type1 $arg_type1;
			set_unescape_uri $u_type2 $arg_type2;
		
			#打开subrequest(子请求)日志
			log_subrequest on;
			#自定义采集的日志,记录数据到user_defined.log
			access_log logs/user_defined.log user_log_format;
		
			#输出空字符串
			echo '';
		}	
	
    }
}

测试如下 : 每次点击之后生成两个日志 , 一个是点击的 , 一个是点击后网页的

1542023777.191||192.168.244.130||200||0||192.168.244.151||http://192.168.244.151/index2.html||welcom to itheima||||768||1366||24||zh-CN||Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0||AllenWoon||\xE8\xBF\x99\xE6\x98\xAF\xE7\x82\xB9\xE5\x87\xBB1||click||index||page1
1542023777.260||192.168.244.130||200||0||192.168.244.151||http://192.168.244.151/page1.html||page1||http://192.168.244.151/index2.html||768||1366||24||zh-CN||Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0||AllenWoon||||||||
1542023784.207||192.168.244.130||200||0||192.168.244.151||http://192.168.244.151/index2.html||welcom to itheima||||768||1366||24||zh-CN||Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0||AllenWoon||\xE8\xBF\x99\xE6\x98\xAF\xE7\x82\xB9\xE5\x87\xBB2||click||index||page2
1542023784.267||192.168.244.130||200||0||192.168.244.151||http://192.168.244.151/page2.html||page2||http://192.168.244.151/index2.html||768||1366||24||zh-CN||Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0||AllenWoon||||||||

扩展

  • linux上C语言软件安装步骤
    • ./configure 检查编译环境
    • make 编译
    • make install 编译后安装 --prefix

tips: 一键启动nginx脚本编写

vi startNg.sh==>

#!/bin/bash
/usr/local/nginx/sbin/nginx -c conf/nginx.conf

授予权限chmod u+x startNg.sh

tips : 一键关闭nginx脚本编写

#!/bin/bash
/usr/local/nginx/sbin/nginx -s stop

授予权限chmod u+x stopNg.sh

查看是否开启ps -ef | grep nginx

大数据离线---网站日志流量分析系统(1)---简介及框架 本次介绍网站日志流量分析系统,首先是简介和架构。后面会对架构中需要的每个模块的进行逐个介绍。本篇主要分为两个部分 网站日志流量分析系统简介 整体技术流程和架构 1. 网站日志流量分析系统简介 1.1点击流数据模型 点击流的概念 点击流( Click Stream)是指用户在网站上持续访问的轨迹。 这个概念更注重用户浏览网站的整个流程。 用户对网站的每次访问包含了一系列的点击动作... 阅读详情

相关推荐

大数据离线---网站日志流量分析系统(2)---数据获取和预处理

本次接上一篇,进行实际数据的获取和预处理,会有较多的代码内容 数据的获取 数据的预处理 数据的获取 需求 数据采集的需求广义上来说分为两大部分。 是在页面采集用户的访问行为,具体开发工作: 1、 开发页面埋点 js,采集用户访问行为 2、 后台接受页面 js 请求记录日志 是从 web 服务器上汇聚日志到 HDFS,是数据分析系统的数据采集,具体的技术实现有很多方式: Shell 脚本 ...

weixin_42229056的博客 3344

大数据实时阶段_Day05_日志分析

课程名称: 日志监控告警系统 课程目标: 1、 掌握Storm编程的应用场景及编程模型 2、 掌握Storm开发生态圈各知识点 3、 掌握短信和邮件告警功能 课程大纲: 1、 背景知识 2、 需求分析 3、 功能分析 4、 架构设计 5、 代码开发 点击流日志信息行为轨迹 1.2、如何进行点击流日志分析 1) 用户访问http://yun.itheima.com/open/c-139.html 是...

小川的博客 838

大数据相关较好的项目

项目一:宁波今日新闻网热点分析系统     软件架构:Flume+KafKa+Hbase+Hive+Spark+Mysql+SpringMVC+Mybatis+AugularJs+Echarts 项目描述:  在当今的社会,每天都会发生很多事情,每天都有很多的新闻报道,为了能够在这么大量的新闻及大量的点击阅读量中获取一些有价值的信息,以便于在不同的时间段投放不同类型的新闻,管理新闻的投放时间,...

YiShi_heart的博客 8595

网站流量日志分析——day1

背景 网站分析对于很多人来说是一个全新的行业,大家会存在常见的一些疑问,网站分析是干什么的?都分析哪些内容?为什么要对网站进行分析?这能带来哪些价值? 回答这些之前,我们先反问一下自己:网站为什么会存在?每个网站都有自己存在的目的和意义。除了政府和公益类网站之外,大多数网站的目的都是为了产生货币收入,说白了就是赚钱。要创建出用户需要的网站就必须进行网站分析,通过分析,找出用户实际需求,构建出符合用...

ljm_smn的博客 727

大数据BigData总结笔记(一)

一 什么是大数据? 大数据(big data),IT行业术语,P级甚至是E级数据量! 是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合, 是需要新处理模式才能具有更强的决策力、洞察发现力和 流程优化能力的海量、高增长率和多样化的信息资产。 eg: 19g 的txt文件--打开失败:常规软件无法捕捉管理,处理.. 买枪案例:洞察发现力.. 啤酒和尿布案例:洞察发现力,流程优...

weixin_45763404的博客 2860

大数据之电商分析系统(一)

大数据之电商分析系统(一) 一:项目介绍 ​ 本项目来源于企业级电商网站的大数据统计分析平台, 该平台以 Spark 框架为核心, 对电商网站的日志进行离线和实时分析。该大数据分析平台对电商网站的各种用户行为( 访问行为、购物行为、广告点击行为等)进行分析,根据平台统计出来的数据, 辅助公司中的 PM(产品经理)、数据分析师以及管理人员分析现有产品的情况, 并根据用户行为分析结果持续改进产品的设计...

weixin_38255444的博客 5647

Hadoop离线_网站流量日志数据分析系统_数据分析

标题1.2.3.4. 1. 2. 3. 4.

weixin_44449054的博客 1391

大数据离线---网站日志流量分析系统---日志数据原始信息

本次主要介绍网站日志流量分析的第2单元,数据的采集和数据的预处理,以代码为主。 数据采集(Flume) 数据预处理 1. 数据采集 1.1 需求 数据采集的需求广义上来说分为两大部分。 在页面采集用户的访问行为,具体开发工作: 开发页面埋点 js,采集用户访问行为 后台接受页面 js 请求记录日志 从 web 服务器上汇聚日志到 HDFS,是数据分析系统的数据采集,具体的技术实现有很...

weixin_42229056的博客 2339

Hadoop项目实战---黑马论坛日志分析

1、项目描述 通过对黑马技术论坛的apache common日志进行分析, 计算论坛关键指标,供运营者决策。 2、数据情况 每行记录有5部分组成: 1.访问ip 2.访问时间 3.访问资源【跟着两个访问的Url】 4.访问状态 5.本次流量 截取部分数据如下:27.19.74.143 - - [30/May/2013:17:38:21 +0800] "GET /static/im

什么最重要?算法!! 1万+

基于Hadoop的网站流量日志分析系统设计与实现

网站流量日志分析是大数据领域最常见的应用场景之一。面对海量Nginx/Apache日志,传统工具难以高效处理,而Hadoop生态提供了完整的解决方案:HDFS负责分布式存储原始日志,MapReduce实现清洗、解析与指标统计,YARN进行资源调度,Hive则支持辅助查询校验。通过合理设计分层架构与统计口径,可有效提取PV、UV、热门页面等运营指标,并利用Combiner、自定义Partitioner等手段优化数据倾斜与Shuffle性能。该技术路线不仅适用于课程设计与毕业设计,也是理解大数据离线批处理流程的

weixin_34341117的博客 397

基于Hadoop的离线网站日志分析.zip

基于Hadoop的离线网站日志分析

大数据离线阶段--数据获取

大数据离线阶段 -----数据获取原理 数据分析 1. 数据分析定义 数据分析离不开数据,计量和记录一起促成了数据的诞生。伴随着数据记录的发展(尤其是技术),人类受益也越来越多,计算机出现带来的数字测量,更加大大的提高了数据化的效率。人们的重点也逐渐移向了记录下来的庞大数据,对这些数据进行研究、分析,以期获取更大的利益。 数据分析是指用适当的统计分析方法对收集来的数据进行分析,将它们加以汇总和理解...

weixin_44654375的博客 3300

STM32 ES8266上阿里云IOT MQTT实践【第七章】:ESP8266+MQTT上阿里云物联网平台实践

本篇文章讲述了如何使用stm32接入阿里云IOT,WiFi模块为ESP8266,可以实现发布以及订阅。

超级大洋葱的博客 2万+

大数据离线处理

数据分析 数据分析作用 在商业领域中,进行数据分析的目的是把隐藏在一大批看似杂乱无章的数据背后的信息集中和提炼出来,总结出所研究对象的内在规律,帮助管理者进行有效的判断和决策。数据分析在企业日常经营分析中主要有三大作用: 1.状分析:告诉你当前的状况 2.原因分析:告诉你某一现状为什么发生 3.预测分析:告诉你将来会发生什么 数据分析基本步骤 1.明确分析目的和思路:比如用户行为理论 用户行为轨...

qq_43688472的博客 2841

抖音无水印视频解析全攻略:从原理到2025实战工具推荐

短视频创作和素材整理绕不开一个基础需求:如何从抖音等平台获取不带水印的清晰视频。这背后涉及的其实是常见的链接解析与播放地址还原技术——平台对外分发带水印的地址,但源视频文件往往存在可访问的公开入口。理解这一原理,不仅能帮我们判断工具是否安全,也能避免在搜索“抖音视频解析”、“无水印视频下载”时踩坑。无论是剪辑师收集二创素材、运营人员备份品牌内容,还是普通用户保存高清视频,掌握一套稳定、合规的下载方法都很有价值。本文从水印生成机制讲起,梳理了网页工具、插件、脚本等不同实现形态的优缺点,并给出2025年仍然有效

weixin_42666036的博客 450

PCB板质量测试和PCB板

PCB板质量测试和板厂

weixin_51370842的博客 515

大数据离线web网站日志分析

1、背景 1.1黑马论坛日志,数据分为两部分组成,原来是一个大文件,是56GB;以后每天生成一个文件,大约是150-200MB之间; 1.2日志格式是apachecommon日志格式; 1.3分析一些核心指标,供运营决策者使用; 1.4开发该系统的目的是分了获取一些业务相关的指标,这些指标在第三方工具中无法获得的; 2、开发大致流程: 2.1把日志数据上传到HDFS中...

阿尼古 3010

深度学习分类任务中,正负样本比例失衡的5种实战解决方案(附代码)

本文深入探讨了深度学习分类任务中正负样本比例失衡的5种实战解决方案,包括智能采样技术、动态数据增强、损失函数工程、模型架构创新和训练策略优化。针对信用卡欺诈检测、医疗诊断等场景,提供了详细的代码实现和评估方法,帮助开发者有效解决样本不平衡问题,提升模型在真实场景中的表现。

h9j8k7l6m5n的博客 425

【Hadoop离线基础总结】网站流量日志数据分析系统

目录点击流数据模型概述点击流模型 点击流数据模型 概述 点击流(Click Stream)是指用户在网站上持续访问的轨迹。点击流数据(Click Stream Data)代表了用户浏览网站的整个流程。 实际上,大部分的大型网站都会有日志埋点,通过js的方式获取用户在网站上面点击到的所有链接、按钮、商品等,包括用户访问的URL等。这些js埋点一般由专业的前端来做,而埋点收集到的数据都会发送到日...

关于我转生变成程序猿这档事 3785

CCD 技术介绍(基于innovus引擎CCOpt)

CCD:全称是,并行优化clock和data path。CCOpt:全称是Clock的timing分为两种模式,和。preCTS并没有clock,因此需要建立一个,从clock端口到寄存器CK端的来自sdc中的设置;postCTSupdateIO latency,clock就会自动的转换成propagatedclock,这时就是实际时钟互连线网络的delay。在实际设计中,clock起始于ideal。

m0_61003348的博客 8978

【OAG vs RAG】RAG的“语义崩溃“:为什么你的知识库越大,AI越笨?_语义检索oag-优快云博客

19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程)·49.9 元(AI 时代成长方法论)。单篇不过瘾?订阅解锁全量源码、实战与答疑;文末附资料包领取方式 ↓图1:RAG语义崩溃概念图。

求知若渴、虚心若愚 73

基于Hadoop的MapReduce网站日志大数据分析(含预处理MapReduce程序、hdfs、flume、sqoop、hive、mysql、hbase组件、echarts)

Hadoop的网站日志大数据分析方法。本项目首先将网站日志上传到HDFS分布式文件系统,然后使用MapReduce进行数据预处理。通过使用Hive进行大数据分析,我们能够对网站的PV、独立IP、用户注册数和跳出用户数等重要指标进行统计分析。最后,我们使用Sqoop将分析结果导出到MySQL数据库,并使用Python搭建可视化界面,以方便用户对分析结果进行更直观的理解。通过使用Hadoop分布式计算框架,本项目可以高效地处理大量的网站日志数据。

迷茫与徘徊只会让你陷入绝境,欢迎私信博主,带你开始提升变现价值! 1万+

android11.0 Launcher3 高端定制之循环滑动

待机界面可以向左、向右循环切换页面 效果图 修改清单 packages/apps/Launcher3/res/values-zh-rCN/strings.xml packages/apps/Launcher3/res/values/config.xml packages/apps/Launcher3/res/values/strings.xml packages/apps/Launcher3/res/xml/launcher_preferences.xml packages/apps/Launc

cczhengv 1549

大数据案例--网站流量项目(上)

一、网站流量统计项目概述 1、项目背景 网站流量统计是改进网站服务的重要手段之一,通过获取用户在网站的行为,可以分析出哪些内容受到欢迎,哪些页面存在问题,从而使网站改进活动更具有针对性。 2、统计指标说明 常用的网站流量统计指标一般包括以下情况分析: ①、按在线情况分析 在线情况分析分别记录在线用户的活动信息,包括:来访时间、访客地域、来路页面、当前停留页面等,这些功能对企业实时掌握自身网站流量有很大的帮助。 ②、按时间段分析 时段分析提供网站任意时...

我睡觉的时候不困 2139

一.镜头知识之焦点,焦距,有效焦距,前焦距,后焦距

由光学系统中镜片的最后一面到像面的距离。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 5578

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Hadoop离线_网站流量日志数据分析系统_概述

流量日志数据分析系统1.点击流数据模型2.网站流量模型分析3.流量常见分析角度和指标分类4.流量日志分析网站整体架构模块 1.点击流数据模型 2.网站流量模型分析 3.流量常见分析角度和指标分类 4.流量日志分析网站整体架构模块 ...

weixin_44449054的博客 2069

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 大数据基础增强----【Zookeeper】
下一篇: Java基础----【缓冲流、转换流、序列化流】
CoderBoom
博客等级 码龄8年 62粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值