1.数据处理

1.1 环境准备

进入cd /opt/server/hadoop-3.1.0/sbin文件夹,停止hdfs服务

cd /opt/server/hadoop-3.1.0/sbin
./stop-dfs.sh

进入/opt/server/hadoop-3.1.0/etc/hadoop文件夹,编辑yarn-site.xml文件

/opt/server/hadoop-3.1.0/etc/hadoop
vim yarn-site.xml

yarn.nodemanager.vmem-pmem-ratio参数代表虚拟内存与物理内存的比率,如果超过默认2.1倍的限制,进程会被关闭,可以调高yarn.nodemanager.vmem-pmem-ratio值,或将yarn.nodemanager.vmem-check-enabled=false,关闭虚拟内存检查  

<configuration><!-- Site specific YARN configuration properties --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.nodemanager.vmem-pmem-ratio</name><value>4</value></property>
</configuration>

进入cd /opt/server/hadoop-3.1.0/sbin文件夹,启动hdfs服务

cd /opt/server/hadoop-3.1.0/sbin
./start-dfs.sh

 启动hive,创建一个新数据库

cd /opt/server/apache-hive-3.1.2-bin/bin
hive
create database web_log;
use web_log;

创建原始表:

CREATE TABLE access_log_content (content STRING
);
CREATE TABLE ip_content (content STRING
);

上传数据 

 导入数据

load data local inpath '/opt/data/web.log' into table access_log_content;
load data local inpath '/opt/data/ip.txt' into table ip_content;select * from access_log_content limit 5;
select * from ip_content limit 5;

1.2 日志文件属性提取

 中间表

DROP TABLE IF EXISTS access_log_tmp1;
CREATE TABLE access_log_tmp1 (
id BIGINT,
ip STRING,
ip_num BIGINT,      -- ip对应的十进制数
ip_1 BIGINT,        -- ip首位数字
access_time STRING, -- 访问时间
url STRING,         -- 访问链接
status STRING,      -- http状态码
traffic STRING,     -- 流量
referer STRING,     -- 来源
c_info STRING       -- 客户端信息
);
-- 使用正则表达式提取并向临时表插入数据
INSERT OVERWRITE TABLE access_log_tmp1 
SELECT 
CAST(split(content, ' ')[0] AS BIGINT) AS id, 
split(content, ' ')[1] AS ip, 
cast(split(split(content, ' ')[1], '\\.')[0] as int)  * 256 * 256 * 256 + 
cast(split(split(content, ' ')[1], '\\.')[1] as int) * 256 * 256 + 
cast(split(split(content, ' ')[1], '\\.')[2] as int) * 256 + 
cast(split(split(content, ' ')[1], '\\.')[3] as int) AS ip_num,
cast(split(split(content, ' ')[1], '\\.')[0] as int) AS ip_1, 
regexp_extract(content,'(\\[.*\\])',1) AS access_time,
split(regexp_extract(content,'(".*?")',1)," ")[1] AS url, 
split(content,' ')[9] AS status, 
split(content,' ')[10] AS traffic, 
split(content,' ')[11]  AS referer, 
regexp_extract(content,'\" (".*?")$',1) AS c_info 
FROM access_log_content;
select * from access_log_tmp1 limit 5;

1.3 IP信息提取

DROP TABLE IF EXISTS cz_ip;
CREATE TABLE cz_ip (
ip_start BIGINT,   -- 起始ip对应的十进制
ip_start_1 STRING, -- 起始ip首位
ip_end BIGINT,     -- 结束ip对应的十进制
city STRING,       -- 城市
isp STRING         -- 运营商
);
-- 使用正则表达式提取并向IP表插入数据
INSERT OVERWRITE TABLE cz_ip 
SELECT 
CAST(split(split(content, '\\s+')[0],'\\.')[0] AS BIGINT) * 256 * 256 * 256 + 
CAST(split(split(content, '\\s+')[0],'\\.')[1] AS BIGINT) * 256 * 256 + 
CAST(split(split(content, '\\s+')[0],'\\.')[2] AS BIGINT) * 256 + 
CAST(split(split(content, '\\s+')[0],'\\.')[3] AS BIGINT) AS ip_start, 
split(split(content, '\\s+')[0],'\\.')[0] AS ip_start_1, 
CAST(split(split(content, '\\s+')[1],'\\.')[0] AS BIGINT) * 256 * 256 * 256 + 
CAST(split(split(content, '\\s+')[1],'\\.')[1] AS BIGINT) * 256 * 256 + 
CAST(split(split(content, '\\s+')[1],'\\.')[2] AS BIGINT) * 256 + 
CAST(split(split(content, '\\s+')[1],'\\.')[3] AS BIGINT) AS ip_end, 
split(content, '\\s+')[2] AS city, 
split(content, '\\s+')[3] AS isp
FROM ip_content;
select * from cz_ip limit 5;

