参考资料为:
教材代码-林子雨编著《大数据基础编程、实验和案例教程(第2版)》教材所有章节代码_厦大数据库实验室博客
1.实验学时
8学时
2.实验目的
- 熟悉linux,Mysql,Hadoop,Hbase,Hive,R,eclipse等系统的安装和配置,
- 了解大数据处理的基本流程。
- 熟悉不同类型的数据库的导入到处。
- 熟悉R语言的可视化分析。
3.实验内容
(一)完成基础大数据组件的安装。
由于之前实验完成了对应组件的安装,这里就放出截图:
Hbase:
Hadoop:
Hive:
Ecplise:
(二)对原始数据进行预处理。
首先得到这些数据集,这里已经提前将数据集下载到对应的linux包中:
然后将这个压缩文件进行压缩:
在进行实验之前,首先为这个数据集创建一个文件夹。
然后给这个新建的文件夹赋予权限:
之后创建一个新的文件夹用于收集这些数据集:
之后进行移进数据集的文件夹下将数据集进行压解:
之后进入对应文件夹下查看压缩的情况;
这里进行一个测试,在这个文件中去前5个记录,输出如下图:
然后可以开始数据的预处理了:
由于raw_user和文件small_user中的第一行是字段的名字,在将文件中的数据传入hive的时候,是不需要这些字段的名字的,这个时候就需要进行删除操作。需要删除第一行。
之后使用命令查看前5行的时候就没有出现字段的名字:
之后对字段进行预处理:
首先在对应的目录下新建一个vim脚本文件用于编写代码:
#!/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
之后之心这个脚本文件,进行数据的预处理,这次的预处理是对于small_user.sh文件进行的。
可以执行指令查看结果,不过由于数据量过大,所以只要查看前面10条数据。
(三)数据导入到Hive中,进行SQL分析。
之后就是将数据导入到对应的数据库中:
首先启动HDFS,启动之前首先需要启动hadoop
启动hadoop之后使用进程查看命令查看对应进程:
之后就将前面生成的txt文件传入到HDFS中,并且保存到对应的目录之下。当然,首先新建一个新的目录,在这个目录之下新建一个目录。
之后将linux系统中的文件(之前得到的txt文件传入大=到对应的HDFS目录之中)
之后可以在HDFS中查看对应的前面10条数据:
之后就是在Hive上创建数据库:
首先需要启动MySql数据库:
启动hadoop之后,就需要启动hive
启动hive之后就可以先创建一个数据库:
创建完成之后,需要创建一个新的外部表。
创建完成上面两个之后,就可以进行查询数据的操作:
显示bigdata_user表中的信息:
之后可以执行简单命令查看表的简单结构:
进行简单操作之后,可以使用命令进行数据的简单查询:
比如说查看外部表的前面10个数据:
查看表中的某一个数据(这里是用户对于商品的行为)
之后可以使用hive进行数据的分析:
比如说查询前面20位用户的商品的购买时间和其他数据:
当然也可以对输出额数据进行简化输出:
然后是进行记录的条数分析查询,在这里是用于查询这个外部表拥有多少行:
从输出结果来看,这个外部表的对应行数是300000行,这是一个巨大的外部表。
当然,这只是没有进行消除重复行的查询,这里需要进行不重复行的数据查询。
这里可以在对应查询指令中加上distinct指令进行查询。
这里首先对uid不重复行进行查询:
查询的结果是270行。
之后是查询数据不重复行有多少:
经过查询之后,得到结果是284464.
之后是进行关键词查询,进行关键词查询可以提高数据库的查询精度。
这里的查询式使用where关键字进行查询,这里是用于查询2014年12月10号13号有多少人浏览了商品。
经过查询之后发现一共有26329个人进行了查询。
然后可以查询以月第n天为统计单位,显示第n天网站卖出去的商品的全部个数。
这样就可以清晰的表示卖出的商品的个数。
之后是使用关键字给固定值进行对其他数据的查询:
查询之后可以得到卖出的地方。
这里一共有11件商品卖出。
然后是根据用户行为分析。
这里可以查询一件商品在某一天的购买或者浏览比例。
用户在2014年12月11号购买的商品的数量一共是69个。
然后查询在这一天点击这个商品的人数一共有多少人:
这里发现一共有10649的人点击了这个商品。
之后将将这两个进行相除就可以得到想要的数据。
之后是查询某个用户点击网站的行为比例:
首先是用户查询这个网站的次数:
这个点击次数是69次。
之后是所用用户这一天点击这个网站的次数:
这个次数是17494.
然后是给定用户购买商品的数量范围,查询在这个网站购买这个数量商品的用户个数:
现在实现用户实时查询分析:
查询某个地区用户当天浏览网站的次数,创建新的数据表格进行存储:
导入数据,显示结果:
显示结果:
(四)使用JavaAPI将数据从hive导入到Mysql。
首先创建一个临时表格:
执行完上面的命令之后,hive就会在HDFS中创建对应的数据文件。之后需要确定HDFS中有这个文件。
输出了结果,表示这些文件已经在HDFS中进行了创建。
可以登入hdfs上查看:
然后需要将bigdata_user表中的数据插入到user_action中
由于在之前已经创建了一个外部表,这个时候就需要将dblab.bigdata_user中的数据插入dblab.user_action表中。
之后执行下面的指令查询上面的指令查看是否已经插入完成。
出现执行结果,发现插入成功。
然后就是使用java API将数据从Hive导入MySQL中。
首先登录MySQL:
登录之后需要在mysql中创建一个数据库:
创建一个dblab数据库。
之后查看数据库的编码:
这里由于之前已经修改过,可以输入中文。
之后创建一个新表:
创建成功之后就可以退出mysql数据库了。
由于需要实现数据的迁移,需要同JDBC连接两个数据库,需要修改hadoop中的配置文件,需要在配置文件中加入这些代码:
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
之后需要开启hadoop,但是之前已经开起了hadoop,这个时候需要在对应的路径下开启hiveserver2,并且设置端口为10000.
之后设置完成之后会显示几个hive的ID,然后hive才会真正的启动。
之后启动eclipse进行程序的编写:
import java.sql.*;
import java.sql.SQLException;
public class HivetoMySQL {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
private static String driverName_mysql = "com.mysql.jdbc.Driver";
public static void main(String[] args) throws SQLException {
try {
Class.forName(driverName);
}catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(1);
}
Connection con1 = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "hive", "hive");//后两个参数是用户名密码
if(con1 == null)
System.out.println("连接失败");
else {
Statement stmt = con1.createStatement();
String sql = "select * from dblab.user_action";
System.out.println("Running: " + sql);
ResultSet res = stmt.executeQuery(sql);
//InsertToMysql
try {
Class.forName(driverName_mysql);
Connection con2 = DriverManager.getConnection("jdbc:mysql://localhost:3306/dblab","root","root");
String sql2 = "insert into user_action(id,uid,item_id,behavior_type,item_category,visit_date,province) values (?,?,?,?,?,?,?)";
PreparedStatement ps = con2.prepareStatement(sql2);
while (res.next()) {
ps.setString(1,res.getString(1));
ps.setString(2,res.getString(2));
ps.setString(3,res.getString(3));
ps.setString(4,res.getString(4));
ps.setString(5,res.getString(5));
ps.setDate(6,res.getDate(6));
ps.setString(7,res.getString(7));
ps.executeUpdate();
}
ps.close();
con2.close();
res.close();
stmt.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
con1.close();
}
}
然后在mysql数据库中输入命令查看是否运行成功:
这里进行数据导入的时候十分不建议使用书上的方法。需要下载软件sqoop 1.4.7进行导入,具体查看大数据综合实验的踩坑总结(林子雨)_lendsomething的博客-CSDN博客_大数据林子雨实验和
https://blog.csdn.net/lendsomething/article/details/106804146?spm=1001.2014.3001.5506
在mysql数据库中得到导入结果:
(五)使用JavaAPI将本地数据导入到HBase中。
之后是hbase进行导入,跟之前的方法十分的像。
首先将数据导入本地文件。然后查看前面十行数据。
之后将这个文件复制一份进行重命名:
之后编写java程序进行数据的导入。可以参考第六章
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
public class ImportHBase extends Thread {
public Configuration config;
public Connection conn;
public Table table;
public Admin admin;
public ImportHBase() {
config = HBaseConfiguration.create();
// config.set("hbase.master", "master:60000");
// config.set("hbase.zookeeper.quorum", "master");
try {
conn = ConnectionFactory.createConnection(config);
admin = conn.getAdmin();
table = conn.getTable(TableName.valueOf("user_action"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
if (args.length == 0) { //第一个参数是该jar所使用的类,第二个参数是数据集所存放的路径
throw new Exception("You must set input path!");
}
String fileName = args[args.length-1]; //输入的文件路径是最后一个参数
ImportHBase test = new ImportHBase();
test.importLocalFileToHBase(fileName);
}
public void importLocalFileToHBase(String fileName) {
long st = System.currentTimeMillis();
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(
fileName)));
String line = null;
int count = 0;
while ((line = br.readLine()) != null) {
count++;
put(line);
if (count % 10000 == 0)
System.out.println(count);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
table.close(); // must close the client
} catch (IOException e) {
e.printStackTrace();
}
}
long en2 = System.currentTimeMillis();
System.out.println("Total Time: " + (en2 - st) + " ms");
}
@SuppressWarnings("deprecation")
public void put(String line) throws IOException {
String[] arr = line.split("\t", -1);
String[] column = {"id","uid","item_id","behavior_type","item_category","date","province"};
if (arr.length == 7) {
Put put = new Put(Bytes.toBytes(arr[0]));// rowkey
for(int i=1;i<arr.length;i++){
put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes(column[i]),Bytes.toBytes(arr[i]));
}
table.put(put); // put to server
}
}
public void get(String rowkey, String columnFamily, String column,
int versions) throws IOException {
long st = System.currentTimeMillis();
Get get = new Get(Bytes.toBytes(rowkey));
get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column));
Scan scanner = new Scan(get);
scanner.readVersions(versions);
ResultScanner rsScanner = table.getScanner(scanner);
for (Result result : rsScanner) {
final List<Cell> list = result.listCells();
for (final Cell kv : list) {
System.out.println(Bytes.toStringBinary(kv.getValueArray()) + "\t"
+ kv.getTimestamp()); // mid + time
}
}
rsScanner.close();
long en2 = System.currentTimeMillis();
System.out.println("Total Time: " + (en2 - st) + " ms");
}
}
然后进行数据导入,导入之前先进行数据的清理。
不过试了一下,书本上的方法无法使用程序进行导入,这里还是使用sqoop进行导入。
这里报错说明没有输入的路径,检查重启之后发现问题解决,但是还是出现下面错误:
这里说什么这个输出路径文件已经存在,不知道这是报什么错。于是在网上查资料
在HDFS上进行修改之后,重新启动HBase和Hadoop之后,运行查看之后发现正常。
之后就可以等待一会。
等到传输成功之后,打开hbase输入查找命令,就可以得到前面10行的数据
(六)使用R进行数据可视化分析。
首先安装R:
进入后增加对应的网址节点:
之后更新api文件:
输入密匙进行安装:
安装好之后可以使用R来启动r语言:
之后安装一些依赖库,这里安装RMySQL:
弹出窗口之后选择beijing作为下载节点。
但是出现了一些报错,
这是少了一些软件包的缘故,这个时候需要对应下载软件包:
之后再次进行R语言状态:
安装成功:
之后再下载一些软件包:
安装ggplot2的时候报错。查找网上方法不行,这个时候只能重新升级R语言。
这里将R语言升级到3.4.4之后就可以成功安装了。
参考http://dblab.xmu.edu.cn/blog/1130-2/
但是后面安装又出现了问题,这个时候只能再次升级到3.6.3继续实验
发现后面的安装包都安装成功。如果没有安装成功,建议使用sudo apt-get autoremove r-base-core 将R语言删除,然后重装再次安装。
之后进行可视化分析:
首先连接MySQL数据库获取数据:
展开数据:
然后使用R连接MySQL数据库:
连接完成之后开始分析商品对消费者的行为:
计算数据库中的类型信息:
但是这不好进行比较,于是需要进行类型转换:
然后使用柱状图显示信息。
之后分析排名前十的商品和他的销量:
首先读取信息,之后进行数据的排序,然后进行输出:
然后分析那个月的销量是最大的:
同样也是获取数据之后进行排序然后才输出最终结果
之后是分析国内那个省份的消费欲望最强:
同样是之前的思路先进行统计,然后排序,给消费欲望最强的几个地方途深色
之后会打开浏览器输出图像:
4.思考题
(一)HBase,Mysql,Hive这些数据库的各自特点是什么?
Hive:
Hive是用于行存储。Hive本身不存储和计算数据,它完全依赖于HDFS,MapReduce,Hive中的表纯逻辑. 通过数据库的方式来操作HDFS文件系统,为了简化编程,底层计算方式为mapreduce。
Hive是建立在Hadoop之上,Hadoop可以为MySQL处理多个数据。
Hive中没有定义专门的数据格式,数据格式可以游用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、“\t”、“\x001”)、行分隔符(“\n”)以及读取文件数据的方法(Hive中默认有三个文件格式TextFile,S额群策File以及RCFile)。由于在加载数据的过程中,不需要从用户数据格式到Hive定义的数据格式的转换,因此,Hive在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的HDFS目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
MySQL:
这个数据库属于关系型数据库,对于其中有表结构,表结构的数据量不大。
性能卓越服务稳定,很少出现异常宕机。开放源代码且无版权制约,自主性强、使用成本低。
历史悠久、社区及用户非常活跃,遇到问题,可以很快获取到帮助。软件体积小,安装使用简单,并且易于维护,安装及维护成本低。支持多种操作系统,提供多api几口,支持多种开发语言。
HBase:
HBase一个分布式的基于列式存储的数据库,基于 Hadoop 的 hdfs 存储, zookeeper 进行管理。
Hbase 适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的数据。
Hbase 为 null 的记录不会被存储。
基于的表包含 rowkey,时间戳,和列族。新写入数据时,时间戳更新,同时可以查询到以前的版本。
hbase 是主从架构。hmaster 作为主节点,hregionserver 作为从节点。
5. 实验结论或体会
1.当使用时报错的时候,如果在网上没有找到解决办法,就进行卸载重装,然后升级版本看看能不能运行。
2.在最后使用R语言进行数据分析的时候,如果R语言没有成功安装软件包,建议卸载之后升级两次到3.6.3版本之后再次安装。
3.前面时候HBase进行数据导入的时候,会出现HBase无法使用的情况,这个时候建议卸载重装。
4.将Hive中的数据导入到MySQL数据库的时候,建议使用sqoop软件,使用书上的端口号进行导入的时候会报错,而且数据经常丢失。文章来源:https://www.toymoban.com/news/detail-498135.html
5.关于HBase经常启动几秒钟之后HMaster就自动消失的情况,建议查看是否软件包的导入路径发生了错误,之后实在不行就重新卸载安装。文章来源地址https://www.toymoban.com/news/detail-498135.html
到了这里,关于云计算技术 综合实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!