当前位置: 首页 > news >正文

【大数据技术】用户行为日志分析(python+hadoop+mapreduce+yarn+hive)

用户行为日志分析(python+hadoop+mapreduce+yarn+hive)

  • 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell)

  • 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn)

  • 本机PyCharm远程连接虚拟机Python

  • 搭建完全分布式高可用大数据集群(MySQL+Hive)

  • 本机DataGrip远程连接虚拟机MySQL/Hive

在阅读本文前,请确保已经阅读过以上5篇文章,成功搭建了Hadoop+MapReduce+Yarn+Python+Hive的大数据集群环境。

写在前面

本文主要介绍基于mapreduce+hive技术,自己编写python代码实现用户行为日志分析的详细步骤。

  • 电脑系统:Windows

  • 技术需求:HadoopMapReduceYarnPython3.12.8Hive

  • 使用软件:VMwareFinalShellPyCharmDataGrip

注:本文的所有操作均在虚拟机master中进行,不涉及另外两台虚拟机。(但是要开机)

启动Hadoop

  1. 使用finalshell连接并启动masterslave01slave02三台虚拟机。

  2. 在虚拟机master的终端输入命令start-all.sh启动hadoop、mapreduce和yarn。

  3. 随后可以用命令jps查看是否成功启动集群。

00

