HBase的基础
一、HBase的概念
二、HBase的体系结构
三、HBase的基本原理
四、HBase的安装配置
1、本地模式(不需要HDFS(先stop-all.sh),保存在Linux的文件系统)
1)事先需要在/training/hbase-1.3.1目录下创建data目录: mkdir /training/hbase-1.3.1/data
2)进入到/training/hbase-1.3.1/conf目录下,
(1)vi hbase-env.sh,修改如下信息:
export JAVA_HOME=/training/jdk1.8.0_171
(2)vi hbase-site.xml,在<configuration></configuration>之间添加如下信息:
<property>
<name>hbase.rootdir</name>
<!--这个data事先需要创建-->
<value>file:///training/hbase-1.3.1/data</value>
</property>
3)启动HBase:start-hbase.sh
starting master, logging to /training/hbase-1.3.1/logs/hbase-root-master-niit00.out
只有HMaster
4)hbase shell 登录到hbase上
(*)创建学生表
create 'student','info','grade'
(*)登录到web Console上查看:http://niit00:16010
2、伪分布模式(需要HDFS环境)
0)需要将hadoop启动起来(如果已经启动了,就不需要执行这个命令):
start-all.sh
1)上传hbase-1.3.1-bin.tar.gz到/tools目录下
2)将hbase-1.3.1-bin.tar.gz文件解压并安装到/training目录下
tar -zvxf hbase-1.3.1-bin.tar.gz -C /training/
3)配置环境变量
vi ~/.bash_profile
在打开的.bash_profile文件中添加如下信息:
export HBASE_HOME=/training/hbase-1.3.1
export PATH=$HBASE_HOME/bin:$PATH
4)让环境变量生效
source ~/.bash_profile
5)验证配置hbase的环境变量是否生效
hbase ----- 看看是否有Usage: hbase [<options>] <command> [<args>]信息,如果有则生效了,否则,配置有误
6)进入到/training/hbase-1.3.1/conf目录下
cd /training/hbase-1.3.1/conf
在该目录下找到如下文件进行修改:
(a)vi hbase-env.sh,修改如下信息:
(1)找到# export JAVA_HOME=/usr/java/jdk1.6.0/这句代码,将#号去掉,将/usr/java/jdk1.6.0改成你自己的JAVA_HOME路径
我本机的JAVA_HOME的路径是:/training/jdk1.8.0_171,所以我修改好之后的样子如下:
export JAVA_HOME=/training/jdk1.8.0_171
(2)找到# export HBASE_MANAGES_ZK=true 将#号去掉即可
(3)保存退出
(b)vi hbase-site.xml,在<configuration></configuration>之间添加如下信息,
注意下面的有IP的地址需要修改成你自己主机的IP地址或者主机名:
<!--HBase的数据保存在HDFS对应目录-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://niit06:9000/hbase</value>
</property>
<!--是否是分布式环境-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--配置ZK的地址-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>niit06</value>
</property>
<!--冗余度-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
(c)vi regionservers,配置从节点地址(伪分布只有一台主机,所以配置一个即可):
将localhost改成IP地址或者主机名:niit06
7)启动HBase:
start-hbase.sh
8)使用jps命令查看,是否已经启动了如下三个进程(如果以下上个进程存在,则说明安装配置hbase成功了):
HRegionServer
HQuorumPeer
HMaster
9)登录Web Console进程查看:
http://niit01:16010
3、全分布模式(有三台主机:niit01(主节点) niit02(从节点) niit03(从节点))
特别注意:如果没有特别说明的,以下所有的操作默认都是在主节点(niit01)上进行的
1)上传hbase-1.3.1-bin.tar.gz到/tools目录下
2)将hbase-1.3.1-bin.tar.gz文件解压并安装到/training目录下
tar -zvxf hbase-1.3.1-bin.tar.gz -C /training/
3)配置环境变量(这里需要在三台主机上都要配置)
vi ~/.bash_profile
在打开的.bash_profile文件中添加如下信息:
export HBASE_HOME=/training/hbase-1.3.1
export PATH=$HBASE_HOME/bin:$PATH
4)让环境变量生效
source ~/.bash_profile
5)验证配置hbase的环境变量是否生效
hbase ----- 看看是否有Usage: hbase [<options>] <command> [<args>]信息,如果有则生效了,否则,配置有误
6)进入到/training/hbase-1.3.1/conf目录下
cd /training/hbase-1.3.1/conf
在该目录下找到如下文件进行修改:
(a)vi hbase-env.sh,修改如下信息:
(1)找到# export JAVA_HOME=/usr/java/jdk1.6.0/这句代码,将#号去掉,将/usr/java/jdk1.6.0改成你自己的JAVA_HOME路径
我本机的JAVA_HOME的路径是:/training/jdk1.8.0_171,所以我修改好之后的样子如下:
export JAVA_HOME=/training/jdk1.8.0_171
(2)找到# export HBASE_MANAGES_ZK=true 将#号去掉即可 将true 改成false
(3)保存退出
(b)vi hbase-site.xml,在<configuration></configuration>之间添加如下信息,
注意下面的有IP的地址需要修改成你自己主机的IP地址:
<!--HBase的数据保存在HDFS对应目录-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://niit01:9000/hbase</value>
</property>
<!--是否是分布式环境-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--配置ZK的地址-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>niit01</value>
</property>
<!--冗余度-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--主节点和从节点允许的最大时间误差-->
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
</property>
(c)vi regionservers,配置从节点地址:
将localhost改成IP地址或者主机名:
niit02
niit03
7)进入到/training目录下,将hbase-1.3.1整个目录复制到其他两个从节点上:
scp -r hbase-1.3.1/ [email protected]:/training
scp -r hbase-1.3.1/ [email protected]:/training
7)启动HBase:
start-hbase.sh
8)使用jps命令查看,是否已经启动了如下三个进程(如果以下上个进程存在,则说明安装配置hbase成功了):
HRegionServer
HMaster
9)登录Web Console进程查看:
http://niit01:16010
4、HBase实现HA(在以上全分布模式的基础上,任意选择niit02或者niit03作为HMaster即可)
假设我选择niit02作为备份的HMaster的话,我需要在niit02上手动启动一个HMaster进程即可:
hbase-daemon.sh start master
几种数据库的比较
Redis |
mongdb |
hbase |
关系型数据库 |
特点:基于内存,key-value |
基于文档式的nosql |
基于列式的数据库 |
|
场景: |
|
|
|
五、HBase的基本操作
1、命令行
创建表: create 'student','info','grade'
插入数据: put 'student','stu001','info:name','Tom'
put 'student','stu001','info:age','24'
put 'student','stu001','info:gender','Male'
put 'student','stu001','grade:math','80'
put 'student','stu002','info:name','Mike'
查询:scan 'student'
get格式: get '表名','行键'
get 'student','stu001'
删除表:disable 'student'
drop 'student'
2、Java API
注意:需要引入hbase安装目录下的所有的jar包,代码的中主机名需要在window下配置主机名与ip地址的映射关系
package hbase.java;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Test;
public class TestHBaseDemo {
public static void main(String[] args) throws Exception {
createTable();
// insertOne();
//get();
// scan();
// dropTable();
insertMultRecord();
}
private static void createTable() throws Exception {
// 指定ZooKeeper地址,从zk中获取HMaster的地址
// 注意:ZK返回的是HMaster的主机名, 不是IP地址 ---> 配置Windows的hosts文件
// C:\Windows\System32\drivers\etc\hosts
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "niit110");
// 创建一个HBase的客户端
HBaseAdmin client = new HBaseAdmin(conf);
// 创建表: 通过表的描述符
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("students"));
// 列族的信息
HColumnDescriptor h1 = new HColumnDescriptor("info");
HColumnDescriptor h2 = new HColumnDescriptor("grade");
// 将列族加入表
htd.addFamily(h1);
htd.addFamily(h2);
// 创建表
client.createTable(htd);
client.close();
}
private static void insertOne() throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "niit110");
// 指定表的客户端
HTable table = new HTable(conf, "students");
// 构造一条数据
Put put = new Put(Bytes.toBytes("stu001"));
put.addColumn(Bytes.toBytes("info"), // 列族的名字
Bytes.toBytes("name"), // 列的名字
Bytes.toBytes("Tom")); // 值
// 插入
table.put(put);
table.close();
}
private static void dropTable() throws IOException {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "niit110");
// 创建一个HBase的客户端
HBaseAdmin client = new HBaseAdmin(conf);
client.disableTable("students");
client.deleteTable("students");
client.close();
}
private static void scan() throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "niit110");
// 指定表的客户端
HTable table = new HTable(conf, "students");
// 创建一个扫描器 Scan
Scan scanner = new Scan(); // ----> 相当于: select * from students;
// scanner.setFilter(filter) ----> 过滤器
// 执行查询
ResultScanner rs = table.getScanner(scanner); // 返回ScannerResult --->
// Oracle中的游标
for (Result r : rs) {
String name = Bytes.toString(r.getValue(Bytes.toBytes("info"), Bytes.toBytes("name")));
String age = Bytes.toString(r.getValue(Bytes.toBytes("info"), Bytes.toBytes("age")));
System.out.println(name + " " + age);
}
table.close();
}
private static void get() throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "niit110");
// 指定表的客户端
HTable table = new HTable(conf, "students");
// 通过Get查询
Get get = new Get(Bytes.toBytes("stu001"));
// 执行查询
Result record = table.get(get);
// 输出
String name = Bytes.toString(record.getValue(Bytes.toBytes("info"), Bytes.toBytes("name")));
System.out.println(name);
table.close();
}
private static void insertMultRecord() throws Exception {
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum", "niit110");
// 指定表的客户端
HTable table = new HTable(conf, "students");
// 构造集合,代表要插入的数据
List<Put> listData = new ArrayList<Put>();
for (int i = 0; i < 20; i++) {
Put put = new Put(Bytes.toBytes("stu00" + i));
put.add(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("Tom-" + i));
int age = 20 + i;
put.add(Bytes.toBytes("info"), Bytes.toBytes("age"), Bytes.toBytes(String.valueOf(age)));
listData.add(put);
}
table.put(listData);
table.close();
}
}
3、Web Console: 端口 16010