1.4 信息合并

-- 初始化临时表
DROP TABLE IF EXISTS access_log_tmp2;
CREATE TABLE access_log_tmp2 (
id BIGINT,
ip STRING,
city STRING,
isp STRING,
access_time STRING,
url STRING,
status STRING,
traffic STRING,
referer STRING,
c_info STRING
);
-- 从ip表中查询城市和运营商信息
INSERT OVERWRITE TABLE access_log_tmp2
SELECT a.id, a.ip, b.city, b.isp, a.access_time, a.url, a.status, a.traffic, a.referer, a.c_info
FROM access_log_tmp1 a JOIN 
cz_ip b ON a.ip_1 = b.ip_start_1 AND a.ip_num >= b.ip_start AND a.ip_num <= b.ip_end;
select * from access_log_tmp2 limit 5;

1.5 用户所在省和访问链接

-- 初始化临时表
DROP TABLE IF EXISTS access_log_tmp3;
CREATE TABLE access_log_tmp3 (
id BIGINT,
ip STRING,
province STRING,
city STRING,
isp STRING,
access_time STRING,
url STRING,
status STRING,
traffic STRING,
referer STRING,
c_info STRING
);
-- 提取省信息使用正则表达式提取访问链接的实际地址并向临时表插入数据
INSERT OVERWRITE TABLE access_log_tmp3
SELECT id,ip,
CASE WHEN INSTR(city, '省') > 0 THEN SUBSTR(city,1,INSTR(city,'省')-1)
WHEN INSTR(city,'内蒙古') > 0 THEN '内蒙古'
WHEN INSTR(city,'西藏') > 0 THEN '西藏'
WHEN INSTR(city,'广西') > 0 THEN '广西'
WHEN INSTR(city,'宁夏') > 0 THEN '宁夏'
WHEN INSTR(city,'新疆') > 0 THEN '新疆'
WHEN INSTR(city,'北京') > 0 THEN '北京'
WHEN INSTR(city,'上海') > 0 THEN '上海'
WHEN INSTR(city,'天津') > 0 THEN '天津'
WHEN INSTR(city,'重庆') > 0 THEN '重庆'
WHEN INSTR(city,'香港') > 0 THEN '香港'
WHEN INSTR(city,'澳门') > 0 THEN '澳门'
ELSE city end 
AS province, 
city,
isp,
access_time,
split(url,"\\?")[0] AS url
,status, traffic, referer, c_info
FROM access_log_tmp2;
select * from access_log_tmp3 limit 5;

 1.6 访问时间和referer

-- 初始化临时表
DROP TABLE IF EXISTS access_log_tmp4;
CREATE TABLE access_log_tmp4 (
id BIGINT,
ip STRING,
province STRING,
city STRING,
isp STRING,
access_time STRING,
access_hour STRING,
url STRING,
status STRING,
traffic STRING,
referer STRING,
ref_type STRING,
c_info STRING
);
-- 使用正则表达式提取访问时间和来源分类并向临时表插入数据
INSERT OVERWRITE TABLE access_log_tmp4 
SELECT id, ip, province, city, isp,  
regexp_extract(access_time,":(\\d.*) ",1) AS access_time,
regexp_extract(access_time,":(\\d+):",1) AS access_hour
, url, status, traffic, referer
, 
CASE WHEN   
INSTR(referer, 'www.pdd.com') > 0 OR LENGTH(referer) < 5 THEN 'self'
WHEN INSTR(referer, 'www.google.com') > 0 THEN 'google'
WHEN INSTR(referer, 'www.baidu.com') > 0 THEN 'baidu'
WHEN INSTR(referer, 'www.bing.com') > 0 THEN 'bing'
WHEN INSTR(referer, 'www.so.com') > 0 THEN '360'
ELSE 'other'
END AS ref_type, c_info
FROM access_log_tmp3;
select * from access_log_tmp4 limit 5;

1.7 用户信息处理

