实验4:HBase和Hive的安装与使用
151220129 计科 吴政亿 nju_wzy@163.com
151220130 计科 伍昱名 707512433@qq.com
151220135 计科 许丽军 xulj.cs@gmail.com
151220142 计科 杨楠 1158864287@qq.com
1 实验目的
HBase作为面向列的数据库运行在HDFS之上,HDFS缺乏随即读写操作,HBase正是为此而出现。HBase以Google BigTable为蓝本,以键值对的形式存储。项目的目标就是快速在主机内数十亿行数据中定位所需的数据并访问它。
HBase是一个数据库,一个NoSql的数据库,像其他数据库一样提供随即读写功能,Hadoop不能满足实时需要,HBase正可以满足。如果你需要实时访问一些数据,就把它存入HBase。
HBase是一个管理系统,数据依然是存在HDFS中,但是HBase管理的数据具有自己的组织结构,能够满足我们快速查询某一些数据的特点,而HDFS做不到。
Hive是一个构建在Hadoop基础设施之上的数据仓库。通过Hive可以使用HQL语言查询存放在HDFS上的数据。HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,但是Hive不能够进行交互查询–因为它只能够在Haoop上批量的执行Hadoop。
2 实验环境
- Java 1.8
- Hadoop 2.7.1
- HBase 2.0.0
- Hive 2.1.1
3 实验要求
1.在自己本地电脑上正确安装和运行HBase和Hive。
2.在HBase中创建一张表Wuxia,用于保存下一步的输出结果。
3.修改第3次实验的MapReduce程序,在Reduce阶段将倒排索引的信息通过文件输出,而每个词语及其对应的“平均出现次数”信息写入到HBase的表“Wuxia”中。
4.编写Java程序,遍历上一步中保存在HBase中的表,并把表格的内容(词语以及平均出现次数)保存到本地文件中。
5.Hive安装完成后,在Hive Shell命令行操作创建表(表名:Wuxia(word STRING, count DOUBLE))、导入平均出现次数的数据、查询(出现次数大于300的词语)和前100个出现次数最多的词。
4 实验结果
4.1 HBase执行version
4.2 HBase表Wuxia
4.3 本地文件
4.4 Hive表Wuxia
执行
create table wuxia(word string,count double) row format delimited fields terminated by ',' stored as textfile;
load data local inpath "result.txt" into table wuxia;
4.5 查询出现次数大于300的词语
执行select * from wuxia where count>300;
4.6 前100个出现次数最多的词
执行select * from wuxia order by count desc limit 100;
5 代码详解
5.1 修改Mapreduce将数据保存在HBase中
// 将词语和词频存入HBase中
put.addColumn(Bytes.toBytes("count"),null,Bytes.toBytes(Float.toString(average)));
context.write(NullWritable.get(),put);
put=new Put(Bytes.toBytes(Integer.toString(no)));
put.addColumn(Bytes.toBytes("word"),null,Bytes.toBytes(prevWord));
context.write(NullWritable.get(),put);
5.2 将HBase中数据保存到本地文件中
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import java.io.*;
class HBaseOpe {
public static Configuration configuration;
public static Connection connection;
public static TableName tablename;
public static Table table;
//初始化静态变量
static {
configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.property.clientPort", "2181");
configuration.set("hbase.zookeeper.quorum", "localhost");
configuration.set("hbase.master", "localhost");
//初始化表名为'Wuxia'
tablename = TableName.valueOf("Wuxia");
//建立连接,得到表table
try {
connection = ConnectionFactory.createConnection(configuration);
table = connection.getTable(tablename);
} catch (IOException e) {
e.printStackTrace();
}
}
//遍历Wuxia表并保存到本地文件中
public static void getData() throws IOException {
Table table = connection.getTable(tablename);
ResultScanner rs = table.getScanner(new Scan());
File file = new File("Wuxia_out.txt");
if(!file.exists())
file.createNewFile();
FileWriter fileWriter = new FileWriter(file, false);
for (Result r : rs) {
String word=new String(CellUtil.cloneValue(r.rawCells()[1]));
String count=new String(CellUtil.cloneValue(r.rawCells()[0]));
fileWriter.write(word+","+count+"\n");
}
fileWriter.flush();
fileWriter.close();
}
}
// main函数调用
public class getDataFromTable {
public static void main(String[] args) {
try {
HBaseOpe.getData();
} catch (Exception e) {
e.printStackTrace();
}
}
}
6 实验体会
本次实验由各自独自完成,期间环境出现了许多错误,大家互相交流解决问题,最后汇总的实验。
本次实验在上次实验基础上进行了HBase和Hive的配置,在实际使用过程中,我认识到了HBase和Hive的区别。
Hive帮助熟悉SQL的人运行MapReduce任务。因为它是JDBC兼容的,同时,它也能够和现存的SQL工具整合在一起。运行Hive查询会花费很长时间,因为它会默认遍历表中所有的数据。虽然有这样的缺点,一次遍历的数据量可以通过Hive的分区机制来控制。分区允许在数据集上运行过滤查询,这些数据集存储在不同的文件夹内,查询的时候只遍历指定文件夹(分区)中的数据。这种机制可以用来,例如,只处理在某一个时间范围内的文件,只要这些文件名中包括了时间格式。
HBase通过存储key/value来工作。它支持四种主要的操作:增加或者更新行,查看一个范围内的cell,获取指定的行,删除指定的行、列或者是列的版本。版本信息用来获取历史数据(每一行的历史数据可以被删除,然后通过Hbase compactions就可以释放出空间)。虽然HBase包括表格,但是schema仅仅被表格和列簇所要求,列不需要schema。Hbase的表格包括增加/计数功能。
Hive和Hbase是两种基于Hadoop的不同技术–Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库。当然,这两种工具是可以同时使用的。Hive可以用来进行统计查询,HBase可以用来进行实时查询,数据也可以从Hive写到Hbase,设置再从Hbase写回Hive。
另外,我们在实验中还遇到的许多问题,其中,我们遇到的最大的困难就是mapreduce的数据量过大,对系统的负担过重。下面枚举了部分我们遇到的问题与解决方案:
- 启动hbase shell错误 :
解决方法:在hbase-site.xml中配置zookeeper,最终可以在jps看到HQuorumpeer;或者采用单机模式 - 进入hbase shell后无法获取数据 :
解决方法:使core-site.xml文件下的配置路径与hbase-site.xml中对应 l - 数据库未初始化:
解决方法:schematool -dbType derby -initSchema - 启动hive失败:
解决方法:开启hadoop,再执行hive –service cli
7 引用: