嘉明的云计算与大数据学习之大数据综合实验案例
Posted Zcymatics
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嘉明的云计算与大数据学习之大数据综合实验案例相关的知识,希望对你有一定的参考价值。
1.实验环境
(1)Linux:Ubuntu 16.04。
虚拟机镜像下载链接:https://pan.baidu.com/s/1i_B-2rAfPM53jf7Besi0tw
提取码:WZJM
(2)mysql:5.7.16。
(3)Hadoop:2.7.1。
(4)HBase:1.1.5。
(5)Hive:1.2.1。
(6)Sqoop:1.4.6。
(7)R:4.1.2。
(8)Eclipse:3.8。
2.实验步骤概述
本案例共包含4个实验步骤。
(1)本地数据集上传到数据仓库Hive。
(2)Hive数据分析。
(3)Hive,MySQL、HBase数据互导。
(4)利用R进行数据可视化分析。
实验整体的流程如下:
将数据源抽取到HDFS存储;
通过Hive清洗、处理和计算原始数据;
HIve清洗处理后的结果,可以存入Hbase或者其它数据库中例如MySQL
2.1.本地数据集上传到数据仓库Hive
数据集的下载链接
链接:https://pan.baidu.com/s/1wsHq9BlbNb-291UWnDduJg
提取码:WZJM
登录Linux系统,并在Linux系统中打开浏览器火狐浏览器;然后在Linux系统的浏览器中下载user. zip到本地。,因为采用的是hadoop用户名登录了Linux系统,所以,下载后的文件会被浏览器默认保存到“/home/ hadoop/下载/”目录下面。
打开终端输入如下命令:
cd home/hadoop/下载
Ls
出现uer.zip后证明下载成功
下面需要把user. zip进行解压缩,首先建立一个用于运行的目录bigdatacase,执行以下命令:
cd /usr/local
ls
sudo mkdir bigdatacase#这里会提示你输入当前用户(本教程是hadoop用户名)的密码#下面给hadoop用户赋予针对bigdatacase目录的各种操作权限
sudo chown -R hadoop:hadoop ./bigdatacasecd bigdatacase#下面创建一个dataset目录,用于保存数据集
mkdir dataset#下面就可以解压缩user.zip文件cd ~ //表示进入hadoop用户的目录cd 下载
ls
unzip user.zip -d /usr/local/bigdatacase/datasetcd /usr/local/bigdatacase/dataset
ls
现在就可以看到在 dataset目录下有两个文件:raw_user,csv和 small_user.csv。执行下面命令取出前面5条记录看一下:
head -5 raw_user.csv
可以看出,每行记录都包含5个字段,数据集中的字段及其含义如下。
(1) user_id(用户id)。
(2) item_id(商品id)。
(3) behaviour_type(包括浏览﹑收藏,加购物车、购买,对应取值分别是1、2、3、4)。
(4) user_geohash(用户地理位置哈希值,有些记录中没有这个字段值,所以后面会用脚本做数据预处理时把这个字段全部删除)。
(5) item_category(商品分类)。
(6) time(该记录产生时间)。
2.2.Hive数据分析
2.2.1.数据集的预处理
2.2.1.1.删除第一行文件的记录
cd /usr/local/bigdatacase/dataset#下面删除raw_user中的第1行
sed -i '1d' raw_user#上面的1d表示删除第1行,同理,3d表示删除第3行,nd表示删除第n行#下面删除small_user中的第1行
sed -i '1d' small_user#下面再用head命令去查看文件的前5行记录,就看不到字段名称这一行了
head -5 raw_user.csv
head -5 small_user.csv
2.2.1.2.对字段进行预处理
下面对数据集进行预处理,包括为每行记录增加一个id字段(让记录具有唯一性)、增加一个省份字段(用来后续进行可视化分析),并且丢弃user_geohash字段(后面分析不需要这个字段)。
下面要建一个脚本文件 pre_deal.sh,把这个脚本文件放在 dataset目录下﹐和数据集small_user.csv放在同一个目录下:
cd /usr/local/bigdatacase/dataset
vim pre_deal.sh
上面使用vim编辑器新建了一个pre_deal.sh脚本文件,在这个脚本文件下加入下面代码:
#!/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
执行pre_deal.sh脚本文件,对small_user.csv进行数据预处理,命令如下:
cd /usr/local/bigdatacase/dataset
bash ./pre_deal.sh small_user.csv user_table.txt
可以查看生成的user_table.txt,但是,不要直接打开。因为文件过大,直接打开会出错,可以使用head命令查看前10行数据:
head -10 user_table.txt
执行上面命令以后,可以得到如下结果:
2.2.2.导入数据库
下面把user_table.txt中的数据导入到数据仓库 Hive中。为了完成这个操作,首先需要把user_table.txt 上传到分布式文件系统HDFS中;然后在Hive中创建一个外部表,完成数据的导入。
2.2.2.1.启动HDFS
下面登录Linux系统,打开一个终端,执行下面命令启动Hadoop:
cd /usr/local/hadoop
./sbin/start-all.sh
查看当前运行的进程
jps
2.2.2.2.把user_table.txt上传到HDFS中
现在需要把Linux本地文件系统中的user_table.txt上传到分布式文件系统HDFS中,并存放在HDFS中的/bigdatacase/ dataset目录下。
首先需要在 HDFS的根目录下面创建一个新的目录 bigdatacase,并在这个目录下创建一个子目录dataset,具体命令如下:
cd /usr/local/hadoop ./bin/hdfs dfs –mkdir -p /bigdatacase/dataset ./bin/hdfs dfs –mkdir -ls /bigdatacase
然后把Linux本地文件系统的user_table.txt上传到分布式文件系统HDFS的/bigdatacase/dataset目录下:
./bin/hdfs dfs -put /usr/local/bigdatacase/dataset/user_table.txt /bigdatacase/dataset
查看HDFS中user_table.txt的前10条记录,命令如下:
./bin/hdfs dfs-cat /bigdatacase/dataset/user_table.txt | head -10
2.2.3.在Hive下创建数据库
下面在Linux系统中再新建一个终端(可以在刚才已经建好的终端界面的左上角,单击“终端”菜单,在弹出的子菜单中选择“新建终端”)。因为需要借助于MySQL保存 Hive的元数据﹐所以,先启动MySQL数据库,可以在终端中输人如下命令:
service mysql start #可以在Linux的任何目录下执行该命令
进入Hive,命令如下:
cd /usr/local/hive
./bin/hive #启动Hive
启动成功后,就进入了hive>命令提示符状态。在Hive中创建一个数据库dblab,命令如下:
hive> create database dblab;
hive> use dblab;
2.2.3.1.创建外部表
在数据库dblab中创建一个外部表bigdata_user,它包含字段(id , uid, item_id, behavior_type, item_category , date, province),在 hive命令提示符下输入如下命令:
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';
2.2.3.2.查询数据
上面已经成功把 HDFS中的/bigdatacase/dataset目录下的数据加载到了数据仓库Hive 中;然后在hive>命令提示符状态下执行下面命令查看表的信息:
hive> use dblab; //使用dblab数据库
hive> show tables; //显示数据库中所有表
hive> show create table bigdata_user; //查看bigdata_user表的各种属性
查看表的简单结构:
hive> desc bigdata_user;
查询相关数据:
hive> select * from bigdata_user limit 10;
hive> select behavior_type from bigdata_user limit 10;
2.2.4.Hive进行数据分析
查看前10位用户对商品的行为:
hive> select behavior_type from bigdata_user limit 10; #查看前10位用户对商品的行为
查询前20位用户购买商品的时间和商品的种类:
hive> select visit_date, item_category from bigdata_user limit 20;
有时在表中查询可以利用嵌套语句,如果列名太复杂可以设置该列的别名,以简化操作的难度,举例如下:
hive> select e.bh, e.it from (select behavior_type as bh, item_category as it from bigdata_user) as e limit 20;
上面语句中,“behavior_type as bh,item_category as it”是为behavior_type设置别名bh,为 item_category设置别名it,FROM的括号里的内容,也设置了别名e,这样调用时就可以使用e.bh和e.it,可以简化代码。
2.2.4.1.查询条数统计分析
用聚合函数 count()计算出表内有多少行数据:
hive> select count(*) from bigdata_user;
在函数内部加上distinct,查出uid不重复的数据有多少条:
hive> select count(distinct uid) from bigdata_user;
查询不重复的数据有多少条(排除客户刷单情况):
hive>select count(*) from (select uid,item_id,behavior_type,item_category,visit_date,province from bigdata_user groupby uid,item_id,behavior_type,item_category,visit_date,province having count(*)=1)a;
2.2.4.2.关键字条件查询分析
以关键字的存在区间为条件的查询
查询2014年12月10日到2014年12月13日有多少人浏览了商品。:
hive> select count(*) from bigdata_user where behavior_type='1' and visit_date<'2014-12-13' and visit_date>'2014-12-10';
以月的第n天为统计单位,依次显示第n天网站卖出去的商品的个数:
hive> select count(distinct uid), day(visit_date) from bigdata_user where behavior_type='4' group by day(visit_date);
关键字赋予定值为条件,对其他数据进行分析
取给定时间和给定地点,求当天发出到该地点的货物的数量:
hive> select count(*) from bigdata_user where province='江西' and visit_date='2014-12-12' and behavior_type='4';
2.2.4.3.根据用户行为分析
查询一件商品在某天的购买比例或者浏览比例:
hive> select count(*) from bigdata_user where visit_date='2014-12-11'and behavior_type='4';#查询有多少用户在2014-12-11购
hive> select count(*) from bigdata_user where visit_date ='2014-12-11';#查询有多少用户在2014-12-11点击了该店
查询某个用户在某一天点击网站占改天所有点击行为的比例:
hive> select count(*) from bigdata_user where uid=10001082 and visit_date='2014-12-12';#查询用户10001082在2014-12-12点击网站的次数
hive> select count(*) from bigdata_user where visit_date='2014-12-12';#查询所有用户在这一天点击该网站的次数
给定购买商品的数量范围,查询某一天在该网站的购买该数量商品的用户id:
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;#查询某一天在该网站购买商品超过5次的用户id
2.2.4.4.用户实时查询分析
查询某个地区的用户当天浏览网站的次数,语句如下:
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;#创建新的数据表进行存储
hive> insert overwrite table scan select province,count(behavior_type) from bigdata_user where behavior_type='1' group by province;#导入数据
hive> select * from scan;#显示结果
2.3.Hive,MySQL,HBase数据互导
2.3.1.Hive预操作
2.3.1.1.创建临时表user_action
进入Hive与hadoop,命令如下:
cd /usr/local/hadoop
./sbin/start-all.sh #启动Hadoop
cd /usr/local/hive
./bin/hive #启动Hive
命令如下:
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中确实已经被创建
cd /usr/local/hadoop
./bin/hdfs dfs -ls /user/hive/warehouse/dblab.db/user_action
2.3.1.2.将bigdata_user表中的数据插入到user_action
1.将bigdata_user表中的数据插入到user_action命令如下:
hive> INSERT OVERWRITE TABLE dblab.user_action select * from dblab.bigdata_user;
2.查询上面的插入命令是否成功
hive> select * from user_action limit 10;
2.3.2.使用Sqoop将数据从Hive导入MySQL
2.3.2.1.安装sqoop
1.访问Sqoop官网(http:// sqoop.apache. org/),下载Sqoop安装文件sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar. Gz,sqoop-1.4.6.bin_hadoop-2.0.4-alpha.tar. gz文件会被保存到“/home/hadoop/下载/”目录下。
2.执行如下命令,完成安装文件解压缩:
cd ~/下载
sudo tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /usr/local
3.将解压的文件的名称修改为sqoop,以简化操作,不用每次都输入很长的文件名,命令如下:
cd /usr/local
sudo mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop
4.接下来把sqoop文件夹的权限赋予当前的hadoop用户,命令如下:
sudo chown -R hadoop:hadoop sqoop
修改配置文件
1.执行如下命令把/usr/local/sqoop/conf目录下的配置文件 sqoop-env-template.sh 复制一份,并命名为sqoop-env.sh
cd sqoop/conf/
cat sqoop-env-template.sh >> sqoop-env.sh
2.使用vim 编辑器打开sqoop-env.sh文件进行编辑:
cd /usr/local/sqoop/conf/
vim sqoop-env.sh
3.在sqoop-env.sh文件中添加如下配置信息:
export HADOOP_COMMON_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=/usr/local/hadoop
export HBASE_HOME=/usr/local/hbase
export HIVE_HOME=/usr/local/hive
#export ZOOCFGDIR= #如果读者配置了ZooKeeper,也需要在此配置ZooKeeper的路径
配置环境变量
1.使用vim编辑器打开~/.bashrc文件,命令如下:
vim ~/.bashrc
2.在该文件开头加入如下代码:
export SQOOP_HOME=/usr/local/sqoop
export PATH=$PATH:$SBT_HOME/bin:$SQOOP_HOME/bin
export CLASSPATH=$CLASSPATH:$SQOOP_HOME/lib
3.保存该文件,并退出 vim编辑器。接下来执行如下命令使得环境变量立即生效:
source ~/.bashrc
添加Mysql驱动程序
把已经下载了MySQL驱动程序mysql-connector-java-5.1.40. tar.gz,并且被放入到"“/home/hadoop/下载”目录中。执行如下命令解压缩文件并复制到 Sqoop安装目录下:
cd ~/下载
sudo tar -zxvf mysql-connector-java-5.1.40.tar.gz #解压MySQL驱动包
ls #这时就可以看到解压缩后得到的目录mysql-connector-java-5.1.40
cp ./mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar /usr/local/sqoop/lib
测试MySql的连接
1.首先要确保 MySQL服务已经启动,如果没有启动,执行下面命令启动:
service mysql start
2.然后就可以测试 Sqoop 与 MySQL之间的连接是否成功,命令如下:
sqoop list-databases --connect jdbc:mysql://127.0.0.1:3306/ --username root -P hadoop
3.如果能够看到 MySQL数据库中的数据库列表,就表示 Sqoop安装成功。
2.3.2.2.将前面生成的临时表数据从Hive导入到MySQL中
1.登录MySQL,命令如下:
mysql –u root -p hadoop
2.进入mysql后,创建数据库
mysql> show databases; #显示所有数据库
mysql> create database dblab; #创建dblab数据库
mysql> use dblab; #使用数据库
3.查看数据库编码,mysql命令如下:
mysql>show variables like "char%";
确认编码格式为utf-8,否则无法导入中文。
4.创建表,mysql命令如下:
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;
mysql> exit #创建成功后退出
5.导入数据,命令如下:
cd /usr/local/sqoop
./bin/sqoop export --connect jdbc:mysql://localhost:3306/dblab --username root --password hadoop --table user_action --export-dir '/user/hive/warehouse/dblab.db/user_action' --fields-terminated-by '\\t'; #导入命令
6.查看MySQL中user_action表数据,命令如下:
mysql -u root -p
mysql> use dblab;
mysql> select * from user_action limit 10;
从Hive导入数据到MySQL中的操作完成。
2.3.3.使用Sqoop将数据从MySQL导入HBase
1.使用Hadoop集群、MySQL服务、HBase服务,在终端中执行如下命令:
cd /usr/local/hbase
./bin/start-hbase.sh
2.启动HBase shell
cd /usr/local/hbase
./bin/hbase shell
3.创建表user_action,命令如下:
hbase> create 'user_action', NAME => 'f1', VERSIONS => 5
4.导入数据(终端中进行),命令如下:
cd /usr/local/sqoop
./bin/sqoop import --connect jdbc:mysql://localhost:3306/dblab --username root --password hadoop --table user_action --hbase-table user_action --column-family f1 --hbase-row-key id --hbase-create-table -m 1
5.查看HBase中user_action表数据,hbase命令如下:
hbase> scan 'user_action',LIMIT=>10 #只查询前面10行
2.3.4.使用HBaseJava API把数据从本地导入到HBase中
1.启动 Hadoop集群、HBase服务,命令如下:
cd /usr/local/hadoop
./sbin/start-all.shcd /usr/local/hbase
./bin/start-hbase.sh
2.数据准备,命令如下:
cd /usr/local/bigdatacase/dataset
/usr/local/hadoop/bin/hdfs dfs -get /user/hive/warehouse/dblab.db/user_action .
#将HDFS上的user_action数据复制到本地当前目录,注意'.'表示当前目录
cat ./user_action/* | head -10 #查看前10行数据
cat ./user_action/00000* > user_action.output #将00000*文件复制一份重命名为user_action.output,*表示通配符
head user_action.output #查看user_action.output前10行
3.编写数据导入程序,采用Eclipse编写Java程序实现HBase数据导入功能
为了编写一个能够与HBase交互的Java应用程序,需要在这个界面中加载该Java 工程所需要用到的JAR包,这些JAR包中包含了可以访问HBase的Java API。这些JAR包都位于Linux系统的HBase安装目录的lib目录下,也就是位于/usr/local/hbase/lib目录下。单击界面中的Libraries选项卡,然后单击界面右侧的Add External JARs按钮,导入上述的包。
4.在 Eclipse中编写上述代码,并打包成可执行 jar包,命名”ImportHBase.jar ;然后在/usr/local/bigdatacase/目录下面新建一个 hbase子目录,用来有放ImportHBase.jar。
5.数据导入(再导入前清空uer_action表),命令如下:
cd /usr/lcoal/hbase
./bin/hbase shell
hbase> truncate 'user_action'
6.运行hadoop jar命令即刚刚编写的程序,命令如下:
/usr/local/hadoop/bin/hadoop jar /usr/local/bigdatacase/hbase/ImportHBase.jar HBaseImportTest
/usr/local/bigdatacase/dataset/user_action.output
7.查看HBase中user_action表数据,hbase命令如下:
habse> scan 'user_action',LIMIT=>10 #只查询前面10行
2.4.利用R进行数据可视化分析
2.4.1.安装R
登录Linux系统,打开一个终端,并注意保持网络连通,可以访问互联网,因为安装过程要下载各种安装文件。
1.首先利用vim编辑器打开/etc/apt/sources.list 文件,命令如下:
$ sudo vim /etc/apt/sources.list
2.在文件的最后一行添加厦门大学的镜像源:
$ deb http://mirrors.xmu.edu.cn/CRAN/bin/linux/ubuntu/ trusty/
3.然后,执行如下命令更新软件源列表:
$ sudo apt-get update
4.如果更新软件源出现“由于没有公钥无法验证签名”的错误,请执行如下命令:
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 51716619E084DAB9
5.接下来执行如下命令安装R语言:
$ sudo apt-get install r-base
6.从键盘输人y,按Enter键就可以顺利安装,结束安装结束后,可以执行下面命令启动R,启动后会显示如下信息,并进入>命令提示符状态:
$ R
7.最后可以执行下面命令退出R:
>q()
2.4.2.安装依赖库
1.因为后面的步骤不断报错,就上网找了很久,最后大多数都说是这个R的版本问题,所以就更新了一下R
$ sudo su
$ echo "deb http://www.stats.bris.ac.uk/R/bin/linux/ubuntu xenial-cran40/" >> /etc/apt/sources.list
$ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
$ apt-get update
$ apt-get upgrade
$ sudo apt-get install r-base
从2.3.2更新到4.1.2版本
为了完成可视化分析功能,需要为R安装一些依赖库,包括 RMySQL、ggplot2,devtools和 recharts。其中,RMySQL是一个提供了访问 MySQL数据库的R语言接口程序的R语言依赖库, ggplot2和recharts则是R语言中提供绘图可视化功能的依赖库。
2.启动R进入R命令提示符状态,执行如下命令安装RMySQL:
install.packages('RMySQL')
因为我们更新了R,可能自动帮我们选择了下载源,因此不用选择镜像。
3.执行如下命令安装绘图包ggplot2,更新之后就不会报错了:
> install.packages('ggplot2')
4.执行如下命令安装绘图包devtools:
> install.packages('devtools')
5.在 Ubuntul6.04上执行devtools安装时,可能会出现3次错误,根据每次错误的英文提示信息﹐就需要3个软件:libssl-dev, libssh2-1-dev, libcurl4-openssl-dev。安装命令如下:
$ sudo apt-get install libssl-dev
$ sudo apt-get install libssh2-1-dev
$ sudo apt-get install libcurl4-openssl-dev
6.最后在R命令提示符下,再执行如下命令安装taiyun/recharts :
> devtools::install_github('taiyun/recharts')
2.4.3.可视化分析
2.4.3.1.连接MySQL并获取数据
1.进入mysql,命令如下:
$ service mysql start
$ mysql -u root -p
2.查询数据,命令如下:
mysql> use dblab;
mysql> select * from user_action limit 10;
3.切换到刚才已经打开的R命令提示符终端窗口,使用如下命令让R连接到 MySQL数据库:
>library(RMySQL)>conn <- dbConnect(MySQL(),dbname='dblab',username='root',password='hadoop',host="127.0.0.1",port=3306)>user_action <- dbGetQuery(conn,'select * from user_action')
2.4.3.2.分析消费者对商品的行为
summary()函数可以得到样本数据类型和长度,如果样本是数值型,还能得到样本数据的最小值、最大值,四分位数和均值信息。
1.首先使用summary()函数查看MySQL数据库中表user_action的字段behavior_type的类型,命令如下:
>summary(user_action$behavior_type)
以上是关于嘉明的云计算与大数据学习之大数据综合实验案例的主要内容,如果未能解决你的问题,请参考以下文章
头歌Educoder云计算与大数据——实验五 Java API分布式存储