-- 初始化访问日志表
DROP TABLE IF EXISTS access_log;
CREATE TABLE access_log (
id BIGINT,
ip STRING,
province STRING,
city STRING,
isp STRING,
access_time STRING,
access_hour STRING,
url STRING,
status STRING,
traffic STRING,
referer STRING,
ref_type STRING,
c_info STRING,
client_type STRING,
client_browser STRING
);
-- 使用正则表达式提取客户端信息中的操作系统和浏览器信息并向表插入数据
INSERT OVERWRITE TABLE access_log
SELECT id, ip, province, city, isp, access_time, access_hour, url, status, traffic, referer, ref_type,c_info
,CASE 
WHEN INSTR(c_info, 'iPhone;') > 0 THEN 'IOS'
WHEN INSTR(c_info, 'iPad;') > 0 THEN 'IOS'
WHEN INSTR(c_info, 'Mac OS X ') > 0 THEN 'OS X'
WHEN INSTR(c_info, 'X11;') > 0 THEN 'Linux'
WHEN INSTR(c_info, 'Android ') > 0 THEN 'Android'
WHEN INSTR(c_info, 'Windows NT ') > 0 THEN 'Windows'
ELSE 'other'
END AS client_type
,
CASE 
WHEN INSTR(c_info, ' QQBrowser') > 0 THEN 'QQBrowser'
WHEN INSTR(c_info, ' UCBrowser') > 0 THEN 'UCBrowser'
WHEN INSTR(c_info, ' Edge') > 0 THEN 'Edge'
WHEN INSTR(c_info, ' LBBROWSER') > 0 THEN 'LBBROWSER'
WHEN INSTR(c_info, ' Maxthon') > 0 THEN 'Maxthon'
WHEN INSTR(c_info, ' Firefox') > 0 THEN 'Firefox'
WHEN INSTR(c_info, ' Chrome') > 0 THEN 'Chrome'
WHEN INSTR(c_info, ' Mac OS X') > 0
AND INSTR(c_info, ' Safari') > 0 THEN 'Safari'
WHEN INSTR(c_info, ' MSIE') > 0 THEN 'IE'
ELSE 'other'
END AS client_browser
FROM access_log_tmp4;
select * from access_log limit 5;

1.8.TopN数据采集

-- 初始化访问链接TopN表
DROP TABLE IF EXISTS access_log_url_top;
CREATE TABLE access_log_url_top (
url STRING,
times INT
);
INSERT OVERWRITE TABLE access_log_url_top 
SELECT top.url, top.times
FROM 
(SELECT url, COUNT(*) AS timesFROM access_logGROUP BY url
) top
ORDER BY top.times DESC LIMIT 10;
select * from access_log_url_top limit 5;

获取每个访客的第一条访问日志,脚本如下: UV 独立访客 PV:页面浏览量  

-- 初始化每个访客的第一个访问日志
DROP TABLE IF EXISTS access_log_first;
CREATE TABLE access_log_first (
id BIGINT,
ip STRING,
province STRING,
city STRING,
isp STRING,
access_time STRING,
access_hour STRING,
url STRING,
status STRING,
traffic STRING,
referer STRING,
ref_type STRING,
c_info STRING,
client_type STRING,
client_browser STRING
);
INSERT OVERWRITE TABLE access_log_first 
SELECT a.id, a.ip, a.province, a.city, a.isp, a.access_time, a.access_hour, a.url, a.status, a.traffic, a.referer, a.ref_type, a.c_info, a.client_type, a.client_browser
FROM access_log a
JOIN 
(
SELECT c.ip, MIN(c.id) AS id
FROM access_log c
GROUP BY c.ip,c.c_info
) b 
ON a.ip = b.ip AND a.id = b.id;
select * from access_log_first limit 5;

1.9 IP黑名单处理

-- 初始化访问IP黑名单表
DROP TABLE IF EXISTS access_log_ip_black;
CREATE TABLE access_log_ip_black (
ip STRING,
times INT
);
INSERT OVERWRITE TABLE access_log_ip_black 
SELECT ip, COUNT(1) AS times
FROM access_log WHERE status = '404'
GROUP BY ip
HAVING COUNT(*) > 10;
select * from access_log_ip_black limit 5;

2 数据分析

2.1 总访问人次(PV):

select max(id) from access_log;

2.2 访问人数(UV):

select count(id) from access_log_first;

2.3 独立IP:

select count(distinct ip) from access_log_first;

