第5章 HBase的安装和基础编程
5.1 安装HBase
5.1.1 下载安装文件
访问HBase官网下载安装文件hbase-2.2.2-bin.tar.gz文件。
下载完安装文件以后,需要对文件进行解压。按照Linux系统使用的默认规范,用户安装的软件一般都是存放在"/usr/local/"目录下。请使用hadoop用户登录Linux系统,打开一个终端,执行如下命令:
bash
sudo tar -zxf ~/下载/hbase-2.2.2-bin.tar.gz -C /usr/local
将解压的文件名hbase-2.2.2改为hbase,以方便使用,命令如下:
bash
sudo mv /usr/local/hbase-2.2.2 /usr/local/hbase
5.1.2 配置环境变量
将HBase安装目录下的bin目录(即/usr/local/hbase/bin)添加到系统的PATH环境变量中,这样,每次启动HBase时就不需要到"/usr/local/hbase"目录下执行启动命令,方便HBase的使用。请使用vim编辑器打开"~/.bashrc"文件,命令如下:
bash
vim ~/.bashrc
打开.bashrc文件以后,可以看到,已经存在如下所示的PATH环境变量的配置信息,因为,之前在第3章安装配置Hadoop时,我们已经为Hadoop添加了PATH环境变量的配置信息:
bash
export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin
这里,需要把HBase的bin目录"/usr/local/hbase/bin"追加到PATH中。当要在PATH中继续加入新的路径时,只要用英文冒号":"隔开,把新的路径加到后面即可,追加后的结果如下:
bash
export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin: /usr/local/hbase/bin
添加后,执行如下命令使设置生效:
bash
source ~/.bashrc
5.1.3 添加用户权限
需要为当前登录Linux系统的hadoop用户添加访问HBase目录的权限,将HBase安装目录下的所有文件的所有者改为hadoop,命令如下:
bash
cd /usr/local
sudo chown -R hadoop ./hbase
5.1.4 查看HBase版本信息
可以通过如下命令查看HBase版本信息,以确认HBase已经安装成功:
bash
/usr/local/hbase/bin/hbase version
5.2 HBase的配置
5.2.1 单机模式配置
1. 配置hbase-env.sh文件
使用vim编辑器打开"/usr/local/hbase/conf/hbase-env.sh",命令如下:
bash
vim /usr/local/hbase/conf/hbase-env.sh
打开hbase-env.sh文件以后,需要在hbase-env.sh文件中配置JAVA_HOME、HBASE_CLASSPATH和HBASE_MANAGES_ZK。
其中,HBASE_CLASSPATH设置为本机Hadoop安装目录下的conf目录(即/usr/local/hadoop/conf)。
JAVA_HOME和HBASE_MANAGES_ZK的配置方法和上面单机模式的配置方法相同。修改后的hbase-env.sh文件应该包含如下三行信息:
bash
export JAVA_HOME=/usr/lib/jvm/ jdk1.8.0_162
export HBASE_CLASSPATH=/usr/local/hbase/conf
export HBASE_MANAGES_ZK=true
2. 配置hbase-site.xml文件
使用vim编辑器打开并编辑"/usr/local/hbase/conf/hbase-site.xml"文件,命令如下:
bash
vim /usr/local/hbase/conf/hbase-site.xml
XML
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
3. 启动运行HBase
首先登陆SSH,由于之前在"第3章 Hadoop的安装和使用"中已经设置了无密码登录,因此这里不需要密码。然后,切换至"/usr/local/hadoop",启动Hadoop,让HDFS进入运行状态,从而可以为HBase存储数据,具体命令如下:
bash
ssh localhost
cd /usr/local/hadoop
./sbin/start-dfs.sh
然后,启动HBase,命令如下:
bash
cd /usr/local/hbase
./bin/start-hbase.sh
输入命令jps,如果出现以下进程,则说明HBase启动成功:
- HMaster:HBase 的主节点进程,负责管理集群元数据和协调各种操作。
- HRegionServer:HBase 的区域服务器进程,负责存储和管理表数据。
- HQuorumPeer 或 ZooKeeper:HBase 使用 ZooKeeper 进行分布式协调,所以你会看到 ZooKeeper 的进程。
现在就可以进入HBase Shell命令行模式,命令如下:
bash
./bin/hbase shell
4. 停止运行HBase
最后,可以使用如下命令停止HBase运行:
bash
./bin/stop-hbase.sh
关闭HBase以后,如果不再使用Hadoop,就可以运行如下命令关闭Hadoop:
bash
cd /usr/local/hadoop
./sbin/stop-dfs.sh
在使用具体的Shell命令操作HBase数据之前,需要首先启动Hadoop,然后再启动HBase,并且启动HBase Shell,进入Shell命令提示符状态,具体命令如下:
bash
cd /usr/local/hadoop
./sbin/start-dfs.sh
cd /usr/local/hbase
./bin/start-hbase.sh
./bin/hbase shell
5.2.2 伪分布式配置
5.3 HBase常用Shell命令
5.3.1 在HBase中创建表
假设这里要创建一个表student,该表包含Sname、Ssex、Sage、Sdept、course等字段。需要注意的是,在关系型数据库(比如MySQL)中,需要首先创建数据库,然后再创建表,但是,在HBase数据库中,不需要创建数据库,只要直接创建表就可以。在HBase中创建student表的Shell命令如下:
bash
create 'student','Sname','Ssex','Sage','Sdept','course'
5.3.2 添加数据
可以用Shell命令手工插入数据,命令如下:
bash
put 'student','95001','Sname','LiYing'
下面继续添加4个单元格的数据,用来记录LiYing同学的相关信息,命令如下:
bash
put 'student','95001','Ssex','male'
put 'student','95001','Sage','22'
put 'student','95001','Sdept','CS'
put 'student','95001','course:math','80'
5.3.3 查看数据
HBase中有两个用于查看数据的命令:
get命令:用于查看表的某一个单元格数据;
scan命令:用于查看某个表的全部数据。
比如,可以使用如下命令返回student表中95001行的数据:
下面使用scan命令查询student表的全部数据:
5.3.4 删除数据
首先,使用delete命令删除student表中95001这行中的Ssex列的所有数据:
然后,使用deleteall命令删除student表中的95001行的全部数据,命令如下:
bash
deleteall 'student','95001'
5.3.5 删除表
删除表需要分两步操作,第一步先让该表不可用,第二步删除表。比如,要删除student表,可以使用如下命令:
bash
disable 'student'
drop 'student'
5.3.6 查询历史数据
为了查询历史数据,这里创建一个teacher表,首先,在创建表的时候,需要指定保存的版本数(假设指定为5),命令如下:
bash
create 'teacher',{NAME=>'username',VERSIONS=>5}
然后,插入数据,并更新数据,使其产生历史版本数据,需要注意的是,这里插入数据和更新数据都是使用put命令,具体如下:
bash
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'
查询时,默认情况下回显示当前最新版本的数据,如果要查询历史数据,需要指定查询的历史版本数,由于上面设置了保存版本数为5,所以,在查询时制定的历史版本数的有效取值为1到5,具体命令如下:
5.3.7 退出HBase数据库
最后退出数据库操作,输入exit命令即可退出,命令如下:
bash
exit
注意,这里退出HBase数据库是退出HBase Shell,而不是停止HBase数据库后台运行,执行exit后,HBase仍然在后台运行,如果要停止HBase运行,需要使用如下命令:
bash
./bin/stop-hbase.sh
5.4 HBase编程实践
5.4.1 在Eclipse中创建项目
5.4.2为项目添加需要用到的JAR包
5.4.3 编写Java应用程序
java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class ExampleForHBase {
public static Configuration configuration;
public static Connection connection;
public static Admin admin;
public static void main(String[] args)throws IOException{
init();
createTable("student",new String[]{"score"});
insertData("student","zhangsan","score","English","69");
insertData("student","zhangsan","score","Math","86");
insertData("student","zhangsan","score","Computer","77");
getData("student", "zhangsan", "score","English");
close();
}
public static void init(){
configuration = HBaseConfiguration.create();
configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
try{
connection = ConnectionFactory.createConnection(configuration);
admin = connection.getAdmin();
}catch (IOException e){
e.printStackTrace();
}
}
public static void close(){
try{
if(admin != null){
admin.close();
}
if(null != connection){
connection.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
public static void createTable(String myTableName,String[] colFamily) throws IOException {
TableName tableName = TableName.valueOf(myTableName);
if(admin.tableExists(tableName)){
System.out.println("talbe is exists!");
}else {
TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
for(String str:colFamily){
ColumnFamilyDescriptor family =
ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(str)).build();
tableDescriptor.setColumnFamily(family);
}
admin.createTable(tableDescriptor.build());
}
}
public static void insertData(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Put put = new Put(rowKey.getBytes());
put.addColumn(colFamily.getBytes(),col.getBytes(), val.getBytes());
table.put(put);
table.close();
}
public static void getData(String tableName,String rowKey,String colFamily, String col)throws IOException{
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(rowKey.getBytes());
get.addColumn(colFamily.getBytes(),col.getBytes());
Result result = table.get(get);
System.out.println(new String(result.getValue(colFamily.getBytes(),col==null?null:col.getBytes())));
table.close();
}
}
5.4.4 编译运行程序
现在可以在Linux的终端中启动HBase Shell,来查看生成的表,启动HBase Shell的命令如下:
bash
cd /usr/local/hbase
./bin/hbase shell
进入HBase Shell以后,可以使用list命令查看HBase数据库中是否存在名称为student的表。
bash
list
再在HBase Shell交互式环境中,使用如下命令查看student表中的数据:
5.5 本章小结
HBase属于列族数据库,是NoSQL数据库的一种,它是Hadoop生态系统中的重要一员,借助于Hadoop的力量,HBase获得很好的发展空间,得到了大量的应用。
本章首先介绍了HBase的安装方法,包括下载安装文件、配置环境变量和添加用户权限等。然后,详细介绍了HBase的两种不同模式的配置方法,包括单机模式的配置和伪分布式模式的配置。在实际应用中,需要经常使用Shell命令操作HBase数据库,因此,本章详细介绍了一些常用的HBase Shell命令的使用方法,包括创建表、添加数据、查看数据、删除数据等。最后,本章详细介绍了HBase的Java应用程序开发方法。