写在前面

简介:本文章基于厦门大学提供的大数据课程实验案例:网站用户行为分析,通过使用 CentOS 操作编写而来。具体介绍请打开链接进行阅读。

这里介绍几点值得特别注意的事项:

1、对于案例所涉及的系统及软件此文档使用的是以下版本,其他软件版本随意:

  • Linux系统(CentOS7)
  • MySQL(5.7)
  • Hadoop(3.1.3)
  • HBase(2.2.2,HBase版本需要和Hadoop版本兼容)
  • Hive(3.1.2,Hive需要和Hadoop版本兼容)
  • Sqoop(1.4.7)
  • R(3.6.0)
  • IDEA( 2023.3.6 社区版)

PS:Hadoop 与 HBase、Hive 版本一定要兼容!!!版本一定要兼容!!!这很重要!!!😃😃😃其他软件随意。

2、所有下载的安装包均在 / 目录下。所有安装的软件均在 /usr/local/ 目录下以 软件名-版本号 方式命名。在进行每个软件的安装操作之前请先整体阅读整个软件安装流程的文章有个整体思路,了解到安装此软件需要做哪些设置再进行操作,这样可以避免很多不必要的麻烦。

3、此案例分为五个步骤,请按照步骤顺序进行阅读!!🙂🙂

1. 实验数据集的下载

本案例采用的数据集为 user.zip,包含了一个大规模数据集 raw_user.csv (包含2000万条记录),和一个小数据集 small_user.csv(只包含30万条记录)。小数据集 small_user.csv 是从大规模数据集 raw_user.csv 中抽取的一小部分数据。之所以抽取出一少部分记录单独构成一个小数据集,是因为,在第一遍跑通整个实验流程时,会遇到各种错误,各种问题,先用小数据集测试,可以大量节约程序运行时间。等到第一次完整实验流程都顺利跑通以后,就可以最后用大规模数据集进行最后的测试。

下面,请在本机先下载 user.zip数据集 ,然后上传到自己的 Linux 系统。或者直接在虚拟机的浏览器打开下载。

我这里将它上传到 Linux 的 / 目录:

1
2
3
4
5
6
7
8
# 进入 / 目录
cd /

# 上传
sudo rz

# 查看
ll

通过上面命令,就进入到了 user.zip 文件所在的目录,并且可以看到有个 user.zip 文件。注意,如果你把 user.zip 下载到了其他目录,这里请进入到你自己的存放 user.zip 的目录。

下面需要把 user.zip 进行解压缩,我们需要首先建立一个用于运行本案例的目录 bigdatacase,请执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cd /usr/local

sudo mkdir bigdatacase

# 下面给 muyoukule 用户赋予针对 bigdatacase 目录的各种操作权限
sudo chown -R muyoukule:muyoukule ./bigdatacase

cd bigdatacase

# 下面创建一个dataset目录,用于保存数据集
mkdir dataset

# 下面就可以解压缩user.zip文件
sudo unzip /user.zip -d /usr/local/bigdatacase/dataset

cd /usr/local/bigdatacase/dataset

ls

现在你就可以看到在dataset目录下有两个文件:raw_user.csvsmall_user.csv

我们执行下面命令取出前面 5 条记录看一下:

1
head -5 raw_user.csv

可以看到,前 5 行记录如下:

1
2
3
4
5
user_id,item_id,behavior_type,user_geohash,item_category,time
10001082,285259775,1,97lk14c,4076,2014-12-08 18
10001082,4368907,1,,5503,2014-12-12 12
10001082,4368907,1,,5503,2014-12-12 12
10001082,53616768,1,,9762,2014-12-02 15

可以看出,每行记录都包含 5 个字段,数据集中的字段及其含义如下:

1
2
3
4
5
6
user_id(用户id)
item_id(商品id)
behaviour_type(包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4)
user_geohash(用户地理位置哈希值,有些记录中没有这个字段值,所以后面我们会用脚本做数据预处理时把这个字段全部删除)
item_category(商品分类)
time(该记录产生时间)

2. 数据集的预处理

2.1 删除文件第一行记录,即字段名称

raw_usersmall_user 中的第一行都是字段名称,我们在文件中的数据导入到数据仓库 Hive 中时,不需要第一行字段名称。因此,这里在做数据预处理时,删除第一行

1
2
3
4
5
6
7
8
9
10
11
12
cd /usr/local/bigdatacase/dataset

# 下面删除raw_user中的第1行
# 1d表示删除第1行,同理,3d表示删除第3行,nd表示删除第n行
sed -i '1d' raw_user.csv

# 下面删除small_user中的第1行
sed -i '1d' small_user.csv

# 下面再用head命令去查看文件的前5行记录,就看不到字段名称这一行了
head -5 raw_user.csv
head -5 small_user.csv

接下来的操作中,我们都是用 small_user.csv 这个小数据集进行操作,这样可以节省时间。等所有流程都跑通以后,你就可以使用大数据集 raw_user.csv 去测试一遍了。

