大数据实验踩坑指南_No.6——实验案例:网站用户行为分析
大数据实验踩坑指南_No.6——实验案例:网站用户行为分析
实验环境搭建
在这个实验中,需要用到下列软件包,以下是我的软件版本,点击即可跳转到官网或国内镜像站的下载链接:
- Linux: Ubuntu 22.04.4 LTS
- Hadoop: 3.3.6
- Hive: 3.1.3
- ZooKeeper: 3.9.2
- R有两种安装方式,效果是一样的,二选一即可
- HBase: 2.5.8-hadoop3-bin
- JetBrains IntelliJ IDEA
- 使用Linux版本的Standalone installation单独下载IDEA
请根据前面的教程安装配置好这些软件
- 大数据实验踩坑指南_No.1——Hadoop的安装配置
- 大数据实验踩坑指南_No.2——Hive的安装配置
- 大数据实验踩坑指南_No.3——ZooKeeper的安装配置.md
- 大数据实验踩坑指南_No.4——HBase的安装配置.md
- 大数据实验踩坑指南_No.5——R语言和软件包的安装
IDE可以自选IntelliJ IDEA[1]或Eclipse[2]
本地数据集上传到数据仓库Hive
实验数据集的下载
- 本案例采用的数据集为
user.zip
,包含了一个大规模数据集raw_user.csv
(包含2000万条记录),和一个小数据集small_user.csv
(只包含30万条记录)。小数据集small_user.csv
是从大规模数据集raw_user.csv
中抽取的一小部分数据。之所以抽取出一少部分记录单独构成一个小数据集,是因为在第一遍跑通整个实验流程时,会遇到各种错误、各种问题,先用小数据集测试,可以大量节约程序运行时间。等到第一次完整实验流程都顺利跑通以后,可以最后用大规模数据集进行最后的测试。 - 把数据集
user.zip
文件下载到Linux系统的/home/hadoop/Downloads/
目录下面
下载案例的数据集user.zip
到目录/home/hadoop/Downloads/
内(系统语言如果是中文,则是`/home/hadoop/下载)
创建一个存储数据集的目录,将user.zip
进行解压缩
1 | sudo mkdir -p /usr/local/bigdatacase/dataset |
现在可以看到dataset
目录下有两个文件:raw_user.csv
和small_user.csv
。执行以下命令查看前5条数据
1 | head -5 raw_user.csv |
数据集的预处理
删除文件的第一行记录(字段名称)
1 | sed -i '1d' raw_user.csv |
查看到已经看不到字段名成这一行
对字段进行预处理
下面要建一个脚本文件pre_deal.sh
,请把这个脚本文件放在dataset
目录下,和数据集raw_user.csv
放在同一个目录下:
1 |
|
下面就可以执行pre_deal.sh脚本文件,来对raw_user.csv进行数据预处理,命令如下:
1 | cd /usr/local/bigdatacase/dataset |
可以使用head命令查看前10行数据
1 | head -10 user_table.txt |
导入数据库
启动HDFS
执行下面的命令启动Hadoop:
1 | start-dfs.sh |
然后输入jps命令查看当前的进程:
1 | 43529 NameNode |
把user_table.txt上传到HDFS中
在HDFS的根目录下创建一个新的目录bigdatacase并在这个目录下创建一个子目录dataset
1 | hdfs dfs -mkdir -p /bigdatacase/dataset |
然后把本地的user_table.txt上传到分布式文件系统HDFS的/bigdatacase/dataset
目录下
1 | hdfs dfs -put /usr/local/bigdatacase/dataset/user_table.txt /bigdatacase/dataset |
可以查看以下HDFS中user_table.txt
的前10条记录
1 | hdfs dfs -cat /bigdatacase/dataset/user_table.txt | head -10 |
在Hive上创建数据库
首先启动MySQL数据库
1 | service mysql start |
启动hive的元数据
1 | hive --service metastore |
在新的终端下进入Hive
1 | hive |
在Hive中创建一个数据库dblab
1 | hive> create database dblab; |
创建外部表
在hive命令提示符下输入
1 | hive> CREATE EXTERNAL TABLE dblab.bigdata_user(id INT,uid STRING,item_id STRING,behavior_type INT,item_category STRING,visit_date DATE,province STRING) COMMENT 'Welcome to xmudblab!' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '/bigdatacase/dataset'; |
查询数据
在“hive>”命令提示符状态下执行下面命令查看表的信息:
1 | hive> use dblab;//使用dblab数据库 |
还可以执行下面命令查看表的简单结构:
1 | hive> desc bigdata_user; |
现在可以使用下面命令查询相关数据:
1 | hive> select * from bigdata_user limit 10; |
Hive数据分析
简单查询分析
首先执行一条简单的指令:
1 | hive> select behavior_type from bigdata_user limit 10;#查看前10位用户对商品的行为 |
如果要查出每位用户购买商品时的多种信息,输出语句格式如下:
select 列1,列2,….,列n from 表名;
比如查询前20位用户购买商品时的时间和商品的种类,语句如下:
1 | hive> select visit_date, item_category from bigdata_user limit 20; |
有时在表中查询可以利用嵌套语句,如果列名太复杂可以设置该列的别名,以简化操作的难度,举例如下:
1 | hive> select e.bh, e.it from (select behavior_type as bh, item_category as it from bigdata_user) as e limit 20; |
查询条数统计
用聚合函数count()计算出表内有多少行数据
1 | hive> select count(*) from bigdata_user; |
在函数内部加上distinct,查出uid不重复的数据有多少条
1 | hive> select count(distinct uid) from bigdata_user; |
查询不重复的数据有多少条(为了排除客户刷单情况)
1 | hive> select count(*) from (select uid,item_id,behavior_type,item_category,visit_date,province from bigdata_user group by uid,item_id,behavior_type,item_category,visit_date,province having count(*)=1) a; |
关键字条件查询分析
以关键字的存在区间为条件的查询
查询2014年12月10日到2014年12月13日有多少人浏览了商品。
1 | hive> select count(*) from bigdata_user where behavior_type='1' and visit_date<'2014-12-13' and visit_date>'2014-12-10'; |
以月的第n天为统计单位,依次显示第n天网站卖出去的商品的个数
1 | hive> select count(distinct uid), day(visit_date) from bigdata_user where behavior_type='4' group by day(visit_date); |
关键字赋予给定值为条件,对其他数据进行分析
取给定时间和给定地点,求当天发出到该地点的货物的数量。
1 | hive> select count(*) from bigdata_user where province='江西' and visit_date='2014-12-12' and behavior_type='4'; |
根据用户行为分析
查询一件商品在某天的购买比例或浏览比例
查询有多少用户在2014-12-11购买了商品
1 | hive> select count(*) from bigdata_user where visit_date='2014-12-11'and behavior_type='4'; |
查询有多少用户在2014-12-11点击了该店
1 | hive> select count(*) from bigdata_user where visit_date ='2014-12-11'; |
查询某个用户在某一天点击网站占该天所有点击行为的比例(点击行为包括浏览、加入购物车、收藏、购买)
查询用户10001082在2014-12-12点击网站的次数
1 | hive> select count(*) from bigdata_user where uid=10001082 and visit_date='2014-12-12'; |
查询所有用户在这一天点击该网站的次数
1 | hive> select count(*) from bigdata_user where visit_date='2014-12-12'; |
给定购买商品的数量范围,查询某一天在该网站的购买该数量商品的用户id
查询某一天在该网站购买商品超过5次的用户id
1 | hive> select uid from bigdata_user where behavior_type='4' and visit_date='2014-12-12' group by uid having count(behavior_type='4')>5; |
用户实时查询分析
查询某个地区的用户当天浏览网站的次数
创建新的数据表进行存储
1 | hive> create table scan(province STRING,scan INT) COMMENT 'This is the search of bigdataday' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; |
导入数据
1 | hive> insert overwrite table scan select province,count(behavior_type) from bigdata_user where behavior_type='1' group by province; |
显示结果
1 | hive> select * from scan; |
Hive、MySQL、HBase数据互导
Hive预操作
创建临时表user_action
1 | hive> create table dblab.user_action(id STRING,uid STRING, item_id STRING, behavior_type STRING, item_category STRING, visit_date DATE, province STRING) COMMENT 'Welcome to XMU dblab! ' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; |
现在可以新建一个终端,执行命令查看一下,确认这个数据文件在HDFS中确实已经被创建,在新建的终端中执行下面命令
1 | hdfs dfs -ls /user/hive/warehouse/dblab.db/ |
可以看到目录内容:
1 | Found 2 items |
将bigdata_user
表中的数据插入到user_action
下面把dblab.bigdata_user
数据插入到dblab.user_action
表中,命令如下:
1 | hive> INSERT OVERWRITE TABLE dblab.user_action select * from dblab.bigdata_user; |
然后执行下面命令查询上面的插入命令是否成功执行
1 | hive> select * from user_action limit 10; |
使用Java API将数据从Hive导入MySQL
将前面生成的临时表数据从Hive导入到 MySQL中
登录MySQL
1 | sudo mysql -u root |
创建数据库并授权给hadoop
用户
1 | mysql> show databases; # 显示所有数据库 |
退出root
用户
1 | mysql> exit; |
登陆hadoop
用户
1 | mysql> show databases; # 显示所有数据库 |
注意:用下面命令查看数据库的编码
1 | mysql> show variables like "char%"; |
如果character_set_server不是utf8之类的编码,则需要修改配置文件
在
[mysqld]
下添加一行character_set_server=utf8
/etc/mysql/mysql.conf.d/mysqld.cnf
1
2 [mysqld]
character_set_server=utf8然后重启MySQL服务
1 sudo service mysql restart
创建表
下面在MySQL的数据库dblab
中创建一个新表user_action
,并设置其编码为utf-8
:
1 | mysql> CREATE TABLE `dblab`.`user_action` (`id` varchar(50),`uid` varchar(50),`item_id` varchar(50),`behavior_type` varchar(10),`item_category` varchar(50), `visit_date` DATE,`province` varchar(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
创建成功后exit
退出MySQL
导入数据
通过JDBC连接Hive和MySQL,将数据从Hive导入MySQL。通过JDBC连接Hive,需要通过Hive的thrift服务实现跨语言访问Hive,实现thrift服务需要开启hiveserver2。
启动HDFS以后,在终端中启动metastore
1 | hive --service metastore |
在另一个终端中执行以下命令开启HiveServer2
,并设置默认端口为10000(如果按照前面教程配置了hiveserver2的端口,这里的-hiveconf
选项不需要添加)
1 | hive --service hiveserver2 -hiveconf hive.server2.thrift.port=10000 |
启动时,当屏幕上出现“Hive Session ID = 6bd1726e-37c5-41fc-93ea-ef7e176b24f2”信息时,会停留较长的时间,需要出现几个“Hive Session ID=…”以后,Hive才会真正启动。启动成功以后,会出现如下信息
1 | Hive Session ID = bb1c1106-83ce-4653-9541-c79a86945ea0 |
不要关闭这个终端,保持服务的运行
在新的终端下运行以下命令查看10000号和10002号端口是否已经被占用,如果被占用,说明启动成功,可以在浏览器访问127.0.0.1:10002
打开hiveserver2的网页接口
1 | sudo netstat -anp |grep "10000\|10002" |
端口信息如下
1 | tcp6 0 0 :::10000 :::* LISTEN 76077/java |
启动IntelliJ IDEA,创建一个项目名为HivetoMySQL
将$HADOOP_HOME/share/hadoop/common
和$HIVE_HOME/lib
目录下JAR包导入到项目中,[3]
- 点击工具栏的 File 选项
- 点击 Project Structure(CTRL + SHIFT + ALT + S on Windows/Linux,⌘ + ; on Mac OS X)
- 选择左侧的 Modules 选项
- 选择 Dependencies tab
- 点击 + → JARs or directories
- 选择需要导入JAR包的所在目录
- 点击 Apply 应用选项
导入后可以在左边的External Libraries中看到导入的JAR包
删除原有的Main
类,创建一个公共类HivetoMySQL
编写HivetoMySQL.java
代码,注意用户名和密码,以及端口是否正确,运行代码等待导入
然后就是漫漫漫漫漫漫漫漫漫漫漫漫长长长长长长长长长长长长长长的等待时间…(人生苦短,不要用raw_user…)
1 | import java.sql.*; |
使用HBase Java API把数据从本地导入到HBase中
数据准备
先将之前的user_action
数据从HDFS复制到Linux系统的本地文件系统中
1 | hdfs dfs -get /user/hive/warehouse/dblab.db/user_action /usr/local/bigdatacase/dataset/ |
创建一个项目,起名叫ImportHBase
,像上面一样将目录$HADOOP_HOME/share/hadoop/common
和$HBASE_HOME/lib
下的JAR包导入到项目中,删除原有的Main
类,新建一个ImportHBase
类
编写代码ImportHBase.java
1 | import java.io.BufferedReader; |
打包成可执行jar包[4]
- 点击工具栏 Files 选项
- 点击 Project Structure(CTRL + SHIFT + ALT + S on Windows/Linux,⌘ + ; on Mac OS X)
- 点击 Artifacts
- 点击 + 号,选择JAR,From Modules with dependencies
- Main Class 选择ImportHBase
- JAR files from libraries 选择 extract to the target JAR
- 选择META-INF/MANIFEST.MF的路径,路径选择src即可
- 点击OK完成配置
- 点击工具栏 Build 选项
- 点击Build Artifact
- 点击 Build 等待编译
将生成的jar包复制到/usr/local/bigdatacase/hbase
目录
1 | mkdir /usr/local/bigdatacase/hbase |
启动HDFS、ZooKeeper和HBase
1 | start-dfs.sh |
启动HBase Shell
1 | hbase shell |
启动成功后,进入"hbase>"命令提示符状态
创建user_action
表
1 | hbase:001:0> create 'user_action', { NAME => 'f1', VERSIONS => 5} |
确保user_action
表为空
1 | hbase:001:0> truncate 'user_action' |
通过hadoop jar命令运行上面的Java程序
1 | hadoop jar /usr/local/bigdatacase/hbase/ImportHBase ImportHBase /usr/local/bigdatacase/dataset/user_action.output |
然后就是漫长的等待时间(相较于上面的Hive导入MySQL,已经是非常非常快了)
导入完成以后在HBase Shell窗口,执行下面命令查询数据
1 | hbase:001:0> scan 'user_action',{LIMIT=>10} |
没啦,别问为什么没写完,因为数据没导完啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
不愧是大数据
在这里放一只小猫,学累了就摸摸它
1 | __ |