启动历史服务器

  1. master的终端输入命令mr-jobhistory-daemon.sh start historyserver启动历史服务器。
  • 历史服务器可以在mapreduce出错时查看报错原因。
  • 如果不启动该历史服务器,则无法使用web页面(http://master:19888/jobhistory)查看mapreduce程序的运行状态。
  1. 输入jps查看历史服务器是否成功启动。

01

准备数据

  1. 创建文本数据

① 在虚拟机master的终端输入命令cd /data进入/data目录。

② 在虚拟机master的终端输入命令 vi logs.txt 创建并打开logs.txt文件,填入以下内容。

user1	2023-10-01 08:15:23	login
user2	2023-10-01 08:20:45	view_page
user1	2023-10-01 08:25:12	click_button
user3	2023-10-01 08:30:34	login
user2	2023-10-01 08:35:56	logout
user1	2023-10-01 08:40:11	view_page
user3	2023-10-01 08:45:22	click_button
user4	2023-10-01 08:50:33	login
user2	2023-10-01 08:55:44	view_page
user4	2023-10-01 09:00:55	logout

数据说明

  1. user_id: 用户唯一标识。
  2. log_time: 日志时间,格式为 YYYY-MM-DD HH:MM:SS
  3. action: 用户执行的操作,例如 loginlogoutview_pageclick_button 等。

数据示例

  • user12023-10-01 08:15:23 登录。
  • user22023-10-01 08:20:45 浏览页面。
  • user12023-10-01 08:25:12 点击按钮。
  • user32023-10-01 08:30:34 登录。
  • user22023-10-01 08:35:56 登出。
  • user12023-10-01 08:40:11 再次浏览页面。
  • user32023-10-01 08:45:22 点击按钮。
  • user42023-10-01 08:50:33 登录。
  • user22023-10-01 08:55:44 再次浏览页面。
  • user42023-10-01 09:00:55 登出。

02

03

  1. 创建目录

① 在终端输入以下命令,可以在HDFS中创建/userlogs/input目录,用于存放文件logs.txt

hdfs dfs -mkdir -p /userlogs/input

② 在终端输入以下命令验证是否创建/userlogs/input目录。

hdfs dfs -ls /

04

  1. 上传文件

① 在终端执行以下命令将文件logs.txt上传到HDFS的/userlogs/input目录。

hdfs dfs -put /data/logs.txt /userlogs/input

② 在终端输入以下命令验证是否成功将文件logs.txt上传到HDFS的/userlogs/input目录。

hdfs dfs -ls /userlogs/input

③ 可以使用以下命令查看上传的logs.txt文件的内容。

hdfs dfs -cat /userlogs/input/logs.txt

05

④ 也可以通过HDFS的Web UI(http://master:9870)查看文件logs.txt是否上传成功。

06

编写Python脚本

打开PyCharm专业版,远程连接虚拟机master,先创建一个文件夹userlogs,后在该文件夹中分别创建map.pyreduce.py两个脚本。

1. 编写mapper脚本map.py

map.py脚本中填入以下代码。

import sysfor line in sys.stdin:# 假设输入的每一行是Hive表中的一行数据user_id, log_time, action = line.strip().split('\t')# 输出 user_id 和 actionprint(f"{user_id}\t{action}")

这段代码是一个典型的 MapReduce Mapper 脚本,用 Python 编写,用于处理从 Hive 表或 HDFS 文件中读取的日志数据。,以下是对代码的详细分析。

  1. 读取输入数据

    • 通过 sys.stdin 逐行读取输入数据。输入数据通常来自 Hadoop Streaming 的输入文件(如 Hive 表导出文件或 HDFS 文件)。
    • 每行数据的格式为 user_id\tlog_time\taction,例如:user1\t2023-10-01 08:15:23\tlogin
  2. 数据解析

    • 使用 line.strip().split('\t') 对每行数据进行解析:
      • strip():去除行首尾的空白字符(如换行符)。
      • split('\t'):以制表符(\t)为分隔符,将行数据拆分为 user_idlog_timeaction 三个字段。
  3. 输出结果

    • 使用 print(f"{user_id}\t{action}") 输出 user_idaction,中间用制表符分隔。
    • 输出格式为 user_id\taction,例如:user1\tlogin

总的来说,这段代码是一个简单但功能明确的 Mapper 脚本,适用于从结构化日志数据中提取关键字段并生成中间结果。通过优化异常处理和性能,可以使其更加健壮和高效。

2. 编写reducer脚本reduce.py

reduce.py脚本中填入以下代码。

import sys
from collections import defaultdictaction_count = defaultdict(int)for line in sys.stdin:user_id, action = line.strip().split('\t')action_count[(user_id, action)] += 1for (user_id, action), count in action_count.items():print(f"{user_id}\t{action}\t{count}")

这段代码是一个典型的 MapReduce Reducer 脚本,用 Python 编写,用于对 Mapper 输出的中间结果进行聚合统计,以下是对代码的详细分析。

  1. 读取输入数据

    • 通过 sys.stdin 逐行读取 Mapper 输出的中间结果,每行数据的格式为 user_id\taction,例如:user1\tlogin
  2. 数据统计

    • 使用 defaultdict(int) 创建一个字典 action_count,用于统计每个 (user_id, action) 组合的出现次数。
    • 对每行数据解析后,将 (user_id, action) 作为键,累加其计数:action_count[(user_id, action)] += 1
  3. 输出结果

    • 遍历 action_count 字典,输出每个 (user_id, action) 组合及其出现次数,格式为 user_id\taction\tcount,例如:user1\tlogin\t3

这段代码是一个简单但功能明确的 Reducer 脚本,适用于对 Mapper 输出的中间结果进行聚合统计。通过优化异常处理和性能,可以使其更加健壮和高效。

运行MapReduce程序

  1. 查看mapreduce程序

进入虚拟机master/opt/hadoop/share/hadoop/tools/lib目录,在该目录下执行ls命令,查看hadoop提供的mapreduce程序。

07

其中,hadoop-streaming-3.3.6.jar是执行mapreduce的程序。

  1. 执行mapreduce程序

① 在终端输入命令cd /opt/python/code/userlogs进入存放map.pyreduce.py脚本的目录。

08

② 执行以下命令,统计logs.txt文件中的用户行为。

hadoop jar /opt/hadoop/share/hadoop/tools/lib/hadoop-streaming-3.3.6.jar -file map.py -file reduce.py -input /userlogs/input/logs.txt -output /userlogs/output -mapper "python map.py" -reducer "python reduce.py" 

注意: 在每次执行这个命令前,请确保/userlogs/outputoutput文件夹不在HDFS中,如果在,请删除。

③ 出现以下信息说明程序执行成功。

09

查看程序运行状态和结果

  1. MapReduce程序运行过程中,可以使用浏览器访问Web UI(http://master:8088)查看历史服务器。

10

  1. MapReduce程序运行结束后,可以在HDFS的Web UI(http://master:9870)查看用户行为日志的统计的结果。

11

  1. 当然,也可以在master的终端输入以下命令查看程序运行结果。
hdfs dfs -cat /userlogs/output/part-00000

12

注意: 如果在运行mapreduce程序时出现错误,可以使用浏览器访问Web UI(http://master:19888/jobhistory)查看历史服务器的logs文件。

13

将结果存入Hive

在虚拟机中启动Hive,打开DataGrip,远程连接虚拟机的hive。

① 启动hiveserver2服务:hive --service hiveserver2(第一个master终端)

② 启动beeline连接:beeline -u jdbc:hive2://master:10000 -n root(第三个master终端)

③ 使用DataGrip远程连接Hive

  1. 打开DataGripQuery Console,输入以下代码,创建一个名为userlogs的Hive表。
CREATE TABLE userlogs (uid STRING,action STRING,count INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

这段 SQL 语句用于在 Hive 中创建一个表 userlogs,让我们逐部分分析这段 SQL语句。

  • CREATE TABLE userlogs (...)

    • CREATE TABLE userlogs : 这部分表示创建一个名为 userlogs 的表。

    • (...) : 括号内定义了表的列名和数据类型。这里定义了 3 列。

  • 列定义

    • uid STRING : 第一列是 uid,数据类型是 STRING。这里假设存储的是用户标识符(如 user1user2 等)。STRING 类型可以存储任意文本数据。

    • action STRING : 第二列是 action,数据类型也是 STRING。它表示用户的操作类型(如 view_pageclick_buttonLogin 等)。

    • count INT : 第三列是 count,数据类型是 INT,表示操作的计数或频率(如 12 等)。

  • ROW FORMAT DELIMITED

    • 这部分表示数据的存储格式是 定界符分隔的 。在 Hive 中,ROW FORMAT DELIMITED 表示数据以某种字符(比如制表符、逗号等)分隔。
  • FIELDS TERMINATED BY '\t'

    • FIELDS TERMINATED BY '\t' : 这部分指定了字段之间使用制表符(\t)作为分隔符,也就是每列的值通过制表符分隔。这样,Hive 就知道如何解析存储在文件中的数据。

总的来说,这段 SQL 语句的功能是创建一个 userlogs 表,表中有三列:uid(用户标识符)、action(用户执行的操作)、count(操作次数)。每行数据的字段由制表符 \t 分隔,且表采用 定界符分隔 的存储格式。

这个表结构适用于存储类似于以下数据的记录:

user1	view_page	1
user1	click_button	1
user1	Login	1
user2	logout	1
user2	view_page	2
...

14

15

注意:该userlogs表默认创建在default数据库中。

  1. beeline命令行入以下命令,将mapreduce的输出加载到Hive的userlogs表中。
LOAD DATA INPATH '/userlogs/output/part-00000' INTO TABLE userlogs;

16

  1. 在DataGrip中查看uselogs数据表中的数据。

17

  1. beeline使用SELECT * FROM userlogs LIMIT 10;命令查看数据信息。

18

到此,成功将mapreduce的执行结果存入了hive的default数据库的userlogs数据表中。

注意事项

  • 执行LOAD DATA INPATH '/userlogs/output/part-00000' INTO TABLE userlogs;命令后,在HDFS中的part-00000文件将被移动至Hive中。

19

  • 启动HiveServer2服务后,可以访问Web UI(http://master:10002/)查看Hive信息。

20

写在后面

本文仅供学习使用,原创文章,请勿转载,谢谢配合。

相关文章:

【大数据技术】用户行为日志分析(python+hadoop+mapreduce+yarn+hive)

用户行为日志分析(pythonhadoopmapreduceyarnhive) 搭建完全分布式高可用大数据集群(VMwareCentOSFinalShell) 搭建完全分布式高可用大数据集群(HadoopMapReduceYarn) 本机PyCharm远程连接虚拟机Python …...

[Day 16]螺旋遍历二维数组

今天我们看一下力扣上的这个题目:146.螺旋遍历二维数组 题目描述: 给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。 螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素&#xff0c…...

大模型的底层逻辑及Transformer架构

一、大模型的底层逻辑 1.数据驱动 大模型依赖海量的数据进行训练,数据的质量和数量直接影响模型的性能。通过大量的数据,模型能够学习到丰富的模式和规律,从而更好地处理各种任务。 2.深度学习架构 大模型基于深度学习技术,通常采用多层神经网络进行特征学习与抽象。其中…...

数据结构-基础

1、概念: 程序 数据结构 算法 2、程序的好坏 可读性,稳定性,扩展性,时间复杂度,空间复杂度。 3、数据结构 是指存储、组织数据的方式,以便高效地进行访问和修改。通过选择适当的数据结构, 能…...

SystemUI中NavigationBar分析

需求 SystemUI是一个与系统组件显示紧密相关的应用,包含快捷中心、消息通知、状态栏、导航栏、任务中心等诸多模块,本文介绍NavigationBar模块。SystemUI源码位于/frameworks/base/packages/SystemUI,Android13平台。NavigationBar显示如下&…...

MySQL的底层原理与架构

前言 了解MySQL的架构和原理对于很多的后续很多的操作会有很大的帮助与理解。并且很多知识都与底层架构相关联。 了解MySQL架构 通过上面的架构图可以得知,Server层中主要由 连接器、查询缓存、解析器/分析器、优化器、执行器 几部分组成的,下面将主要…...

三极管的截止、放大、饱和区

三极管的几个区,都有什么用: 截止区:晶体管不导通,用于开关电路的“关”状态。 放大区:晶体管用于信号放大,集电极电流与基极电流成正比。 饱和区:晶体管完全导通,用于开关电路的“…...

2025-2-7-算法学习(一) 动态规划-习题1 300.最长递增子序列

文章目录 算法学习(一) 动态规划-习题1 300.最长递增子序列(1)题目(2)举例:(3)提示(4)分析(5)动态规划代码:&a…...

学习日记-250207

一.论文 1.Prompt Learning for News Recommendation 任务不一致(LLM与实际任务)产生prompt提示。 Prompt Learning for News Recommendation 论文阅读 SIGIR2023-CSDN博客 2.GPT4Rec: A Generative Framework for Personalized Recommendation and…...

【Block总结】PSA,金字塔挤压注意力,解决传统注意力机制在捕获多尺度特征时的局限性

论文信息 标题: EPSANet: An Efficient Pyramid Squeeze Attention Block on Convolutional Neural Network论文链接: arXivGitHub链接: https://github.com/murufeng/EPSANet 创新点 EPSANet提出了一种新颖的金字塔挤压注意力(PSA)模块,旨…...

代码随想录算法训练营第三十一天| 回溯算法04

491. 递增子序列 题目: 代码随想录 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 这题需要注意的点: 1. path长度在2以上才放入最终结果 2. 需要记录已经使用过的数字&am…...

pycharm集成通义灵码应用

在pycharm中安装通义灵码 1、打开files-settings 2、选中plugins-搜索”TONGYI Lingma“,点击安装 3.安装完成后在pycharm的右侧就有通义灵码的标签 4、登录账号 5、查看代码区域代码,每一个方法前面都多了通义灵码的标识,可以直接选择…...

赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索

hello~朋友们!好久不见! 今天给大家带来赛博算命第三期——梅花易数的java实现 赛博算命系列文章: 周易六十四卦 掐指一算——小六壬 更多优质文章:个人主页 JAVA系列:JAVA 大佬们互三哦~互三必回!&#xf…...

【Leetcode刷题记录】54. 螺旋矩阵--模拟,以及循环条件处理的一些细节

54. 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 解题思路 顺时针螺旋顺序也就是“从左向…...

c++计算机教程

目的 做出-*/%计算机 要求 做出可以计算-*/%的计算机 实现 完整代码 #include<bits/stdc.h> int main() {std::cout<<"加 减- 乘* 除/ 取余% \没有了|(因为可以算三位)"<<"\n"<<"提示:每打完一个符号或打完一个数,\…...

蓝桥杯Java之输入输出练习题

题目 1&#xff1a;多组AB&#xff08;基础版&#xff09; 题目描述&#xff1a; 输入多组数据&#xff0c;每组数据包含两个整数 A 和 B&#xff0c;计算它们的和。输入以 文件结尾&#xff08;EOF&#xff09; 结束。 输入格式&#xff1a; 每行包含两个整数 A 和 B&#x…...

【R语言】环境空间

一、环境空间的特点 环境空间是一种特殊类型的变量&#xff0c;它可以像其它变量一样被分配和操作&#xff0c;还可以以参数的形式传递给函数。 R语言中环境空间具有如下3个特点&#xff1a; 1、对象名称唯一性 此特点指的是在不同的环境空间中可以有同名的变量出现&#x…...

【系统架构设计师】分布式数据库透明性

目录 1. 说明2. 分片透明3. 复制透明4. 位置透明5. 逻辑透明&#xff08;局部数据模型透明&#xff09;6.例题6.1 例题1 1. 说明 1.在分布式数据库系统中&#xff0c;分片透明、复制透明、位置透明和逻辑透明是几个重要的基本概念。2.分片透明、复制透明、位置透明和逻辑透明是…...

openpnp2.2 - 环境搭建 - 编译 + 调试 + 打包

文章目录 openpnp2.2 - 环境搭建 - 编译 调试 打包概述笔记前置任务克隆代码库切到最新的tag清理干净编译工程关掉旧工程打开已经克隆好的openpnp2.2工程将IDEA的SDK配置为openjdk23 切换中英文UI设置JAVA编译器 构建工程跑测试用例单步调试下断点导出工程的JAR包安装install…...

OpenCV:图像修复

目录 简述 1. 原理说明 1.1 Navier-Stokes方法&#xff08;INPAINT_NS&#xff09; 1.2 快速行进方法&#xff08;INPAINT_TELEA&#xff09; 2. 实现步骤 2.1 输入图像和掩膜&#xff08;Mask&#xff09; 2.2 调用cv2.inpaint()函数 2.3 完整代码示例 2.4 运行结果 …...

金仓V9智能运维揭秘:如何用国产数据库实现分钟级部署与自动化备份

金仓V9智能运维实战&#xff1a;从分钟级部署到自动化备份的全流程解析 在数字化转型浪潮中&#xff0c;数据库作为企业核心基础设施&#xff0c;其运维效率直接影响业务连续性。金仓数据库V9全平台版凭借智能运维体系&#xff0c;正在重新定义国产数据库的管理标准。本文将深入…...

永磁同步电机全速域无位置传感器控制探索之旅

永磁同步电机全速域无位置传感器控制&#xff08;高频注入改进滑膜控制方法&#xff0c;PMSM矢量控制仿真&#xff09; 永磁同步电机-PMSM的仿真-原理-算法-复现 1&#xff09;关于PMSM控制算法的文章复现、matlab编程仿真等均可&#xff0c;Matlab/Simulink仿真建模 分析建模 …...

Livekit Server分布式部署实测:手把手教你用Redis搞定多节点,并说清楚它和云服务的根本区别

Livekit Server分布式架构深度实战&#xff1a;Redis多节点部署与云服务本质差异解析 从单机到分布式&#xff1a;突破性能瓶颈的关键抉择 当你的Livekit单机服务开始出现CPU占用率持续超过80%、TURN服务延迟明显增加、房间创建响应时间超过500ms等现象时&#xff0c;就到了必须…...

Qt与Visual Studio双剑合璧:海康工业相机SDK二次开发实战指南

1. 开发环境准备&#xff1a;当Qt遇上Visual Studio 第一次接触海康工业相机SDK开发时&#xff0c;我像大多数开发者一样纠结工具链选择。经过多个项目实战验证&#xff0c;Visual StudioQt Creator的组合堪称黄金搭档——前者提供强大的C调试能力&#xff0c;后者带来跨平台的…...

好用的电脑软件总结

总目录&#xff1a;Software_resource 下面为子目录&#xff1a; Software&#xff1a;软件安装的位置 InstallPackage&#xff1a;安装包 SoftLink&#xff1a;快捷方式 一 科研 1 阅读软件 (1) 科研论文相关 Zotero 个人感觉最好用的文献阅读软件Citavi 文献阅读软件小绿…...

ESP32S3端口死活不识别?别急着换线,先试试这个USB驱动修复大法

ESP32S3端口识别难题&#xff1a;从底层原理到实战修复的全方位指南 当你满怀期待地将ESP32S3开发板连接到电脑&#xff0c;准备开始物联网项目的开发时&#xff0c;却发现设备管理器里怎么也找不到对应的COM端口——这种挫败感我深有体会。作为一款功能强大的Wi-Fi/蓝牙双模芯…...

PiliPlus视频播放进度条:自定义绘制与交互实现终极指南

PiliPlus视频播放进度条&#xff1a;自定义绘制与交互实现终极指南 【免费下载链接】PiliPlus PiliPlus 项目地址: https://gitcode.com/gh_mirrors/pi/PiliPlus PiliPlus是一款功能强大的视频播放器应用&#xff0c;其中自定义视频播放进度条是其核心功能之一。这个进度…...

R语言实战:从Raw Counts到TPM/FPKM的完整转换指南(含代码调试技巧)

R语言实战&#xff1a;从Raw Counts到TPM/FPKM的完整转换指南&#xff08;含代码调试技巧&#xff09; 在生物信息学分析中&#xff0c;RNA-seq数据的标准化处理是确保后续差异表达分析可靠性的关键步骤。对于刚接触转录组数据分析的研究生和初级分析师来说&#xff0c;如何在R…...

玩转LS-DYNA爆破模拟:倾斜长短孔布孔实战

ANSYS/ls-dyna隧道、巷道爆破倾斜长短孔布孔方式下爆破损伤数值模拟 1.讲述小间隔长短型炮孔爆破模型的建模及网格划分全过程&#xff0c;包含网格尺寸设计。 2.装药结构修改&#xff0c;可实现长短炮孔中间隔装药、设置空孔&#xff0c;延期起爆、起爆位置等设置&#xff0c;讲…...

终极Android投屏指南:用escrcpy实现电脑无缝控制手机

终极Android投屏指南&#xff1a;用escrcpy实现电脑无缝控制手机 【免费下载链接】escrcpy 优雅而强大的跨平台 Android 设备控制工具&#xff0c;基于 Scrcpy 的 Electron 应用,支持无线连接和多设备管理,让您的电脑成为 Android 的完美伴侣。 项目地址: https://gitcode.co…...