2.2 对字段进行预处理

下面对数据集进行一些预处理,包括为每行记录增加一个 id 字段(让记录具有唯一性)、增加一个省份字段(用来后续进行可视化分析),并且丢弃 user_geohash 字段(后面分析不需要这个字段)。

下面我们要建一个脚本文件 pre_deal.sh,请把这个脚本文件放在 dataset 目录下,和数据集 small_user.csv 放在同一个目录下:

1
2
cd /usr/local/bigdatacase/dataset
vim pre_deal.sh

上面使用 vim 编辑器新建了一个 pre_deal.sh 脚本文件,请在这个脚本文件中加入下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
#下面设置输入文件,把用户执行pre_deal.sh命令时提供的第一个参数作为输入文件名称
infile=$1
#下面设置输出文件,把用户执行pre_deal.sh命令时提供的第二个参数作为输出文件名称
outfile=$2
#注意!!最后的$infile > $outfile必须跟在}’这两个字符的后面
awk -F "," 'BEGIN{
srand();
id=0;
Province[0]="山东";Province[1]="山西";Province[2]="河南";Province[3]="河北";Province[4]="陕西";Province[5]="内蒙古";Province[6]="上海市";
Province[7]="北京市";Province[8]="重庆市";Province[9]="天津市";Province[10]="福建";Province[11]="广东";Province[12]="广西";Province[13]="云南";
Province[14]="浙江";Province[15]="贵州";Province[16]="新疆";Province[17]="西藏";Province[18]="江西";Province[19]="湖南";Province[20]="湖北";
Province[21]="黑龙江";Province[22]="吉林";Province[23]="辽宁"; Province[24]="江苏";Province[25]="甘肃";Province[26]="青海";Province[27]="四川";
Province[28]="安徽"; Province[29]="宁夏";Province[30]="海南";Province[31]="香港";Province[32]="澳门";Province[33]="台湾";
}
{
id=id+1;
value=int(rand()*34);
print id"\t"$1"\t"$2"\t"$3"\t"$5"\t"substr($6,1,10)"\t"Province[value]
}' $infile > $outfile

上面的代码的基本形式是:

1
awk -F "," '处理逻辑' $infile > $outfile

使用 awk 可以逐行读取输入文件,并对逐行进行相应操作。其中,-F 参数用于指出每行记录的不同字段之间用什么字符进行分割,这里是用逗号进行分割。处理逻辑代码需要用两个英文单引号引起来。 $infile 是输入文件的名称,我们这里会输入 raw_user.csv$outfile 表示处理结束后输出的文件名称,我们后面会使用 user_table.txt 作为输出文件名称。

在上面的 pre_deal.sh 代码的处理逻辑部分,srand() 用于生成随机数的种子,id 是我们为数据集新增的一个字段,它是一个自增类型,每条记录增加 1,这样可以保证每条记录具有唯一性。我们会为数据集新增一个省份字段,用来进行后面的数据可视化分析,为了给每条记录增加一个省份字段的值,这里,我们首先用 Province[] 数组用来保存全国各个省份信息,然后,在遍历数据集 raw_user.csv 的时候,每当遍历到其中一条记录,使用 value=int(rand()*34) 语句随机生成一个 0-33 的整数,作为 Province 省份值,然后从 Province[] 数组当中获取省份名称,增加到该条记录中。

substr ($6,1,10) 这个语句是为了截取时间字段 time 的年月日,方便后续存储为 date 格式。awk 每次遍历到一条记录时,每条记录包含了6个字段,其中,第6个字段是时间字段,substr($6,1,10) 语句就表示获取第 6 个字段的值,截取前 10 个字符,第 6 个字段是类似 2014-12-08 18 这样的字符串(也就是表示 2014年12月8日18时),substr($6,1,10)截取后,就丢弃了小时,只保留了年月日。

另外,在 print id"\t"$1"\t"$2"\t"$3"\t"$5"\t"substr($6,1,10)"\t"Province[value] 这行语句中,我们丢弃了每行记录的第4个字段,所以,没有出现 $4。我们生成后的文件是 \t 进行分割,这样,后续我们去查看数据的时候,效果让人看上去更舒服,每个字段在排版的时候会对齐显示,如果用逗号分隔,显示效果就比较乱。

最后,保存 pre_deal.sh 代码文件,退出 vim 编辑器。

下面就可以执行 pre_deal.sh 脚本文件,来对 small_user.csv 进行数据预处理,命令如下:

1
2
cd /usr/local/bigdatacase/dataset
bash ./pre_deal.sh small_user.csv user_table.txt

可以使用 head 命令查看生成的 user_table.txt,不要直接打开,文件过大,会出错,下面查看前 10 行数据:

1
head -10 user_table.txt

可以得到如下结果:

