分布式数据库HBase安装配置与实践.docx
《分布式数据库HBase安装配置与实践.docx》由会员分享,可在线阅读,更多相关《分布式数据库HBase安装配置与实践.docx(27页珍藏版)》请在冰豆网上搜索。
![分布式数据库HBase安装配置与实践.docx](https://file1.bdocx.com/fileroot1/2023-4/21/bbb8ca95-db37-4bb5-a242-f73cd831c5c4/bbb8ca95-db37-4bb5-a242-f73cd831c5c41.gif)
分布式数据库HBase安装配置与实践
实验指导书
分布式数据库HBase安装配置与实践
1.1实验目的
HBase安装配置与实践
1.2实验环境
本教程运行环境是CentOS64位系统下,HBase版本为hbase-1.0.1.1-bin.tar.gz,这是目前已经发行的已经编译好的稳定的版本,带有src的文件是未编译的版本。
下载地址http:
//www.apache.org/dyn/closer.cgi/hbase/
1.3实验步骤
1.3.1安装并配置HBase
1.HBase安装
1.1解压安装包hbase-1.0.1.1-bin.tar.gz至路径/usr/local,命令如下:
cd/usr/local
sudotar-zxvfhbase-1.0.1.1-bin.tar.gz
1.2将解压的文件名hbase-1.0.1.1改为hbase,以方便使用,命令如下:
sudomvhbase-1.0.1.1hbase
1.3配置环境变量
将hbase下的bin目录添加到path中,这样,启动hbase就无需到/usr/local/hbase目录下,大大的方便了hbase的使用。
教程下面的部分还是切换到了/usr/local/hbase目录操作,有助于初学者理解运行过程,熟练之后可以不必切换。
编辑~/.bashrc文件
vi~/.bashrc
如果没有引入过PATH请在~/.bashrc文件尾行添加如下内容:
exportPATH=$PATH:
/usr/local/hbase/bin
如图1:
图1
编辑完成后,再执行source命令使上述配置在当前终端立即生效,命令如下:
source~/.bashrc
扩展阅读:
设置Linux环境变量的方法和区别(下附)
1.4添加HBase权限
sudochown-Rhadoop:
hadoop./hbase#将hbase下的所有文件的所有者以及用户组改为hadoop,hadoop是当前用户的用户名。
1.5查看HBase版本,确定hbase安装成功,命令如下:
hbaseversion
命令执行后,输出信息截图如图2:
图2
看到以上输出消息表示HBase已经安装成功,接下来将分别进行HBase单机模式和伪分布式模式的配置。
2.HBase配置
HBase有三种运行模式,单机模式、伪分布式模式、分布式模式。
作为学习,我们重点讨论单机模式和伪分布式模式。
以下先决条件很重要,比如没有配置JAVA_HOME环境变量,就会报错。
-jdk
-Hadoop(单机模式不需要,伪分布式模式和分布式模式需要)
-SSH
以上三者如果没有安装,请回到第二章的实验指导参考如何安装。
2.1伪分布式模式配置
1.配置/usr/local/hbase/conf/hbase-env.sh。
命令如下:
vi/usr/local/hbase/conf/hbase-env.sh
配置JAVA_HOME,HBASE_CLASSPATH,HBASE_MANAGES_ZK.
HBASE_CLASSPATH设置为本机Hadoop安装目录下的conf目录(即/usr/local/hadoop/conf)
exportJAVA_HOME=/usr/lib/jvm/java-1.7.0_67
exportHBASE_CLASSPATH=/usr/local/hadoop/conf
exportHBASE_MANAGES_ZK=true
截图如图5:
图5
2.配置/usr/local/hbase/conf/hbase-site.xml
用命令vi打开并编辑hbase-site.xml,命令如下:
vi/usr/local/hbase/conf/hbase-site.xml
修改hbase.rootdir,指定HBase数据在HDFS上的存储路径;将属性hbase.cluter.distributed设置为true。
假设当前Hadoop集群运行在伪分布式模式下,在本机上运行,且NameNode运行在9000端口。
hbase.rootdir
hdfs:
//etc03:
9000/hbase
hbase.cluster.distributed
true
hbase.zookeeper.quorum
127.0.0.1
hbase.rootdir指定HBase的存储目录;hbase.cluster.distributed设置集群处于分布式模式.
截图如图6:
图6
3.接下来测试运行HBase。
第一步:
首先登陆ssh,之前设置了无密码登陆,因此这里不需要密码;再切换目录至/usr/local/hadoop;再启动hadoop,如果已经启动hadoop请跳过此步骤。
命令如下:
cd/usr/local/hadoop
./sbin/start-all.sh
输入命令jps,能看到NameNode,DataNode和SecondaryNameNode都已经成功启动,表示hadoop启动成功,截图如图7:
图7
第二步:
切换目录至/usr/local/hbase;再启动HBase.命令如下:
cd/usr/local/hbase
bin/start-hbase.sh
启动成功,输入命令jps,看到图8界面说明hbase启动成功
图8
进入shell界面:
bin/hbaseshell
截图如图9:
图9
4.停止HBase运行,命令如下:
bin/stop-hbase.sh
注意:
如果在操作HBase的过程中发生错误,可以通过{HBASE_HOME}目录(/usr/local/hbase)下的logs子目录中的日志文件查看错误原因。
这里启动关闭Hadoop和HBase的顺序一定是:
启动Hadoop—>启动HBase—>关闭HBase—>关闭Hadoop
1.3.2编程实践
1.利用Shell命令
1.1HBase中创建表
HBase中用create命令创建表,具体如下:
create'student','Sname','Ssex','Sage','Sdept','course'
命令执行截图如图10:
图10
此时,即创建了一个“student”表,属性有:
Sname,Ssex,Sage,Sdept,course。
因为HBase的表中会有一个系统默认的属性作为行键,无需自行创建,默认为put命令操作中表名后第一个数据。
创建完“student”表后,可通过describe命令查看“student”表的基本信息。
命令执行截图如图11:
图11
1.2HBase数据库基本操作
本小节主要介绍HBase的增、删、改、查操作。
在添加数据时,HBase会自动为添加的数据添加一个时间戳,故在需要修改数据时,只需直接添加数据,HBase即会生成一个新的版本,从而完成“改”操作,旧的版本依旧保留,系统会定时回收垃圾数据,只留下最新的几个版本,保存的版本数可以在创建表的时候指定。
添加数据
HBase中用put命令添加数据,注意:
一次只能为一个表的一行数据的一个列,也就是一个单元格添加一个数据,所以直接用shell命令插入数据效率很低,在实际应用中,一般都是利用编程操作数据。
当运行命令:
put‘student’,’95001’,’Sname’,’LiYing’时,即为student表添加了学号为95001,名字为LiYing的一行数据,其行键为95001。
put'student','95001','Sname','LiYing'
命令执行截图如图12,即为student表添加了学号为95001,名字为LiYing的一行数据,其行键为95001。
图12
put'student','95001','course:
math','80'
命令执行截图如图13,即为95001行下的course列族的math列添加了一个数据。
图13
删除数据
在HBase中用delete以及deleteall命令进行删除数据操作,它们的区别是:
1.delete用于删除一个数据,是put的反向操作;2.deleteall操作用于删除一行数据。
1.delete命令
delete'student','95001','Ssex'
命令执行截图如图14,即删除了student表中95001行下的Ssex列的所有数据。
图14
2.deleteall命令
deleteall'student','95001'
命令执行截图如图15,即删除了student表中的95001行的全部数据。
图15
查看数据
HBase中有两个用于查看数据的命令:
1.get命令,用于查看表的某一个单元格数据;2.scan命令用于查看某个表的全部数据
1.get命令
get'student','95001'
命令执行截图如图16,返回的是‘student’表‘95001’行的数据。
图16
2.scan命令
scan'student'
命令执行截图如图17,返回的是‘student’表的全部数据。
图17
删除表
删除表有两步,第一步先让该表不可用,第二步删除表。
disable'student'
drop'student'
命令执行截图如图18:
图18
1.3查询表历史数据
查询表的历史版本,需要两步。
1、在创建表的时候,指定保存的版本数(假设指定为5)
create'teacher',{NAME=>'username',VERSIONS=>5}
2、插入数据然后更新数据,使其产生历史版本数据,注意:
这里插入数据和更新数据都是用put命令
put'teacher','91001','username','Mary'
put'teacher','91001','username','Mary1'
put'teacher','91001','username','Mary2'
put'teacher','91001','username','Mary3'
put'teacher','91001','username','Mary4'
put'teacher','91001','username','Mary5'
3、查询时,指定查询的历史版本数。
默认会查询出最新的数据。
(有效取值为1到5)
get'teacher','91001',{COLUMN=>'username',VERSIONS=>5}
查询结果截图如图19:
图19
1.4退出HBase数据库表操作
最后退出数据库操作,输入exit命令即可退出,注意:
这里退出HBase数据库是退出对数据库表的操作,而不是停止启动HBase数据库后台运行。
exit
2.JavaAPI编程实例
本实例使用Eclipse编写java程序,来对HBase数据库进行增删改查等操作,Eclipse可以在Ubuntu软件中心搜索下载并安装。
第一步:
启动hadoop,启动hbase
cd/usr/local/hadoop
./sbin/start-dfs.sh
cd/usr/local/hbase
./bin/start-hbase.sh
第二步,新建JavaProject——>新建Class(图20,图21)
图20
图21
第三步:
在工程中导入外部jar包:
这里只需要导入hbase安装目录中的lib文件中的所有jar包。
新版的Hbase1.1.2的javaapi已经发生变化,旧版的部分api已经停止使用,教材上第四章编程实例部分,请以本教程为准(图22)。
图22
这里给出一个编程实例,,以下是源代码:
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.hbase.*;
importorg.apache.hadoop.hbase.client.*;
importjava.io.IOException;
publicclassExampleForHbase{
publicstaticConfigurationconfiguration;
publicstaticConnectionconnection;
publicstaticAdminadmin;
//主函数中的语句请逐句执行,只需删除其前的//即可,如:
执行insertRow时请将其他语句注释
publicstaticvoidmain(String[]args)throwsIOException{
//创建一个表,表名为Score,列族为sname,course
createTable("Score",newString[]{"sname","course"});
//在Score表中插入一条数据,其行键为95001,sname为Mary(因为sname列族下没有子列所以第四个参数为空)
//等价命令:
put'Score','95001','sname','Mary'
//insertRow("Score","95001","sname","","Mary");
//在Score表中插入一条数据,其行键为95001,course:
Math为88(course为列族,Math为course下的子列)
//等价命令:
put'Score','95001','score:
Math','88'
//insertRow("Score","95001","course","Math","88");
//在Score表中插入一条数据,其行键为95001,course:
English为85(course为列族,English为course下的子列)
//等价命令:
put'Score','95001','score:
English','85'
//insertRow("Score","95001","course","English","85");
//1、删除Score表中指定列数据,其行键为95001,列族为course,列为Math
//执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码取消注释注释,将删除制定列族的代码注释
//等价命令:
delete'Score','95001','score:
Math'
//deleteRow("Score","95001","course","Math");
//2、删除Score表中指定列族数据,其行键为95001,列族为course(95001的Math和English的值都会被删除)
//执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,将删除制定列族的代码取消注释
//等价命令:
delete'Score','95001','score'
//deleteRow("Score","95001","course","");
//3、删除Score表中指定行数据,其行键为95001
//执行这句代码前请deleteRow方法的定义中,将删除指定列数据的代码注释,以及将删除制定列族的代码注释
//等价命令:
deleteall'Score','95001'
//deleteRow("Score","95001","","");
//查询Score表中,行键为95001,列族为course,列为Math的值
//getData("Score","95001","course","Math");
//查询Score表中,行键为95001,列族为sname的值(因为sname列族下没有子列所以第四个参数为空)
//getData("Score","95001","sname","");
//删除Score表
//deleteTable("Score");
}
//建立连接
publicstaticvoidinit(){
configuration=HBaseConfiguration.create();
configuration.set("hbase.rootdir","hdfs:
//localhost:
9000/hbase");
try{
connection=ConnectionFactory.createConnection(configuration);
admin=connection.getAdmin();
}catch(IOExceptione){
e.printStackTrace();
}
}
//关闭连接
publicstaticvoidclose(){
try{
if(admin!
=null){
admin.close();
}
if(null!
=connection){
connection.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
/**
*建表。
HBase的表中会有一个系统默认的属性作为主键,主键无需自行创建,默认为put命令操作中表名后第一个数据,因此此处无需创建id列
*@parammyTableName表名
*@paramcolFamily列族名
*@throwsIOException
*/
publicstaticvoidcreateTable(StringmyTableName,String[]colFamily)throwsIOException{
init();
TableNametableName=TableName.valueOf(myTableName);
if(admin.tableExists(tableName)){
System.out.println("talbeisexists!
");
}else{
HTableDescriptorhTableDescriptor=newHTableDescriptor(tableName);
for(Stringstr:
colFamily){
HColumnDescriptorhColumnDescriptor=newHColumnDescriptor(str);
hTableDescriptor.addFamily(hColumnDescriptor);
}
admin.createTable(hTableDescriptor);
System.out.println("createtablesuccess");
}
close();
}
/**
*删除指定表
*@paramtableName表名
*@throwsIOException
*/
publicstaticvoiddeleteTable(StringtableName)throwsIOException{
init();
TableNametn=TableName.valueOf(tableName);
if(admin.tableExists(tn)){
admin.disableTable(tn);
admin.deleteTable(tn);
}
close();
}
/**
*查看已有表
*@throwsIOException
*/
publicstaticvoidlistTables()throwsIOException{
init();
HTableDescriptorhTableDescriptors[]=admin.listTables();
for(HTableDescriptorhTableDescriptor:
hTableDescriptors){
System.out.println(hTableDescriptor.getNameAsString());
}
close();
}
/**
*向某一行的某一列插入数据
*@paramtableName表名
*@paramrowKey行键
*@paramcolFamily列族名
*@paramcol列名(如果其列族下没有子列,此参数可为空)
*@paramval值
*@throwsIOException
*/
publicstaticvoidinsertRow(StringtableName,StringrowKey,StringcolFamily,Stringcol,Stringval)throwsIOException{
init();
Tabletable=connection.getTable(TableName.valueOf(tableName));
Putput=newPut(rowKey.getBytes());
put.addColumn(colFamily.getBytes(),col.getBytes(),val.getBytes());
table.put(put);
table.close();
close();
}
/**
*删除数据
*@paramtableName表名
*@paramrowKey行键
*@paramcolFamily列族名
*@paramcol列名
*@throwsIOException
*/
publicstaticvoiddeleteRow(StringtableName,StringrowKey,StringcolFamily,Stringcol)throwsIOException{
init();
Tabletable=connection.getTable(TableName.valueOf(tableName));
Deletedelete=newDelete(rowKey.getBytes());
//删除指定列族的所有数据
//delete.addFamily(colFamily.getByte