Hbase 安装
#### 一、 HBase介绍
##### 1 是什么
###### 1.1 HBase是什么(baidu, 官网)
```
HBase是一个Hadoop生态圈中的一种数据库, 分布式、可伸缩的、是一个稀疏的、存储海量数据的工具。以谷歌的Bigtable为模型的分布式、版本化、非关系数据库:结构化数据分布式存储系统。Apache HBase在Hadoop和HDFS上提供了类似Bigtable的功能。
```
##### 2 有什么用
###### 2.1 为什么要有HBase
```
随着互联网整个行业的发展,整个数据处理爆炸的年代,换言之我们每天会产生大量的数据,这些数据如果存储到传统的数据库中,已经不能满足我们对数据存储的要求了,所以出现很多分布式的存储介质。当我们需要随机的并且实时的读写海量数据的时候就可以使用HBase。
```
###### 2.2 特点
###### 2.3 认识HBase的表结构
![](001.png)
###### 2.4 HBase的内部结构
![](002.png)
- 各个节点的作用
```
- Client : hbase客户端,1.包含访问hbase的接口。比如,linux shell,java api。2.除此之外,它会维护缓存来加速访问hbase的速度。比如region的位置信息。
- Zookeeper : 1.监控Hmaster的状态,保证有且仅有一个活跃的Hmaster。达到高可用。2.它可以存储所有region的寻址入口。如:root表在哪一台服务器上。3. 实时监控HregionServer的状态,感知HRegionServer的上下线信息,并实时通知给Hmaster。4. 存储hbase的部分元数据。
- HMaster : 1. 为HRegionServer分配Region(新建表等)。2. 负责HRegionServer的负载均衡。3. 负责Region的重新分配(HRegionServer宕机之后的Region分配,HRegion裂变:当Region过大之后的拆分)。4. Hdfs上的垃圾回收。5. 处理schema的更新请求
- HRegionServer :1. 维护HMaster分配给的Region(管理本机的Region)。2. 处理client对这些region的读写请求,并和HDFS进行交互。3. 负责切分在运行过程中组件变大的Region。
- HLog : 1. 对HBase的操作进行记录,使用WAL写数据,优先写入log(put操作:先写日志再写memstore,这样可以防止数据丢失,即使丢失也可以回滚)。
- HRegion : 1. HBase中分布式存储和负载均衡的最小单元,它是表或者表的一部分。
- Store : 1. 相当于一个列簇
- Memstore : 1. 内存缓冲区,用于将数据批量刷新到hdfs中,默认大小为128M
- StoreFile : 1. 和HFile概念意义,不过是一个逻辑概念。HBase中的数据是以HFile存储在Hdfs上。
```
- 各个节点之间的关系
```
HMaster:HRegionServer : 1=*
HRegionServer:HRegion : 1=*
HRegionServer:HLog : 1=1
HRegion:Store : 1=*
Store:Memstore : 1=1
Memstore:HStoreFile : 1=*
StoreFile:HFile : 1=1
```
##### 3 怎么用
###### 3.1 安装单机节点hbase
- hbase-env.sh
```
# The java implementation to use. Java 1.7+ required.
export JAVA_HOME=/usr/local/jdk1.8.0_45
# Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+
# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
# Tell HBase whether it should manage it's own instance of Zookeeper or not.
export HBASE_MANAGES_ZK=true
```
- hbase-site.xml
```
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///usr/local/hbasedata</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/zkdata</value>
</property>
</configuration>
```
- 启动命令
```
start-hbase.sh
```
- 连接
```
hbase shell
```
###### 3.2 伪分布式的安装
- hbase-site.xml
```
<property>
<name>hbase.rootdir</name>
<value>hdfs://hbase1:9000/hbase</value>
</property
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
```
###### 3.3 全分布式的安装
- 搭建前的准备
| Node Name | |
| --------- | ------------------------------------------------- |
| hbase1 | Namenode、HMaster |
| hbase2 | Datanode、HRegionServer、Zookeeper、Backup Master |
| hbase3 | Datanode、HRegionServer、Zookeeper |
| hbase4 | Datanode、HRegionServer、Zookeeper |
- conf/regionservers
```
hbase2
hbase3
hbase4
```
- conf/backup-masters
```
hbase2
```
- 配置zookeeper
- conf/hbase-env.sh
```
# Tell HBase whether it should manage it's own instance of Zookeeper or not.
export HBASE_MANAGES_ZK=false
```
- hbase-site.xml
```
<configuration>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hbase1:9000/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hbase2:2181,hbase3:2181,hbase4:2181</value>
</property>
</configuration>
```
- 启动
```
start-hbase.sh
```
#### 二、HBase的shell命令
##### 0 常用命令
```
hbase(main):002:0> status
1 active master, 1 backup masters, 3 servers, 0 dead, 0.6667 average load
hbase(main):003:0> version
1.2.1, r8d8a7107dc4ccbf36a92f64675dc60392f85c015, Wed Mar 30 11:19:21 CDT 2016
hbase(main):004:0> help
hbase(main):010:0> help 'create'
```
##### 1 ddl
###### 1.1 namespace
```
hbase(main):005:0> create_namespace 'ns1'
hbase(main):007:0> list_namespace
NAMESPACE
default
hbase
ns1
3 row(s) in 0.0190 seconds
hbase(main):013:0> list_namespace_tables 'default'
describe_namespace 'hbase'
hbase(main):021:0> alter_namespace 'ns1', {METHOD => 'set', 'name'=>'lixi'}
0 row(s) in 0.4610 seconds
hbase(main):022:0> describe
describe describe_namespace
hbase(main):022:0> describe_namespace 'ns1'
DESCRIPTION
{NAME => 'ns1', name => 'lixi'}
1 row(s) in 0.0050 seconds
hbase(main):023:0> alter_namespace 'ns1', {METHOD => 'unset', NAME=>'name'}
0 row(s) in 0.0280 seconds
hbase(main):024:0> describe_namespace 'ns1'
DESCRIPTION
{NAME => 'ns1'}
1 row(s) in 0.0040 seconds
```
###### 1.2 建表语句ddl
- 建表
```
hbase(main):028:0> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40']
0 row(s) in 2.2630 seconds
```
![](003.png)![](004.png)
- alter:修改表
```
hbase> alter 't1', NAME => 'f1', VERSIONS => 5 : 给指定的表添加一个列簇
hbase> alter 'ns1:t1', 'delete' => 'f1' : 删除一个指定表的列簇
注意:不能直接修改表的列簇名
```
- drop :删除表
```
hbase(main):045:0> disable 'ns1:t1'
hbase(main):046:0> is_disabled 'ns1:t1'
hbase(main):047:0> drop 'ns1:t1'
hbase(main):048:0> list
```
##### 2 dml
###### 2.1 插入数据
- put
```
hbase(main):055:0> put 'ns1:user_info', '002', 'base_info:name', 'lixi'
0 row(s) in 0.0840 seconds
hbase(main):056:0> put 'ns1:user_info', '002', 'base_info:age', '32'
0 row(s) in 0.0100 seconds
hbase(main):057:0> put 'ns1:user_info', '002', 'base_info:sex', 'man'
0 row(s) in 0.0320 seconds
```
###### 2.2 查询数据
- scan
```
hbase(main):100:0> scan 'ns1:user_info
hbase(main):100:0> scan 'ns1:user_info',{COLUMNS => 'base_info:age'}
ROW COLUMN+CELL
002 column=base_info:age, timestamp=1546936077211, value=32
1 row(s) in 0.0220 seconds
hbase(main):105:0> scan 'ns1:user_info', {COLUMNS => ['base_info:name', 'base_info:age'], LIMIT => 1, STARTROW => '001'}
ROW COLUMN+CELL
001 column=base_info:age, timestamp=1546936869213, value=80
001 column=base_info:name, timestamp=1546936879659, value=gaoyuanyuan
1 row(s) in 0.0070 seconds
hbase(main):112:0> scan 'ns1:user_info', {COLUMNS => 'base_info:age', TIMERANGE => [1546936077211, 1546936869214]}
ROW COLUMN+CELL
001 column=base_info:age, timestamp=1546936869213, value=80
002 column=base_info:age, timestamp=1546936077211, value=32
```
- get
```
hbase> get 'ns1:t1', 'r1'
hbase> get 't1', 'r1'
hbase> get 't1', 'r1', {TIMERANGE => [ts1, ts2]}
hbase> get 't1', 'r1', {COLUMN => 'c1'}
hbase> get 't1', 'r1', {COLUMN => ['c1', 'c2', 'c3']}
hbase> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => ts1}
hbase> get 't1', 'r1', {COLUMN => 'c1', TIMERANGE => [ts1, ts2], VERSIONS => 4}
hbase> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => ts1, VERSIONS => 4}
hbase> get 't1', 'r1', {FILTER => "ValueFilter(=, 'binary:abc')"}
hbase> get 't1', 'r1', 'c1'
hbase> get 't1', 'r1', 'c1', 'c2'
hbase> get 't1', 'r1', ['c1', 'c2']
hbase> get 't1', 'r1', {COLUMN => 'c1', ATTRIBUTES => {'mykey'=>'myvalue'}}
hbase> get 't1', 'r1', {COLUMN => 'c1', AUTHORIZATIONS => ['PRIVATE','SECRET']}
hbase> get 't1', 'r1', {CONSISTENCY => 'TIMELINE'}
hbase> get 't1', 'r1', {CONSISTENCY => 'TIMELINE', REGION_REPLICA_ID => 1}
```
###### 2.3 修改数据
```
hbase(main):114:0> put 'ns1:user_info', '001', 'base_info:name', 'fanbinbin'
```
###### 2.4 删除数据
```
hbase(main):024:0> delete 'ns1:user_info', '001', 'base_info:age', 1546936869213
```
###### 2.5 incr