Hbase安装和入门
来源:千峰科技王从明老师
第一节:Zookeeper的概述
1.1 Zookeeper是什么
1. zookeeper是一个为分布式应用程序提供的一个分布式开源协调服务框架。是Google的Chubby的一个开源实现,是Hadoop和Hbase的重要组件。主要用于解决分布式集群中应用系统的一致性问题。
2. 提供了基于类似Unix系统的目录节点树方式的数据存储。
3. 可用于维护和监控存储的数据的状态的变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理
4. 提供了一组原语(机器指令),提供了java和c语言的接口
1.2 Zookeeper的特点
1. 也是一个分布式集群,一个领导者(leader),多个跟随者(follower).
2. 集群中只要有半数以上的节点存活,Zookeeper集群就能正常服务。
3. 全局数据一致性:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。
4. 更新请求按顺序进行:来自同一个client的更新请求按其发送顺序依次执行
5. 数据更新的原子性:一次数据的更新要么成功,要么失败
6. 数据的实时性:在一定时间范围内,client能读到最新数据。
D03-2.1.png
1.3 Zookeeper的数据模型
Zookeeper的数据模型采用的与Unix文件系统类似的层次化的树形结构。我们可以将其理解为一个具有高可用特征的文件系统。这个文件系统中没有文件和目录,而是统一使用"节点"(node)的概念,称之为znode。znode既可以作为保存数据的容器(如同文件),也可以作为保存其他znode的容器(如同目录)。所有的znode构成了一个层次化的命名空间。
D03-2-3.1.png- Zookeeper 被设计用来实现协调服务(这类服务通常使用小数据文件),而不是用于大容量数据存储,因此一个znode能存储的数据被限制在1MB以内,
- 每个znode都可以通过其路径唯一标识。
1.4 Zookeeper的应用场景
1. 统一配置管理
2. 统一集群管理
3. 服务器节点动态上下线感知
4. 软负载均衡等
5. 分布式锁
6. 分布式队列
第二节:Zookeeper的安装
2.1 环境变量的配置
1. 将zookeeper-3.4.6.tar.gz上传到/opt/software中
2. 解压
[root@master04 software]$ tar -zxvf zookeeper-3.4.6.tar.gz -C /opt/apps/
3. 更名或者创建软连接
[root@master04 apps]$ mv zookeeper-3.4.6 zookeeper
4. 配置环境变量
[root@master04 apps]$ vi ~/.bash_profile
ZOOKEEPER_HOME=/opt/apps/zookeeper
PATH=$ZOOKEEPER_HOME/bin:$PATH
export ZOOKEEPER_HOME PATH
5. 使当前会话生效
[root@master04 apps]$ source ~/.bash_profile
2.2 集群模式的配置
2.2.1 Zookeeper的服务进程布局
master04 QuorumPeerMain
worker1 QuorumPeerMain
worker2 QuorumPeerMain
2.2.2 修改zoo.cfg文件
[root@master04 zookeeper]# mkdir zkData
[root@master04 conf]# cp zoo_samle.cfg zoo.cfg
[root@master04 conf]# vi zoo.cfg
tickTime=2000 # 定义的时间单元(单位毫秒),下面的两个值都是tickTime的倍数。
initLimit=10 #follower连接并同步leader的初始化连接时间。
syncLimit=5 #心跳机制的时间(正常情况下的请求和应答的时间)
dataDir=/opt/apps/zookeeper/zkData #修改zookeeper的存储路径
clientPort=2181 #客户端连接服务器的port
server.1=master04:2888:3888 # 添加三个服务器节点
server.2=worker1:2888:3888
server.3=worker2:2888:3888
格式:Server.id=ip:port1:port2
id: 服务器的id号,对应zkData/myid文件内的数字
ip: 服务器的ip地址
port1: follower与leader交互的port, 数据保证一致性,进行同时时所使用的端口号
port2: 选举期间使用的port
2.2.3 在$ZK_HOME/zkData/目录下添加myid文件,内容为server的id号
[root@master04 conf]# cd ..zkData
[root@master04 conf]# echo "1" >> myid
2.2.4 搭建其他两个server节点的环境
2.2.4.1 使用scp命令将zookeeper环境 复制到worker1和worker2中
[root@master04 conf]$ scp /opt/apps/zookeeper worker1:/opt/apps/
[root@master04 conf]$ scp /opt/apps/zookeeper worker2:/opt/apps/
2.2.4.2 使用scp命令拷贝~/.bash_profile到两台机器上(别忘记source一下)
[root@master04 conf]$ scp ~/.bash_profile worker1:~/
[root@master04 conf]$ scp ~/.bash_profile worker2:~/
2.2.4.3 修改slave1的myid文件的内容为2
]$ ssh worker1
]$ echo "2" > /opt/apps/zookeeper/myid
2.2.4.4 修改slave2的myid文件的内容为3
]$ ssh worker2
]$ echo "3" > /opt/apps/zookeeper/myid
2.2.4.5 总结:搭建zookeeper集群模式错误有:
1. 检查所有作为服务器上的防火墙是否关闭
2. 检查所有作为服务器的机器是否有myid文件 myid文件应该存储在dataDir属性对应的路径内
3. myid文件里的内容只能是数字,不能有空行,空格
4. 检查zoo.cfg文件内是否配置正确
5. 在哪个工作空间里使用zkServer.sh start ,就会在此目录下生成zookeeper.out日志
2.3 命令的使用
2.3.1 启动客户端的操作:
zkCli.sh [-server] [ ip:port]
20190925110100.jpg
.jpg)
1. ls -- 查看某个目录包含的所有文件
2. ls2 -- 查看某个目录包含的所有文件,与ls不同的是它查看到time、version等信息
3. create -- 创建znode,并设置初始内容,例如:
[zk: 127.0.0.1:2181(CONNECTED) 1] create /test "test"
Created /test
4. get -- 获取znode的数据
5. set -- 修改znode内容
6. delete -- 删除znode
7. quit -- 退出客户端
8. help -- 帮助命令
2.4 节点类型
2.4.1 节点状态
1. ephemeral(短暂):客户端和服务器断开后,创建的节点自己删除。
2. persistent(持久):客户端和服务器断开后,创建的节点不删除(默认情况)
2.4.2 节点类型
1. persistent :断开连接后,该节点依旧存在
2. persistent_sequential :断开连接后,该节点依旧存在。节点名进行顺序编号
3. ephemeral :断开连接后,该节点自动删除
4. ephemeral_sequential :断开连接后,该节点自动删除。节点名进行顺序编号
45EB0C9D8481D45C05701FF92ABD38EC.png
2.5 Zookeeper的监听原理
D03-4-4.1.png.png)
2.5.1 图解:
1. 首先要有一个main()线程
2. 在main线程中创建Zookeeper客户端, 这时就会创建两个线程, 一个负责网络连接通信(connet),一个负责监听(listener)。
3. 通过connect线程将注册的监听事件发送给Zookeeper。
4. 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
5. Zookeeper监听到有数据或路径变化, 就会将这个消息发送给listener线程。
6. listener线程内部调用了process() 方法。
2.5.2 用途:
1. 监听节点数据的变化: get /path watch
2. 监听子节点增减的变化 : ls /path watch
第三节:Hbase的简介
3.1 Hbase的来源
1. 数据量越来越大,传统的关系型数据库不能满足存储和查询的需求。而hive虽然能够满足存储的要求,但是hive的本质也是利用底层的mr程序,所以读写速度不快。而且hive不能满足非结构化的、半结构化的存储,hive的主要作用是做分析和统计,hive用于存储是无意义的。
2. 起源于Google在2006发表的一篇论文《bigtable》,是对bigtable的开源实现的java版本
3.2 Hbase的定义
Hbase是一个在HDFS上运行的,面向列的,分布式的,hadoop数据库。它是一个NoSql(Not Only SQL,泛指非关系型数据库)数据库,不是传统的关系型数据库。对事物的支持很差。起源于《bigtable》
参考官网: http://hbase.apache.org/
002.png3.3 Hbase的特征
1. 适合存储超大规模的数据集,可以提供数据的近似实时随机读写
2. 线性扩展性好,高可靠性
3. Hbase的表模型与关系型数据库的表模型不同:
- Hbase的表没有固定的字段定义;
- Hbase的表中每行存储的都是一些key-value对
- Hbase的表中有列簇的划分,用户可以指定将哪些kv插入哪个列簇
- Hbase的表在物理存储上,是按照列簇来分割的,不同列簇的数据一定存储在不同的文件中
- Hbase的表中的每一行都固定有一个行键,而且每一行的行键在表中不能重复
4. Hbase中的数据,包含行键,包含key,包含value,都是byte[ ]类型,hbase不负责为用户维护数据类型
5. HBASE对事务的支持很差
参考官网: http://hbase.apache.org/
003.png3.4 Hbase与Hadoop的关系
hbase的存储依赖于HDFS
3.5 关系型数据库的表模型
我们先来了解以下传统型数据库的存储结构,也就是表模型(参考下图):
- 关系型数据库采用表格的存储方式,数据按行和列进行存储,读取和查询十分方便。
- 关系型数据库存储结构化的数据,存储前必须先定义好表结构,即各个列(字段)。
20190915141355.jpg
关系型数据库的特点:
1. 存储结构:以表格的形式存储结构化的数据,需要事先定义好表的结构(字段名称,字段类型,字段个数),数据存储在行与列的交汇处(称之为Cell单元格)
2. 存储规范:为了充分利用存储空间,尽可能的避免重复(数据冗余),按照数据最小关系表的形式存储,数据清晰,一目了然
3. 查询方式:采用结构化查询语言(SQL)对数据进行管理。
4. 事务性:为了保证数据的商业业务逻辑以及数据安全性,支持ACID的事务特性
5. 读写性能:关系型数据库追求的是数据实时性和数据的一致性,
缺点总结:
1. 一旦数据表中存储数据后,修改表结构变得特别困难。
2. 如果我们想扩展字段时,会对表结构产生影响。
3. 即使某一行中的某个字段没有赋值,也要使用null填充
4. 一旦涉及到多张表,因为数据表存在着复杂的关系,管理非常不方便。
5. 一旦面对海量数据的处理时,读写性能特别差,尤其在高并发这一块。
3.6 Hbase的表模型
HBase是一个面向列的非关系型数据库,区别于面向行存储的关系型数据库。
1. Hbase表的基本存储单位是一个单元格(Cell),也可以称之为列(Column)。
2. 单元格内存储的是一对key-value键值对。
3. 每一个key-value键值对都有N个时间戳作为版本号(版本数量可以配置)
4. 为了管理不同的key-value,hbase引入了列簇(列族)的概念,
- 一个表可以有多个列簇(不同列簇的数据一定会存储在不同文件中,即一个列簇对应一个文件)
- 一个列族下可以有成千上百万个不同的key-value,即列
5. 为了标识某些key-value键值对是某一个事物的,引入了rowkey的概念。rowkey作为唯一标识符,不能重复。
6. 一张表通常由于数据量过大,会被横向切分成若干个region(用rowkey范围标识)
- 不同region的数据也存储在不同文件中
7. hbase会对插入的数据按顺序存储:(内存)
- 要点一:首先会按行键排序
- 要点二:同一行里面的kv会按列簇排序,再按k排序
20190915141505.jpg
3.7 存储结构中的概念
3.7.1 Cell(单元格)
- 关系型数据库中的表模型是由行和列构成,交叉点我们称之为Cell(单元格),用于存储字段(Column)的数据。
- Hbase的表模型与关系型数据库的表模型不同。在单元格上是以 key-value 形式来存储某一个字段(Column)数据的。
- 版本号(Timestamp)每一个单元格都有自己的版本号。
20190915132457.jpg
3.7.2 rowKey(行键)
- 对于每个单元格(列名与值)来说,他属于哪一行记录,尤为重要,因此引入rowkey这个概念,用于区分单元格属于那一行记录,
- 在Hbase中的表中的rowkey不能重复
3.7.3 列族(Column family):
思考一下,面向列的数据库,只需要有列就行了,为什么还要有列族呢?
1. 列族是是多个列的集合。用于统一管理相似的列数据。
2. Hbase会尽量把同一个列族的列放在同一个服务器上,这样可以提高存取效率,可以批量管理有关联的一堆列。
3. 一个列族对应一个目录。不同的列族一定存储在不同的文件中
强调:业务需求一般也都是查询相关列信息,而非select *
4. hbase在建表时,指定的是列族,而非列,列族的个数有限制(默认是10个)
5. 列族是由多个列组成,列族的成员可以有上百万个。
6. 列族成员的表示方式:ColFamiName:colName
第四节:Hbase的架构
3.1 架构解析:
004.png1. Client : hbase客户端,
- 包含访问hbase的接口。比如,linux shell,java api。
- 除此之外,它会维护缓存来加速访问hbase的速度。比如region的位置信息。
2. Zookeeper :
- 监控Hmaster的状态,保证有且仅有一个活跃的Hmaster。达到高可用。
- 它可以存储所有region的寻址入口。如:root表在哪一台服务器上。
- 实时监控HregionServer的状态,感知HRegionServer的上下线信息,并实时通知给Hmaster。
- 存储hbase的部分元数据。
3. HMaster :
- 1. 为HRegionServer分配Region(新建表等)。
- 2. 负责HRegionServer的负载均衡。
- 3. 负责Region的重新分配
- HRegionServer宕机之后的Region分配,
- HRegion裂变:当Region过大之后的拆分)。
- 4. Hdfs上的垃圾回收。
- 5. 处理schema的更新请求
4. HRegionServer :
- 1. 维护HMaster分配给的Region(管理本机的Region)。
- 2. 处理client对这些region的读写请求,并和HDFS进行交互(Hlog的写入,HFile的读写)。
- 3. 负责切分在运行过程中逐渐变大的Region。
5. HLog :
- 1. 对HBase的操作进行记录,使用WAL写数据,优先写入Hlog.
比如:put操作时,先写日志再写memstore,这样可以防止数据丢失,即使丢失也可以回滚。
6. HRegion :
- 1. HBase中分布式存储和负载均衡的最小单元,它是表或者表的一部分。
7. Store :
- 1. 相当于一个列簇
8. Memstore :
- 1. 内存缓冲区,用于将数据批量刷新到hdfs中,默认大小为128M
9. HStoreFile :
- 1. 和HFile概念一样,不过是一个逻辑概念。HBase中的数据是以HFile存储在Hdfs上。
3.2 组件关系:
[图片上传失败...(image-678e6d-1576580797398)][图片上传失败...(image-ed6d79-1576580805101)]
005.pnghmaster:hregionserver=1:*
hregionserver:hregion=1:*
hregionserver:hlog=1:1
hregion:hstore=1:*
store:memstore=1:1
store:storefile=1:*
storefile:hfile=1:1
3.3 总结
rowkey:行键,和mysql的主键同理,不允许重复。
columnfamily: 列簇,列的集合之意。
column:列
timestamp:时间戳,默认显示最新的时间戳,可用于控制k对应的多个版本值,默认查最新的数据
versions':版本号,表示记录数据的版本数量
cell:单元格,kv就是cell
模式:无
数据类型:只存储byte[]
多版本:每个key值都可以有多个版本
列式存储:一个列簇存储到一个目录
稀疏存储:如果一个kv为null,不占用存储空间
第五节:hbase的环境搭建
4.3 完全分布式
4.3.1 环境准备
- jdk 1.7+
- hadoop-2.7.6
- zookeeper-3.4.6
- hbase-1.2.1.bin.tar.gz
说明:
1. HDFS集群需要提前搭建成功,
2. Zookeeper集群需要提前搭建成功。
4.3.2 进程布局
- master04: hmaster regionserver zookeeper
- worker1: backup hmaster resionserver zookeeper
- worker2: regionserver zookeeper
4.3.3 安装步骤
1) 配置hbase的环境变量
[root@master04 software]$ tar -zxvf hbase-1.2.1-bin.tar.gz -C /opt/apps/
[root@master04 software]$ cd /opt/apps/
[root@master04 apps]$ mv hbase-1.2.1 hbase
[root@master04 apps]$ vi ~/.bash_profile
.......省略.......
#hbase environment
export HBASE_HOME=/opt/apps/hbase
export PATH=$HBASE_HOME/bin:$PATH
[root@master04 apps]$ source ~/.bash_profile
[root@master04 apps]$ hbase version
2)配置ssh无密码登陆(一般情况下,都在搭建HDFS时,完成)
3)配置时间同步(<font color='red'>非常重要</font>,也应该在搭建HDFS时,完成,时间差不能超过30s)
4)确认hbase-env.sh禁用内置的zookeeper
[root@master04 apps]$ vi $HBASE_HOME/conf/hbase-env.sh
#找到下面内容,解开注释,添加具体路径
# The java implementation to use. Java 1.7+ required.
export JAVA_HOME=/opt/apps/jdk
# Tell HBase whether it should manage it's own instance of Zookeeper or not.
export HBASE_MANAGES_ZK=false #禁止内置zookeeper
5)修改hbase-site.xml
[root@master04 apps]$ vi $HBASE_HOME/conf/hbase-site.sh
<configuration>
<!-- 修改hbase的存储路径为HDFS内-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://master04:8020/hbase</value>
</property>
<!-- 开启用hbase集群模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定hbase使用的zookeeper集群 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master04:2181,worker1:2181,worker2:2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/apps/zookeeper/zkData</value>
</property>
</configuration>
6)配置regionserver所在的节点信息
[root@master04 apps]$ vi $HBASE_HOME/conf/regionservers
删除localhost
添加:
master04
worker1
worker2
7)配置备份hmaster: 创建backup-masters文件
[root@master04 apps]$ cd $HBASE_HOME/conf/
[root@master04 conf]$ echo "worker1">> backup-masters
8)将hadoop的core-site.xml和hdfs-site.xml放入conf目录内
[root@master04 apps]$ cd $HADOOP_HOME/etc/hadoop/
[root@master04 hadoop]$ cp core-site.xml hdfs-site.xml $HBASE_HOME/conf/
9)将hbase分发到集群其他相关节点上
[root@master04 apps]$ scp -r /opt/apps/hbase worker1:/opt/apps/
[root@master04 apps]$ scp -r /opt/apps/hbase worker2:/opt/apps/
[root@master04 apps]$ scp ~/.bash_profile worker1:~/
[root@master04 apps]$ scp ~/.bash_profile worker2:~/
说明:
检查各个节点hbase的软链接情况
检查各个节点的环境变量配置情况
10)启动集群
1. 启动zookeeper集群
2. 启动hdfs集群
3. 启动hbase服务
说明: start-hbase.sh脚本开启进程的顺序
- 1. 主节点上的hmaster
- 2. regionserver
- 3. 备份hmaster
11)<font color='red'>查看webui页面</font>
http://ip:16010
12)<font color='red'>查看zookeeper</font>
第五节:hbase shell命令
5.1 可以查看命令组,或者是命令的帮助信息
hbase(main):000:0> help
hbase(main):000:0> help 'command group'
hbase(main):000:0> help 'command'
5.2 namespace的操作
1) list_namespace:查询所有命名空间
hbase(main):020:0> list_namespace
2) list_namespace_tables: 查询指定命名空间的表
hbase(main):022:0> list_namespace_tables 'myns'
3) create_namespace: 创建指定的命名空间
hbase(main):023:0> create_namespace 'myns'
hbase(main):024:0> list_namespace
4)describe_namespace: 查询指定命名空间的描述信息(也叫结构信息,属性信息)
hbase(main):025:0> describe_namespace 'ns4'
5) alter_namespace :修改命名空间的描述信息
添加描述信息
hbase(main):026:0> alter_namespace 'ns4', {METHOD => 'set', 'name' => 'michael'}
hbase(main):027:0> describe_namespace 'ns4'
删除描述信息
hbase(main):028:0> alter_namespace 'ns4', {METHOD => 'unset', NAME => 'name'}
hbase(main):029:0> describe_namespace 'ns4'
6) drop_namespace:删除指定命名空间
hbase(main):030:0> drop_namespace 'ns4'
hbase(main):031:0> list_namespace
5.3 Table的DDL操作
1) 建表:必须至少指定一个列族名
- 直接创建
hbase(main):034:0> create 'ns3:emp','base_info'
- 使用变量
hbase(main):036:0> t = create 'ns3:employee','base_info'
- 创建多个列族名
hbase(main):040:0> create 'ns3:emp1','f1','f2','f3'
- 创建表时同时指定列族属性
hbase(main):043:0> create 'ns3:emp2',
{NAME=>'f1',VERSIONS=>3,TTL=>2592000,BLOCKCACHE=>TRUE}
- 创建表同时指定分片
hbase(main):050:0> create 'ns3:emp3', 'f1', SPLITS => ['10', '20', '30', '40']
2)查看表属性信息
hbase(main):051:0> describe 'ns3:emp1'
3) 列出所有的表
hbase(main):052:0> list
4) 修改表属性
hbase(main):062:0> alter 'ns3:emp3',{NAME=>'f1',BLOOMFILTER=>'rowcol',VERSIONS=>5,TTL=>2592000}
hbase(main):063:0> describe 'ns3:emp3'
5) 追加列族:
- 方式1
hbase(main):064:0> alter 'ns3:emp3',{NAME=>'f2'}
- 方式2
hbase(main):066:0> alter 'ns3:emp3','f3'
- 方式3:
hbase(main):070:0> alter 'ns3:emp3','f5','f6'
6) 删除列族
hbase(main):075:0> alter 'ns3:emp3','delete'=>'f6'
7) 删除表
先禁用,再删除
hbase(main):076:0> disable 'ns3:emp3'
hbase(main):078:0> drop 'ns3:emp3'
5.4 Table的DQL操作
1) 插入数据:put只能插入一个单元格
指定 表名、行键、列名、列值、[时间戳]
hbase(main):081:0> put 'ns3:emp','rk0001','base_info:name','smith'
hbase(main):084:0> put 'ns3:emp','rk0001','base_info:empno','7369',1990000000
2) 使用scan查询数据
1. 浏览表所有数据:已经排过序,先按rowkey,再按列族名、然后按列名
hbase(main):085:0> scan 'ns3:emp'
2. 指定版本数量进行浏览
hbase(main):110:0> scan 'ns3:emp',{VERSIONS=>3}
hbase(main):110:0> scan 'ns3:emp',VERSIONS=>3
3. 指定列进行浏览
hbase(main):122:0> scan 'ns3:emp',{COLUMNS=>'base_info:empno'}
scan 'ns3:emp',{COLUMNS=>['base_info:empno','extra_info:province']}
4. 限定行范围进行浏览(分页查询)
hbase(main):137:0> scan 'ns3:emp',
{COLUMNS=>'base_info:empno',LIMIT=>5,STARTROW=>'rk0001'}
hbase(main):136:0> scan 'ns3:emp',{LIMIT=>5,STARTROW=>'rk0001'}
3) 使用get进行指定行浏览该行内的数据
1. 查询指定行 hbase(main):140:0> get 'ns3:emp','rk0001'
2. 查询指定行中的列
hbase(main):155:0> get 'ns3:emp','rk0001','base_info:empno'
hbase(main):155:0> get 'ns3:emp','rk0001',{COLUMN=>'base_info:empno'}
hbase(main):157:0> get 'ns3:emp','rk0001','base_info:name','extra_info:province'
hbase(main):145:0> get 'ns3:emp','rk0001',{COLUMN=>
['base_info:empno','extra_info:province']}
3. 指定版本号
hbase(main):146:0> get 'ns3:emp','rk0001',{COLUMN=>['base_info:empno','extra_info:province'],VERSIONS=>3}
4. 指定时间戳的范围
hbase(main):152:0> get 'ns3:emp','rk0001',{TIMERANGE=>[1568619337238,1568619348753]}
4) 更新数据
1. 使用put
hbase(main):159:0> put 'ns3:emp','rk0001','base_info:name','smith'
2. 使用incr,进行自动赋值
incr 'ns3:emp','rk0001','base_info:age'
5) 删除数据:
1. 删除某行内的指定key-value对
hbase(main):001:0> delete 'ns3:emp','rk0001','base_info:name'
2. 删除指定版本号的单元格
hbase(main):008:0> delete 'ns3:emp','rk0001','base_info:empno',1568619337238
3. 删除指定行
hbase(main):011:0> deleteall 'ns3:emp','rk0008'
6) 判断表是否存储
hbase(main):013:0> exists 'ns3:emp'
7) 禁用表和启用表
hbase(main):014:0> disable 'ns3:emp'
hbase(main):016:0> enable 'ns3:emp'
8) 统计表行数
hbase(main):018:0> count 'ns3:emp'
9) 清空表数据
hbase(main):019:0> truncate 'ns3:emp'