HBase

前言

学习HBase

  • HBase基础知识
  • HBase分布式搭建
  • HBase Shell
  • HBase的批量导入
  • HBase的Java API

简介
高可靠、高性能、面向列、可伸缩的分布式存储系统。HBase利用HDFS作为底层的文件系统,利用MapReduce来处理数据,Zookeeper为协调工具

逻辑视图如下图所示:

hadoop_010

数据模型,行

  • 每行有可排序关键字和任意列
  • 字符串、二进制串都可以作为行键
  • 表按照行键有序处理
  • 可以只对一行上锁,对行的写操作是原子的

数据模型,列

  • 列族,定义为“族:标签”
  • 数据通过时间戳分版本
  • 列族在建表后不能改变,但是一个列族中列标签可以任意增加

系统总体结构图

hadoop_011

  • 主从结构
  • 可以有多个Master,但Zookeeper的选举机制保证有一个Master运行
  • HBase建立在HDFS之上

安装HBase

下载,http://mirrors.hust.edu.cn/apache/hbase/2.1.1/hbase-2.1.1-bin.tar.gz

复制到虚拟机,解压安装包

1
tar -zxvf hbase-2.1.1-bin.tar.gz

配置环境变量

vim /etc/profile

1
2
3
# hbase
export HBASE_HOME=/hadoop/hbase-2.1.1
export PATH=$PATH:$HBASE_HOME/bin

source /etc/profile

vim hbase-env.sh

1
2
3
export JAVA_HOME=/usr/java/jdk1.8.0_171
# 设置由hbase自己管理zookeeper,不需要安装单独的zookeeper
export HBASE_MANAGES_ZK=true

vim hbase-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop01:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>hadoop01</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01,hadoop02</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

vim regionservers

1
hadoop02

拷贝已经配置好的机器

1
scp -r /hadoop/hbase-2.1.1 hadoop02:/hadoop/

拷贝前可以删除HBASE_HOME下的docs目录

拷贝完后在hadoop02上配置一下环境变量

启动HBase

进入bin目录下

1
./start-hbase.sh

启动完成,查看HDFS下是否有hbase目录,发现没有,启动失败

查看错误

进入logs目录,查看文件hbase-root-master-hadoop01,发现错误

1
2
3
4
5
java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:644)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:628)
at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)

解决

百度了一下,拷贝一下jar包

1
cp /hadoop/hbase-2.1.1/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar /hadoop/hbase-2.1.1/lib/

两个节点都执行这个命令,重新启动,OK,hbase目录有了

查看进程

master

1
2
3
4
5
6
7
8
7072 ResourceManager
16817 HRegionServer
6837 SecondaryNameNode
6358 NameNode
30118 Jps
25755 HQuorumPeer
28187 HMaster
30015 HBaseConfTool

slave

1
2
3
4
5
7314 NodeManager
22612 HQuorumPeer
16362 HRegionServer
6858 DataNode
26079 Jps

一切正常

Hbase Shell

提供了基本的增删改查,如下图所示:

hadoop_012

基本增删改查

创建表,列出所有的表

1
2
3
4
5
6
7
8
9
10
hbase(main):002:0> create 'user','user_id','address','info'
Created table user
Took 25.6470 seconds
=> Hbase::Table - user
hbase(main):003:0> list
TABLE
user
1 row(s)
Took 0.2597 seconds
=> ["user"]

得到表的信息

1
describe 'user'

删除表

1
2
disable 'user',或者
drop 'user'

添加信息,在一个列族上可以无限扩展

1
2
3
4
hbase(main):005:0> put 'user','xiaoming','info:age','24'
Took 2.7663 seconds
hbase(main):006:0> put 'user','xiaoming','info:company','alibaba'
Took 0.0777 seconds

获取一条记录

1
2
3
4
5
6
//获取一个ID下所有数据
get 'user','xiaoming'
//获取一个列族
get 'user','xiaoming','info'
//获取一个列
get 'user','xiaoming','info:age'

更新记录,和put一个记录一样

1
2
3
4
put 'user','xiaoming','info:age' ,'29'
get 'user','xiaoming','info:age'
put 'user','xiaoming','info:age' ,'30'
get 'user','xiaoming','info:age'

被覆盖的数据也能查到

1
2
3
get 'user','xiaoming',{COLUMN=>'info:age',VERSIONS=>1}
get 'user','xiaoming',{COLUMN=>'info:age',VERSIONS=>2}
get 'user','xiaoming',{COLUMN=>'info:age',VERSIONS=>3}

获取某个时间戳下的数据

1
get 'user','xiaoming',{COLUMN=>'info:age',TIMESTAMP=>1364874937056}

全表扫描

1
scan 'user'

删除列

1
2
delete 'user','xiaoming','info:age'
get 'user','xiaoming'

删除整行

1
deleteall 'user','xiaoming'

统计表的行数

1
count 'user'

清空表

1
truncate 'user'

Java API

导入hbase-client包,函数有点过时了