admin 管理员组文章数量: 1086019
2024年3月5日发(作者:sparknotes)
实验指导书
分布式数据库HBase安装配置与实践
1.1实验目的
HBase安装配置与实践
1.2实验环境
本教程运行环境是Cent OS 64位系统下,HBase版本为,这是目前已经发行的已经编译好的稳定的版本,带有src的文件是未编译的版本。下载地址/dyn//hbase/
1.3实验步骤
1.3.1安装并配置HBase
1. HBase安装
1.1 解压安装包至路径 /usr/local,命令如下:
cd /usr/local
sudo tar -zxvf
1.2 将解压的文件名hbase-1.0.1.1改为hbase,以方便使用,命令如下:
sudo mv hbase-1.0.1.1 hbase
1.3 配置环境变量
将hbase下的bin目录添加到path中,这样,启动hbase就无需到/usr/local/hbase目录下,大大的方便了hbase的使用。教 程下面的部分还是切换到了/usr/local/hbase目录操作,有助于初学者理解运行过程,熟练之后可以不必切换。
编辑~/.bashrc文件
vi ~/.bashrc
如果没有引入过PATH请在~/.bashrc文件尾行添加如下内容:
export PATH=$PATH:/usr/local/hbase/bin
如图1:
图 1
编辑完成后,再执行source命令使上述配置在当前终端立即生效,命令如下:
source ~/.bashrc
扩展阅读: 设置Linux环境变量的方法和区别(下附)
1.4 添加HBase权限
sudo chown -R hadoop:hadoop ./hbase #将hbase下的所有文件的所有者以及用户组改为hadoop,hadoop是当前用户的用户名。
1.5 查看HBase版本,确定hbase安装成功,命令如下:
hbase version
命令执行后,输出信息截图如图2:
图 2
看到以上输出消息表示HBase已经安装成功,接下来将分别进行HBase单机模式和伪分布式模式的配置。
2. HBase配置
HBase有三种运行模式,单机模式、伪分布式模式、分布式模式。作为学习,我们重点讨论单机模式和伪分布式模式。
以下先决条件很重要,比如没有配置JAVA_HOME环境变量,就会报错。
- jdk
- Hadoop( 单机模式不需要,伪分布式模式和分布式模式需要)
- SSH
以上三者如果没有安装,请回到第二章的实验指导参考如何安装。
2.1伪分布式模式配置
1.配置/usr/local/hbase/conf/。命令如下:
vi /usr/local/hbase/conf/
配置JAVA_HOME,HBASE_CLASSPATH,HBASE_MANAGES_ZK.
HBASE_CLASSPATH设置为本机Hadoop安装目录下的conf目录(即/usr/local/hadoop/conf)
export JAVA_HOME=/usr/lib/jvm/java-1.7.0_67
export HBASE_CLASSPATH=/usr/local/hadoop/conf
export HBASE_MANAGES_ZK=true
截图如图5:
图 5
2.配置/usr/local/hbase/conf/
用命令vi打开并编辑,命令如下:
vi /usr/local/hbase/conf/
修改r,指定HBase数据在HDFS上的存储路径;将属性buted设置为true。假设当前Hadoop集群运行在伪分布式模式下,在本机上运行,且NameNode运行在9000端口。
r指定HBase的存储目录;buted设置集群处于分布式模式.
截图如图6:
图 6
3. 接下来测试运行HBase。
第一步:首先登陆ssh,之前设置了无密码登陆,因此这里不需要密码;再切换目录至/usr/local/hadoop ;再启动hadoop,如果已经启动hadoop请跳过此步骤。命令如下:
cd /usr/local/hadoop
./sbin/
输入命令jps,能看到NameNode,DataNode和SecondaryNameNode都已经成功启动,表示hadoop启动成功,截图如图7:
图 7
第二步:切换目录至/usr/local/hbase;再启动HBase.命令如下:
cd /usr/local/hbase
bin/
启动成功,输入命令jps,看到图8界面说明hbase启动成功
图 8
进入shell界面:
bin/hbase shell
截图如图9:
图 9
4.停止HBase运行,命令如下:
bin/
注意:如果在操作HBase的过程中发生错误,可以通过{HBASE_HOME}目录(/usr/local/hbase)下的logs子目录中的日志文件查看错误原因。
这里启动关闭Hadoop和HBase的顺序一定是:
启动Hadoop—>启动HBase—>关闭HBase—>关闭Hadoop
1.3.2编程实践
1. 利用Shell命令
1.1 HBase中创建表
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.2 HBase数据库基本操作
本小节主要介绍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. Java API编程实例
本实例使用Eclipse编写java程序,来对HBase数据库进行增删改查等操作,Eclipse可以在Ubuntu软件中心搜索下载并安装。
第一步:启动hadoop,启动hbase
cd /usr/local/hadoop
./sbin/
cd /usr/local/hbase
./bin/
第二步,新建Java Project——>新建Class(图20,图21)
图 20
图 21
第三步:在工程中导入外部jar包:
这里只需要导入hbase安装目录中的lib文件中的所有jar包。
新版的Hbase 1.1.2的java api已经发生变化,旧版的部分api已经停止使用,教材上第四章编程实例部分,请以本教程为准(图22)。
图 22
这里给出一个编程实例,,以下是源代码:
import uration;
import .*;
import .*;
import ption;
public class ExampleForHbase{
public static Configuration configuration;
public static Connection connection;
public static Admin admin;
//主函数中的语句请逐句执行,只需删除其前的//即可,如:执行insertRow时请将其他语句注释
public static void main(String[] args)throws IOException{
//创建一个表,表名为Score,列族为sname,course
createTable("Score",new String[]{"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");
}
//建立连接
public static void init(){
configuration = ();
("r","hdfs://localhost:9000/hbase");
try{
connection = Connection(configuration);
admin = in();
}catch (IOException e){
tackTrace();
}
}
//关闭连接
public static void close(){
try{
if(admin != null){
();
}
if(null != connection){
();
}
}catch (IOException e){
tackTrace();
}
}
/**
* 建表。HBase的表中会有一个系统默认的属性作为主键,主键无需自行创建,默认为put命令操作中表名后第一个数据,因此此处无需创建id列
* @param myTableName 表名
* @param colFamily 列族名
* @throws IOException
*/
public static void createTable(String myTableName,String[] colFamily) throws
IOException {
init();
TableName tableName = f(myTableName);
if(xists(tableName)){
n("talbe is exists!");
}else {
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
for(String str:colFamily){
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(str);
ily(hColumnDescriptor);
}
Table(hTableDescriptor);
n("create table success");
}
close();
}
/**
* 删除指定表
* @param tableName 表名
* @throws IOException
*/
public static void deleteTable(String tableName) throws IOException {
init();
TableName tn = f(tableName);
if (xists(tn)) {
eTable(tn);
Table(tn);
}
close();
}
/**
* 查看已有表
* @throws IOException
*/
public static void listTables() throws IOException {
init();
HTableDescriptor hTableDescriptors[] = bles();
for(HTableDescriptor hTableDescriptor :hTableDescriptors){
n(eAsString());
}
close();
}
/**
* 向某一行的某一列插入数据
* @param tableName 表名
* @param rowKey 行键
* @param colFamily 列族名
* @param col 列名(如果其列族下没有子列,此参数可为空)
* @param val 值
* @throws IOException
*/
public static void insertRow(String tableName,String rowKey,String
colFamily,String col,String val) throws IOException {
init();
Table table = le(f(tableName));
Put put = new Put(es());
umn(es(), es(), es());
(put);
();
close();
}
/**
* 删除数据
* @param tableName 表名
* @param rowKey 行键
* @param colFamily 列族名
* @param col 列名
* @throws IOException
*/
public static void deleteRow(String tableName,String rowKey,String
colFamily,String col) throws IOException {
init();
Table table = le(f(tableName));
Delete delete = new Delete(es());
//删除指定列族的所有数据
//ily(es());
//删除指定列的数据
//umn(es(), es());
(delete);
();
close();
}
/**
* 根据行键rowkey查找数据
* @param tableName 表名
* @param rowKey 行键
* @param colFamily 列族名
* @param col 列名
* @throws IOException
*/
public static void getData(String tableName,String rowKey,String
colFamily,String col)throws IOException{
init();
Table table = le(f(tableName));
Get get = new Get(es());
umn(es(),es());
Result result = (get);
showCell(result);
();
close();
}
/**
* 格式化输出
* @param result
*/
public static void showCell(Result result){
Cell[] cells = ls();
for(Cell cell:cells){
n("RowName:"+new String(ow(cell))+"
");
n("Timetamp:"+estamp()+" ");
n("column Family:"+new
String(amily(cell))+" ");
n("row Name:"+new
String(ualifier(cell))+" ");
n("value:"+new String(alue(cell))+"
");
}
}
}
代码如果直接从桌面的中直接复制,则多处需要删除空格,如图23
图 23
运行代码,出现图24的情况表示运行成功
图 24
可以回到shell界面查看是否执行成功,在shell界面中执行scan 'Score'。截图如图25:
图 25
还可以运用代码中注释掉的部分来进行行与列的插入,将注释去掉进行执行,图26
图 26
附:设置Linux环境变量的方法和区别
设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别。
通过文件设置 Linux 环境变量
首先是设置全局环境变量,对所有用户都会生效:
etc/profile: 此文件为系统的每个用户设置环境信息。当用户登录时,该文件被执行一次,并从 /etc/profile.d 目录的配置文件中搜集shell 的设置。一般用于设置所有用户使用的全局变量。
/etc/bashrc: 当 bash shell 被打开时,该文件被读取。也就是说,每次新打开一个终端
shell,该文件就会被读取。
接着是与上述两个文件对应,但只对单个用户生效:
~/.bash_profile 或 ~/.profile: 只对单个用户生效,当用户登录时该文件仅执行一次。用户可使用该文件添加自己使用的 shell 变量信息。另外在不同的LINUX操作系统下,这个文件可能是不同的,可能是 ~/.bash_profile, ~/.bash_login 或 ~/.profile 其中的一种或几种,如果存在几种的话,那么执行的顺序便是:~/.bash_profile、 ~/.bash_login、 ~/.profile。比如 Ubuntu 系统一般是 ~/.profile 文件。
~/.bashrc: 只对单个用户生效,当登录以及每次打开新的 shell 时,该文件被读取。
此外,修改 /etc/environment 这个文件也能实现环境变量的设置。/etc/environment 设置的也是全局变量,从文件本身的作用上来说, /etc/environment 设置的是整个系统的环境,而/etc/profile是设置所有用户的环境。有几点需注意:
系统先读取 etc/profile 再读取 /etc/environment(还是反过来?)
/etc/environment 中不能包含命令,即直接通过 VAR="..." 的方式设置,不使用 export 。
使用 source /etc/environment 可以使变量设置在当前窗口立即生效,需注销/重启之后,才能对每个新终端窗口都生效。
修改 Linux 环境变量实例
以 Ubuntu 为例,修改 ~/.profile 文件:
vim ~/.profile
如果该文件存在,则在文件的最后看到如下代码,PATH 变量的值使用冒号(:)隔开的:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
在最后加上代码 PATH="$PATH:/usr/local/hadoop/bin",注意等号(=)两边不要有空格,即:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
PATH="$PATH:/usr/local/hadoop/bin"
因为这个文件是在用户登陆是才读取一次的,所以需要重启才会生效(修改 /etc/profile、/etc/environment 也是如此)。但可以使用命令 source ~/.profile 使其立即生效。通过 echo $PATH 可以看到修改后的变量值:
source ~/.profile
echo $PATH
通过 Shell 命令 export 修改 Linux 环境变量
另一种修改 Linux 环境变量的方式就是通过 Shell 命令 export,注意变量名不要有美元号 $,赋值语句中才需要有:
export PATH=$PATH:/usr/local/hadoop/bin
根据变量所需,选择设置方式,例如 JAVA_HOME 这类变量,就适合将其设为为全局变量,可在 /etc/environment 中设置。
P.S:
export 方式只对当前终端 Shell 有效
使用 export 设置的变量,只对当前终端 Shell 有效,也就是说如果新打开一个终端,那这个 export 设置的变量在新终端中使无法读取到的。适合设置一些临时变量。
版权声明:本文标题:分布式数据库HBase安装配置与实践 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1709646869a542602.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论