2.4 访问链接top10 

select * from access_log_url_top;

2.5 各个时间访问人次:

select access_hour,count(id) from access_log group by access_hour;

2.6 访问来源占比:

select rt as name,count(rt) as value 
from (select case ref_type when 'other' then '其他链接' when 'self' then '直接访问' else '搜索引擎' end as rt from access_log_tmp4 
) t group by rt;

2.7 IP黑名单:

select * from access_log_ip_black;

2.8 地域分布:

select province,count(id) from access_log group by province;

2.9 操作系统占比:

select client_type,count(id) from access_log group by client_type;

2.10 浏览器占比:

select client_browser,count(id) from access_log group by client_browser;

2.11 网络运营商占比:

select t.isp, count(t.isp)from
(
select 
case when
INSTR(isp,"移动") > 0 then "移动"
when INSTR(isp,"联通") > 0 then "联通"
when INSTR(isp,"电信") > 0 then "电信"
else "其他"
end as isp
from access_log_tmp4 
) t group by t.isp;

2.12 搜索引擎

select ref_type as name,count(ref_type) as value
from access_log_tmp4
group by ref_type
having ref_type != 'self' and ref_type != 'other';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88265.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88265.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88265.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣1310. 子数组异或查询

这一题很明显的就是用前缀和异或来解决&#xff0c;只要清楚异或的性质&#xff0c;这一题就十分容易。 对异或的性质的讲解如下&#xff1a; 异或运算解析 具体代码如下&#xff1a; class Solution { public:int sum[30005]; vector<int> xorQueries(vector<int>…

React Native 状态管理方案全面对比

React Native 状态管理方案全面对比 在 React Native 开发中&#xff0c;状态管理是构建复杂应用的核心问题。以下是主流状态管理方案的深度对比分析&#xff1a; 一、基础方案&#xff1a;useState/useReducer 适用场景 简单的组件级状态中等复杂度的局部状态管理不需要跨组件…

基于Python的程序员数据分析与可视化系统的设计与实现

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍背景意义项目展示总结每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 互联网技术飞速发展&#xff0c;数据分析与可视化在程序员工…

Java 枚举详解:从基础到实战,掌握类型安全与优雅设计

作为一名Java开发工程师&#xff0c;在日常开发中你一定经常使用枚举&#xff08;enum&#xff09;。自Java 5引入以来&#xff0c;枚举已经成为定义固定集合常量的首选方式&#xff0c;它比传统的 public static final 常量更加类型安全、可读性强&#xff0c;并且具备面向对象…

海外盲盒系统:技术如何重构“信任经济”?

盲盒的“非透明性”易引发信任危机&#xff0c;而海外盲盒系统通过技术手段构建了“可感知的公平”&#xff1a;1. 区块链存证&#xff1a;概率透明化 隐藏款概率、抽盒记录上链存证&#xff0c;用户可随时查询历史数据。某欧美用户通过区块链浏览器验证&#xff0c;确认系统隐…

PyTorch Tensor 操作入门:转换、运算、维度变换

目录 1. Tensor 与 NumPy 数组的转换 1.1 Tensor 转换为 NumPy 数组 1.2 NumPy 数组转换为 Tensor 1.3 获取单个元素的值 2. Tensor 的基本运算 2.1 生成新 Tensor 的运算 2.2 覆盖原 Tensor 的运算 2.3 阿达玛积&#xff08;逐元素乘法&#xff09; 2.4 矩阵乘法 3.…

CompletableFuture使用详解(Super Detailed)

一、 CompletableFuture介绍 多线程开发一般使用Runnable&#xff0c;Callable&#xff0c;Thread&#xff0c;FutureTask&#xff0c;ThreadPoolExecutor&#xff0c;但也有不近如意的地方 Thread Runnable&#xff1a;执行异步任务&#xff0c;没有返回结果。 Thread Calla…

开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发app&#xff0c;临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 Arkts …

【Bluedroid】蓝牙协议栈控制器能力解析与核心功能配置机制(decode_controller_support)

本文围绕Bluedroid蓝牙协议栈中控制器能力解析与核心功能配置的关键代码展开&#xff0c;详细阐述蓝牙协议栈如何通过解析控制器硬件能力&#xff0c;构建 SCO/eSCO、ACL 数据包类型支持掩码&#xff0c;配置链路策略、安全服务、查询与扫描模式等核心功能。这些机制确保协议栈…

