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

hdfs://etc03:9000/hbase

buted

true

127.0.0.1

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 设置的变量在新终端中使无法读取到的。适合设置一些临时变量。


本文标签: 数据 命令 设置 文件