1
2
3
4
5
6
7
8
9
10
1       10001082        285259775       1       4076    2014-12-08      吉林
2 10001082 4368907 1 5503 2014-12-12 贵州
3 10001082 4368907 1 5503 2014-12-12 西藏
4 10001082 53616768 1 9762 2014-12-02 江苏
5 10001082 151466952 1 5232 2014-12-12 青海
6 10001082 53616768 4 9762 2014-12-02 广西
7 10001082 290088061 1 5503 2014-12-12 台湾
8 10001082 298397524 1 10894 2014-12-12 辽宁
9 10001082 32104252 1 6513 2014-12-12 内蒙古
10 10001082 323339743 1 10894 2014-12-12 四川

2.3 导入数据库

下面要把 user_table.txt 中的数据最终导入到数据仓库 Hive 中。为了完成这个操作,我们会首先把 user_table.txt 上传到分布式文件系统 HDFS 中,然后,在 Hive 中创建一个外部表,完成数据的导入。

1、启动HDFS

请执行下面命令启动 Hadoop(如果你已经启动了 Hadoop 就不用再次启动了):

1
2
3
4
5
# 启动 Hadoop
start-all.sh

# 查看当前运行的进程
jps

如果出现下面这些进程,说明 Hadoop 启动成功了。

1
2
3
4
5
6
NameNode
DataNode
NodeManager
SecondaryNameNode
ResourceManager
Jps

2、把 user_table.txt 上传到 HDFS 中

现在,我们要把 Linux 本地文件系统中的 user_table.txt 上传到分布式文件系统 HDFS 中,存放在 HDFS 中的 /bigdatacase/dataset 目录下。

首先,请执行下面命令,在 HDFS 的根目录下面创建一个新的目录 bigdatacase,并在这个目录下创建一个子目录 dataset,如下:

1
2
3
cd /usr/local/hadoop-3.1.3

hdfs dfs -mkdir -p /bigdatacase/dataset

然后,把 Linux 本地文件系统中的 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
1
2
3
4
5
6
7
8
9
10
1       10001082        285259775       1       4076    2014-12-08      吉林
2 10001082 4368907 1 5503 2014-12-12 贵州
3 10001082 4368907 1 5503 2014-12-12 西藏
4 10001082 53616768 1 9762 2014-12-02 江苏
5 10001082 151466952 1 5232 2014-12-12 青海
6 10001082 53616768 4 9762 2014-12-02 广西
7 10001082 290088061 1 5503 2014-12-12 台湾
8 10001082 298397524 1 10894 2014-12-12 辽宁
9 10001082 32104252 1 6513 2014-12-12 内蒙古
10 10001082 323339743 1 10894 2014-12-12 四川

3、在 Hive 上创建数据库

启动 MySQL 数据库:

1
2
3
4
5
# 查看 MySQL 状态
systemctl status mysqld

# 启动 MySQL
sudo systemctl start mysqld

由于 Hive 是基于 Hadoop 的数据仓库,使用 HiveQL 语言撰写的查询语句,最终都会被 Hive 自动解析成 MapReduce 任务由 Hadoop去具体执行,因此,需要启动 Hadoop,然后再启动 Hive。由于前面我们已经启动了 Hadoop,所以,这里不需要再次启动 Hadoop。下面,在这个新的终端中执行下面命令进入 Hive:

1
2
# 启动Hive
hive

启动成功以后,就进入了 hive> 命令提示符状态,可以输入类似 SQL 语句的 HiveQL 语句。

下面,我们要在 Hive 中创建一个数据库 dblab,命令如下:

1
2
3
create database dblab;

use dblab;

4、创建外部表

在数据库 dblab 中创建一个外部表 bigdata_user,它包含字段 id, uid, item_id, behavior_type, item_category, date, province ,请在 hive 命令提示符下输入如下命令:

1
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 xmu dblab!' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '/bigdatacase/dataset';

5、查询数据

上面已经成功把 HDFS 中的 /bigdatacase/dataset 目录下的数据加载到了数据仓库 Hive 中,我们现在可以使用下面命令查询一下:

1
select * from bigdata_user limit 10;

结果:

1
2
3
4
5
6
7
8
9
10
11
12
OK
1 10001082 285259775 1 4076 2014-12-08 吉林
2 10001082 4368907 1 5503 2014-12-12 贵州
3 10001082 4368907 1 5503 2014-12-12 西藏
4 10001082 53616768 1 9762 2014-12-02 江苏
5 10001082 151466952 1 5232 2014-12-12 青海
6 10001082 53616768 4 9762 2014-12-02 广西
7 10001082 290088061 1 5503 2014-12-12 台湾
8 10001082 298397524 1 10894 2014-12-12 辽宁
9 10001082 32104252 1 6513 2014-12-12 内蒙古
10 10001082 323339743 1 10894 2014-12-12 四川
Time taken: 0.959 seconds, Fetched: 10 row(s)
1
select behavior_type from bigdata_user limit 10;

结果:

1
2
3
4
5
6
7
8
9
10
11
12
OK
1
1
1
1
1
4
1
1
1
1
Time taken: 0.113 seconds, Fetched: 10 row(s)