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

posted @ 2019-04-03 20:59  VIP8cnbl  阅读(158)  评论(0编辑  收藏  举报