3.png
HBase可以被看做一个主-从架构的数据库
- ** Master **:为HBase的主节点,用来协调客户端应用程序和RegionServer的关系,监控和记录数据库表的元数据的变化。一般来讲一个集群中有多个Master,而且一般和Hadoop中的NameNode运行同一主机上。
- ** RegionServer **:为HBase的从节点,用region的形式存储实际的表。region是HBase表的基础单元。一般和Hadoop中的DataNode运行在同一主机上。
- ** ZooKeeper **:用来选举集群主节点Master,维持只有一个master提供访问和运行,同时存储集群的元数据。
HBase的数据存储模型
2.png
** 行健(rowkey) **:是HBase表中每个记录的主键,可以提高查找 功能的速度。
** 列簇(column family) **:是一个字符串名称,包含一个或者多个列,这样做也是为了提高检索速度(检索所需的列的时间更快)。
** 列 **:列一定属于某一个列簇。
** 版本(version) **:一个单元格可以保存多个值,一个version代表着一个单元格可以同时存储几个值。
** 时间戳(timestamp) **:对于每条插入的数据,当前的时间戳与值是相关的,它表示了数值插入到这个单元格中的时间。
** 单元格 :最小的存储单元,是一行的一个列中的实际值, 值都是用字节数组存储的 **
** namespace **:hbase中数据库的概念,表名对应有一个namespace
综上所述,插入一个单元格数据必须包含
** rowkey+columnfamily(列簇名)+columname(列名)+timestamp:value **
其中rowkey+列簇名+列名 确定一个单元格;
rowkey+列簇名+列名+timestamp 确定一个单元格中的一个值。
安装部署伪分布式HBase
-
启动hadoop
3.png -
启动zookeeper
4.png -
下载解压hbase
5.png - 修改配置文件
- hbase-env.sh文件
export JAVA_HOME=/opt/modules/jdk1.7.0_67
# Tell HBase whether it should manage it's own instance of Zookeeper or not.
export HBASE_MANAGES_ZK=false
- hbase-site.xml文件
<property >
<!-- hbase临时存储数据的目录 -->
<name>hbase.tmp.dir</name>
<value>/opt/modules/hbase-0.98.6-hadoop2/datas</value>
</property>
<property >
<!-- hbase在hdfs存储表的根目录 -->
<name>hbase.rootdir</name>
<value>hdfs://bigdata-00:8020/hbase</value>
</property>
<property >
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<!-- 配置zookeeper节点的位置 -->
<name>hbase.zookeeper.quorum</name>
<value>bigdata-00</value>
</property>
- 启动hbase
$ bin/hbase-daemon.sh start master
$ bin/hbase-daemon.sh start regionserver
6.png
登陆web界面查看(bigdata-00:60010)
7.png
HBase中shell的基本使用
进入hbase命令行bin/hbase shell
list_namespace
查看有哪些namespace
8.png
create_namespace 'test'
创建一个namespace,后面接namespace名describe_namespace 'test'
描述一个namespace9.png
drop_namespace 'test'
删除一个namespacelist
查看有哪些表create 'ns:表名','列簇名'
describe 'ns:表名'
显示表的详细信息10.png
drop 'ns:tbname'
删除一个表put 'ns:tbname','行键','列簇:列名','值'
插入一个数据get 'ns:tbname','行键','列簇','列'
获取一个单元格的数据,如果不加后面的列簇和列,即为获取一行的数据。scan 'ns:tbname'
查看一个表的所有数据11.png
scan 'nstest:tb1',{STARTROW => '20161119_10001',STOPROW => '20161119_10003'}
scan+过滤条件查询数据delete 'ns:tbname','键值','列簇:列名'
删除一个值
HBase表的物理模型
HBase在实际的存储中,每个列簇存储在单独的一个HDFS上。表格中的行都是按照RowKey字典序列进行排序的,并且表格在行的方向上被分割为多个Region。如下图:
12.png
如下图,表A按照行被分为相等大小的4个Region,这些Region分别被RegionServer管理,但是每个RegionServer可以管理不同表格中的Region。为了负载尽量相同,每个RegionServer管理的Region数据基本上是相同的。
13.png
15.png
Region是按照大小进行分割的,每个表最开始只有一个Region,随着数据增多,Region不断增大,当增大到一个阈值的时候,Region就会等分成两个新的Region,之后的过程也同样,随着数据量的增加,不断分割Region。
14.png
Region虽然是分布式存储的最小单元,但不是存储的最小单元
- 一个Region由一个或多个Store组成,每个Store保存一个列簇
- 每个Store又由一个memStore和0到多个StoreFile
- memStore存储在内存中,StoreFile存储在HDFS中
- memStore是内存中的写入缓冲区,HBase写入数据到硬盘之前是将数据累积在memStore中,当这个内存缓冲区写满后将数据写到StoreFiel上。
-
每个Region包含一个HLOG,它是预写式日志WAL,但存储数据的时候只有当把数据写入到WAL和每个Store中的memStore才算成功,这样可以保证数据的安全性。
16.png