一、HBase的启动
由上一篇可知,HBase是建立在Hadoop HDFS之上的,因此在启动HBase之前要确保已经启动了Hadoop,启动Hadoop的命令是:start-all.sh
。在hadoop2.x中,启动hadoop推荐使用start-hdfs.sh
和start-yarn.sh
两个命令来代替start-all.sh。hadoop集群启动后,启动HBase使用命令:start-hbase.sh
。
我这里配置的是完全分布模式,一台机器作为NameNode和HMaster,另外两台作为DataNode和HRegionServer。Hadoop和HBase启动完毕后,通过jps
命令查看结果如下:
机器一:
机器二:
机器三:
通过访问页面:http://192.168.2.120:60010/master-status可以看到HBase集群的相关情况。
可能会遇到的问题
有时候,我们启动Hadoop和Hbase后,访问Hadoop集群的web端口页面可以显示,但是访问HBase的web页面时却显示不出来。这时候再使用jps命令查看发现HMaster这个HBase主进程自动退出了。我们可以通过查看HBase的log日志来定位问题,对于我的情况来说,是因为三台虚拟机的物理时间不一致导致的,通过在三台虚拟机上执行命令:ntpdate time.nist.gov
来同步时间,然后执行命令stop-hbase.sh
,再执行start-habse.sh
就行了。
二、HBase Shell的相关操作。
1、进入Hbase shell
通过运行命令hbase shell
来进入:
首先需要注意,在hbase shell中使用回退键是无效的,如果输错信息要回退,请按住ctrl键再按回退键。
2、列出所有表
通过list
命令得出:
可以看到这里已经有一张“users”的表,这是我之前自主创建的,如果第一次执行HBase,list结果肯定是空。
3、删除表
在HBase中删除表需要两步,首先disable,其次drop
4、创建表:
这里创建了一张表users,有三个列族user_id,address,info
create 'users','user_id','address','info'
5、获取表的具体描述:
通过命令describe 'users'
即可。
6、增删改查
- 增加记录:put
put 'users','xiaoming','info:age','24'
这个命令的意思就是向表users
的行xiaoming
、列info:age
添加数据24
。同理依次执行如下语句:
put 'users','xiaoming','info:birthday','1987-06-17'
put 'users','xiaoming','info:company','alibaba'
put 'users','xiaoming','address:contry','china'
put 'users','xiaoming','address:province','zhejiang'
put 'users','xiaoming','address:city','hangzhou'
- 扫描users表的所有记录:scan
通过命令scan ‘users’即可。
- 获取一条记录
①取得一个id(row_key)的所有数据
get 'users','xiaoming'
②获取一个id的一个列族的所有数据
get 'users','xiaoming','info'
③获取一个id,一个列族中一个列的所有数据
get 'users','xiaoming','info:age'
- 更新一条记录:put
更新users表中小明的年龄为29
put 'users','xiaoming','info:age' ,'29'
- 删除记录:delete与deleteall
①删除xiaoming的值的’info:age’字段
delete 'users','xiaoming','info:age'
②删除xiaoming的整行信息
deleteall 'users','xiaoming'
- 其他几个比较有用的命令
count:统计行数
count 'users'
当前users表中只有xiaoming一行数据。
truncate:清空指定表
`truncate 'users'
这个操作实际上是先删除表,然后又创建了一张相同的表。
三、HBase的JavaAPI详解
1、JavaAPI和HBase数据模型之间的关系
2、HBaseConfiguration
该类主要对HBase进行配置。主要方法如下:
示例:
Configuration conf = HBaseConfiguration.create();
该方法用HBase的默认资源来创建Configuration,它默认会加载classpath下的habse-site.xml来初始化Configuration。
3、HBaseAdmin
该类主要提供一个接口来管理HBase数据库的表信息,包括方法如下:
使用示例:
HBaseAdmin admin = new HBaseAdmin(conf);
admin.disableTable(tableName);
admin.deleteTable(tableName);
4、HTableDescriptor
该类包含了表的名字即对应表的列族,主要方法如下:
示例:
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
for (int i = 0; i < familys.length; i++) {
tableDesc.addFamily(new HColumnDescriptor(familys[i]));
}
5、HColumnDescriptor
该类主要用于维护关于列族的信息例如版本号,压缩设置等。通常在创建表或为表添加列族时使用。主要方法如下:
示例:
HTableDescriptor tableDesc = new HTableDescriptor(tableName);
for (int i = 0; i < familys.length; i++) {
tableDesc.addFamily(new HColumnDescriptor(familys[i]));
}
6、HTable
该类主要用于和HBase的表进行通信,对更新操作来说是非线程安全的。在多线程操作的环境下,建议使用HTablePool类进行操作。主要方法如下:
示例:
HTable table = new HTable(conf, tableName);
Scan s = new Scan();
ResultScanner ss = table.getScanner(s);
7、Put
该类主要对单个行执行添加或者更新操作。主要方法如下:
示例:
HTable table = new HTable(conf, tableName);
Put put = new Put(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(family), Bytes.toBytes(qualifier), Bytes.toBytes(value));
table.put(put);
8、Get
该类主要用于获取单个行的相关信息。主要方法如下:
示例:
HTable table = new HTable(conf, tableName);
Get get = new Get(rowKey.getBytes());
Result rs = table.