第四章 HBase数据库
1、Hbase 基础
HBase链接:https://pan.baidu.com/s/1rUNxxwVZKbI_CPRi8F3hMQ
提取码:onnb
# 解压hbase压缩包
tar xvf hbase-1.0.2-bin.tar.gz -C /home/hduser
运行分布式 HBase 需要以下条件:
- JDK 环境
- SSH 免密码登录
- Hadoop 环境
1、完全分布式模式
注意:检查并同步所有节点机(node1、node2、node3)的时钟,并且各节点与 HBase的 HMaster节点(node1)时钟误差不能大于30秒。
修改三个配置文件:
(1)hbase-site.xml文件
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://node1:9000/hbase</value>
<description>配置 HRegionServer 的数据库存储目录</description>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
<description>配置 HBase 为完全分布式</description>
</property>
<property>
<name>hbase.master</name>
<value>node1:60000</value>
<description>配置 HMaster 的地址</description>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node1,node2,node3</value>
<description>配置 ZooKeeper 集群服务器的位置 </description>
</property>
</configuration>
其中主要参数说明如下:
- hbase.cluster.distributed:默认为false,即单机或伪分布式运行。这里设置为 true,表示在完全分布式模式运行。
- hbase.master:指定 HBase 的HMaster 服务器地址、端口。
- Hbase.zookeeper.quorum:指出了 ZooKeeper 集群中各服务器位置。也就是将哪些节点加入ZooKeeper 进行协调管理,推荐为奇数各服务器。
(2)hbase-env.sh文件
export JAVA_HOME=/usr/java/jdk1.8.0_191-amd64
export HADOOP_HOME=/home/hduser/hadoop
export HBASE_HOME=/home/hduser/hbase-1.0.2
export HBASE_MANAGES_ZK=true
(3)regionservers文件
该文件列出了所有 HRegionServer 节点,配置方式与 Hadoop 的slaves 文件类似,每行指定一台机器。当 HBase 启动、关闭时会把此文件中列出的所有机器同时启动、关闭。将node2、node3作为HRegionServer.因此 regionservers 文件中内容为node2和node3。
node2
node3
注意:regionservers 文件不包含node1,因为node1已在hbase-site.xml中被指定为 HMaster 服务器,通常不会将HMaster 和 HRegionServer 服务器运行在一个节点上。
在机器node1 上配置完成上面三个文件后,HBase基本的完全分布式模式配置便已完成。同 Hadoop分布式安装类似,还需要将HBase 所在目录,如:“/home/hduser/hbase-1.0.2” 分别复制到 node2、node3,使得各个节点上都能运行HBase来构建 HBase集群。
在node1 上运行下面的命令:
scp -r /home/hduser/hbase-1.0.2 [email protected]:/home/hduser/
scp -r /home/hduser/hbase-1.0.2 [email protected]:/home/hduser/
启动HBase:
命令: bin/start-hbase.sh
[[email protected] hbase-1.0.2]$ bin/start-hbase.sh
node2: zookeeper running as process 3395. Stop it first.
node3: zookeeper running as process 3319. Stop it first.
node1: zookeeper running as process 5604. Stop it first.
starting master, logging to /home/hduser/hbase-1.0.2/logs/hbase-hduser-master-node1.out
node2: starting regionserver, logging to /home/hduser/hbase-1.0.2/logs/hbase-hduser-regionserver-node2.out
node3: starting regionserver, logging to /home/hduser/hbase-1.0.2/logs/hbase-hduser-regionserver-node3.out
[[email protected] hbase-1.0.2]$ jps
4864 SecondaryNameNode
5604 HQuorumPeer
4678 NameNode
13607 Jps
8362 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
5007 ResourceManager
13503 HMaster
[[email protected] hbase-1.0.2]$
进入shell 命令:
命令: ./bin/hbase shell
[[email protected] hbase-1.0.2]$ ./bin/hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hduser/hbase-1.0.2/lib/slf4j-log4j12-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hduser/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
2019-03-20 23:41:58,153 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.0.2, r76745a2cbffe08b812be16e0e19e637a23a923c5, Tue Aug 25 15:59:49 PDT 2015
hbase(main):001:0> status
2 servers, 0 dead, 2.0000 average load
hbase(main):002:0>
查看HBase运行状态:
如: http://node1:16010
2、Hbase Shell 操作
常用命令列表
1、创建表:create
语法:create '表名称','列名称1','列名称2',…,'列名称N'
示例:create 'scores','grade','course'
2、查看所有表:list
语法:list
如果要查看该表所有列族的详细描述信息可使用describe命令。
语法:describe '表名’
3、添加数据:put
语法:put '表名称','行键','列键','值'
示例:put 'scores','tom','grade:','1'
4、扫描表:scan
1、指定列族
语法:scan '表名称',{COLUMNS=>['列族名1','列族名2',……],参数名=>参数值…}
示例:scan 'scores'
2、指定列键
语法:scan '表名称',{COLUMN=>['列键1','列键2',……],参数名=>参数值…}
示例:scan 'scores',{COLUMN=>'course:math',LIMIT=>1}
5、获取数据:get
语法:
get '表名称','行键',{COLUMNS=>['列族名1','列族名2'…],参数名=>参数值…}
get '表名称','行键',{COLUMN=>['列键1','列键2'…],参数名=>参数值…}
示例:
get 'scores','jason'
get 'scores','jason',{COLUMNS=>'course'}
get 'scores','jason',{COLUMN=>'course:math'}
6、删除数据:delete
语法:
delete '表名称','行键','列键'
deleteall '表名称','行键'
示例:
delete 'scores','jason','course:art'
deleteall 'scores','jason'
7、修改表:alter
语法:
alter '表名称',参数名=>参数值,...
alter '表名称',{参数名=>参数值,...}, {参数名=>参数值,...}…
示例:
alter 'scores',NAME=>'course',VERSIONS=>'5'
alter 'scores',{NAME=>'grade',VERSIONS=>'5'},{NAME=>'course', VERSIONS=>'5'}
8、删除表:drop
注意:删除前使用 disable 将表置为不可用
语法:
disable '表名'
drop '表名'
示例:
disable 'scores'
drop 'scores'
3、Hbase 编程
1、使用 Eclipse 开发 HBase 应用程序
1、创建普通Java project
在node1 上打开 Eclipse ,新建 Java Project 工程。
2、添加 jar 文件到构建路径
lib链接:https://pan.baidu.com/s/1aVm2XXLiYF_JPTwq2LJ2WQ
提取码:x2b9
3、添加 hbase-site.xml
链接:https://pan.baidu.com/s/1yfFGsTsUx_3ILWLLk_s2ug
提取码:c0bi
将 $HBASE_HOME/conf 下的 hbase-site.xml复制到工程源文件目录 “src” 中。
项目结构如下所示:
4、编写测试代码
package cn.hbase;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.util.Bytes;
public class HBaseTest {
static Configuration cfg = HBaseConfiguration.create();
// 列出数据库中所有表
public static void list() throws IOException {
// 创建数据库链接
Connection conn = ConnectionFactory.createConnection(cfg);
// Admin用于管理HBase数据库的表信息
Admin admin = conn.getAdmin();
System.out.println("===list tables:===");
for (TableName tn : admin.listTableNames())
System.out.println(tn);
conn.close();// 关闭连接
}
public static void main(String[] args) throws IOException {
list();
}
}
运行结果如下:
2、HBase 数据存储管理 API
HBase Java API 与HBase数据模型对应关系
1.HBaseConfiguration:包括HBase的所有配置信息
示例:
Configuration cfg=HBaseConfiguration.create();
配置文件搜索顺序: 1、hbase-site.xml 2、hbase-default.xml
2.Connection:表示到HBase的连接
- 获取Admin管理数据库
- 获取Table管理表
示例:
Connection conn=ConnectionFactory.createConnection(cfg);//创建连接 //获取管理HBase集群的管理实例
Admin admin=conn.getAdmin(); //获取管理HBase集群的管理实例
Table table=conn.getTable(TableName.valueOf(“scores”)); //获取scores表的实例
conn.close();//关闭连接
3. Admin:管理HBase的接口
下面通过 Admin 接口来重新创建 scores表,代码如下所示:
package cn.hbase;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.util.Bytes;
public class HBaseTest {
static Configuration cfg = HBaseConfiguration.create();
// 列出数据库中所有表
public static void list() throws IOException {
// 创建数据库链接
Connection conn = ConnectionFactory.createConnection(cfg);
// Admin用于管理HBase数据库的表信息
Admin admin = conn.getAdmin();
System.out.println("===list tables:===");
for (TableName tn : admin.listTableNames())
System.out.println(tn);
conn.close();// 关闭连接
}
// 创建表
public static void create(String tableName, String... familyNames)
throws IOException {
Connection conn = ConnectionFactory.createConnection(cfg);
Admin admin = conn.getAdmin();
// TableName:以POJO对象来封装表的名字
TableName tn = TableName.valueOf(tableName);
if (admin.tableExists(tn)) { // 如果存在先删除
admin.disableTable(tn);// 先使表无效
admin.deleteTable(tn);
}
// HTableDescriptor包含了表的名字及其对应的列族
HTableDescriptor htd = new HTableDescriptor(tn);
for (String family : familyNames)
htd.addFamily(new HColumnDescriptor(family));
admin.createTable(htd);
conn.close();
System.out.println("create success!");
}
// 修改表-增加列族
public static void addColumnFamily(String tableName, String... familyNames)
throws IOException {
Connection conn = ConnectionFactory.createConnection(cfg);
Admin admin = conn.getAdmin();
TableName tn = TableName.valueOf(tableName);
HTableDescriptor htd = admin.getTableDescriptor(tn);
for (String family : familyNames)
htd.addFamily(new HColumnDescriptor(family));
admin.modifyTable(tn, htd);
conn.close();
System.out.println("modify success!");
}
// 修改表-删减列族
public static void removeColumnFamily(String tableName,
String... familyNames) throws IOException {
Connection conn = ConnectionFactory.createConnection(cfg);
Admin admin = conn.getAdmin();
TableName tn = TableName.valueOf(tableName);
HTableDescriptor htd = admin.getTableDescriptor(tn);
for (String family : familyNames)
htd.removeFamily(Bytes.toBytes(family));// 删减指定列族
admin.modifyTable(tn, htd);
conn.close();
System.out.println("remove success!");
}
// 查看表结构
public static void describe(String tableName) throws IOException {
Connection conn = ConnectionFactory.createConnection(cfg);
Admin admin = conn.getAdmin();
TableName tn = TableName.valueOf(tableName);
HTableDescriptor htd = admin.getTableDescriptor(tn);
System.out.println("===decribe " + tableName + ":===");
for (HColumnDescriptor hcd : htd.getColumnFamilies()) {
System.out.println(hcd.getNameAsString());
}
System.out.println("===============");
conn.close();
}
public static void main(String[] args) throws IOException {
create("scores", "grade", "course");// 创建表并指定2个列族
describe("scores");
addColumnFamily("scores", "f1", "f2");// 新增2个列族
describe("scores");
removeColumnFamily("scores", "f1");// 删除1个列族
describe("scores");
list();
}
}
4. HTableDescriptor、TableName、Table
5. HTableDescriptor、TableName、Table