小架构step系列07:查找日志配置文件

1 概述 日志这里采用logback&#xff0c;其为springboot默认的日志工具。其整体已经被springboot封装得比较好了&#xff0c;扔个配置文件到classpath里就能够使用。 但在实际使用中&#xff0c;日志配置文件有可能需要进行改动&#xff0c;比如日志的打印级别&#xff0c;平…

一文讲清楚React Hooks

文章目录一文讲清楚React Hooks一、什么是 React Hooks&#xff1f;二、常用基础 Hooks2.1 useState&#xff1a;状态管理基本用法特点2.2 useEffect&#xff1a;副作用处理基本用法依赖数组说明2.3 useContext&#xff1a;上下文共享基本用法特点三、其他常用 Hooks3.1 useRed…

Apache http 强制 https

1. 修改一下文件配置 sudo nano /etc/apache2/sites-enabled/000-default.conf<VirtualHost *:80>ServerName hongweizhu.comServerAlias www.hongweizhu.comServerAdmin webmasterlocalhostDocumentRoot /var/www/html# 强制重定向到HTTPSRewriteEngine OnRewriteCond …

【读代码】GLM-4.1V-Thinking:开源多模态推理模型的创新实践

一、基本介绍 1.1 项目背景 GLM-4.1V-Thinking是清华大学KEG实验室推出的新一代开源视觉语言模型,基于GLM-4-9B-0414基础模型构建。该项目通过引入"思维范式"和强化学习课程采样(RLCS)技术,显著提升了模型在复杂任务中的推理能力。其创新点包括: 64k超长上下文…

从代码生成到智能运维的革命性变革

AI大模型重塑软件开发&#xff1a;从代码生成到智能运维的革命性变革 希望对大家有一定的帮助&#xff0c;进行参考 目录AI大模型重塑软件开发&#xff1a;从代码生成到智能运维的革命性变革 希望对大家有一定的帮助&#xff0c;进行参考一、范式转移&#xff1a;软件开发进入&…

豆包编写Java程序小试

今天下载了一本第四版电气工程师手册&#xff0c;非常棒的一本书&#xff0c;在给PDF添加目录的时候&#xff0c;由于目录有将近60页&#xff0c;使用老马开发的PdgCntEditor有点卡顿&#xff0c;不过补充下&#xff0c;老马这个PdgCntEditor还是非常好的。所以我决定用Java编一…

SpringBoot整合腾讯云新一代行为验证码

一 产品介绍 腾讯云官方介绍链接 腾讯云新一代行为验证码&#xff08;Captcha&#xff09;&#xff0c;基于十道安全防护策略&#xff0c;为网页、App、小程序开发者打造立体、全面的人机验证。在保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时&…

SenseGlove新一代外骨骼力反馈手套Rembrand来袭!亚毫米级手部动捕+指尖触觉力采集+5Dof主动力反馈多模态

在远程机器人操作领域&#xff0c;精准的触觉感知与灵活的动作控制始终是核心需求。SenseGlove 新推出的 Rembrandt 力反馈外骨骼数据手套&#xff0c;以先进技术为支撑&#xff0c;为远程操控人形机器人手部提供了无缝解决方案&#xff0c;让操作更精准、更高效。值得一提的是…

Linux 信号机制:操作系统的“紧急电话”系统

想象一下&#xff0c;你正在电脑前专心工作&#xff0c;突然手机响了——这是一个通知&#xff0c;要求你立即处理一件新事情&#xff08;比如接电话&#xff09;。 Linux 系统中的信号&#xff08;Signal&#xff09;​​ 机制&#xff0c;本质上就是操作系统内核或进程之间用…

论文略读:Prefix-Tuning: Optimizing Continuous Prompts for Generation

2021 ACL固定预训练LM&#xff0c;为LM添加可训练&#xff0c;任务特定的前缀这样就可以为不同任务保存不同的前缀这种前缀可以看成连续可微的soft prompt&#xff0c;相比于离散的token&#xff0c;更好优化&#xff0c;效果更好训练的时候只需要更新prefix部分的参数&#xf…

CSS基础选择器、文本属性、引入方式及Chorme调试工具

CSS基础 1.1 CSS简介 CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称. 有时我们也会称之为 CSS 样式表或级联样式表。 CSS 是也是一种标记语言 CSS 主要用于设置 HTML 页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff09;、图片的外形&#xff08;宽高、边…