1、HBase简介
HBase – HadoopDatabase,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协调工具。
hbase是bigtable的开源山寨版本。是建立的hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。
它介于nosql和RDBMS之间,仅能通过主键(rowkey)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。主要用来存储非结构化和半结构化的松散数据。
与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
2、HBase中的表一般有这样的特点:
- 大:一个表可以有上亿行,上百万列
- 面向列:面向列(族)的存储和权限控制,列(族)独立检索。
- 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
3、Hbase在Hadoop Ecosystem中的位置。
4、HBase的特点
表(table)——用于存储数据的,数据也是存放在表中的。 行(row)——嵌套的说法。 行键(row key)——类似于主键,也是用于区分每一行的。 列簇(column family)——列的集合 列(column)——相当于RDBMS中的字段 单元格(cell)——单元格用于存储数据的,存储的事多份,按时间戳来区分 多个版本的数据——带有时间戳的数据,默认取最新的数值
hbase中的数据都是字节数组存储的,所以比较时按照一个个字节比较。 hbase中的记录是按照rowkey排序存储的。 hbase中的列簇根据大小划分为很多的region,不同的region可以存储在不同的region服务器(regionServer)中。那么,海量数据的查询就可以转换为并行查询了。 每个region中存放的数据范围[startkey,stopkey]
预分区操作指的是在建表的时候,预先划分成指定数量的region,插入数据时均匀的分散到不同的region中。
在hbase中,有一张表叫做.META.,里面存储的是用户表的regionserver与rowkey的映射关系。 在hbase中,有一张表叫做-ROOT-,里面存储的是.META.的rowkey与regionserver的映射关系。
读取流程图:
表示hbase某张表中的一行记录,看rowkey确定一行记录。 行中有很多列。这些列分到很多列簇中存储。 每一个列簇是一个独立的存储文件。 |
5、常见问题
问:为什么一行记录含有多个时间戳的值? 答:因为这样能够体现聚合的思想,实际上体现了RDBMS中的一对多问题。
问:为什么一行记录按照列簇分成独立的物理文件存储,而不是一行记录全部放到一起存储? 答:因为查询时,一行记录并不是全部字段都需要,只需要一部分字段。如果一行记录所有字段的值放在一起的话,那么一次性读取所有字段,显然很浪费。分别存储的话, 一次查询只需要少量字段,那么整体的查询吞吐量就会提高。
问:建立索引时为什么key是regionserver,value是rowkey;而不是相反的哪? 答:因为rowkey的数量太大了,按照上面的方式建立索引的话,映射数据量就太大。
问:设计rowkey是hbase表设计中的重点? 答:(1)因为hbase查询默认是按照rowkey查询的,因此业务上最需要的查询条件应该设计到rowkey的组成中 (2)因为hbase表分区的话,那么再插入数据的时候容易产生热点。为了避免热点,插入数据应该尽可能随机,需要注意rowkey的设计,最好是rowkey的开始节点都是随机的或者接近随机的。
|
6、集群搭建(查看端口60010)
hbase的集群搭建过程: ********************注意:(1)hadoop必须启动,并且可以写入文件(2)zookeeper必须在各个节点启动成功**************************** 1.确定集群结构,以hadoop0作为主节点,hadoop1和hadoop2作为从节点 2.在hadoop0、hadoop1、hadoop2上分别启动ZooKeeper,命令是zkServer.sh start 3.在hadoop0的现有的伪分布配置上做修改 修改/etc/profile文件。 #vi /etc/profile 增加 export HBASE_HOME=/home/hbase 修改 export PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:$HBASE_HOME/bin 保存退出 #source /etc/profile 3.1 修改conf/hbase-env.sh,修改 export JAVA_HOME=/usr/local/jdk export HBASE_MANAGES_ZK=false 3.2 修改conf/hbase-site.xml,修改hbase.zookeeper.quorum的值改为hadoop0,hadoop1,hadoop2 修改$HBASE_HOME/conf/hbase-site.xml <property> <name>hbase.rootdir</name> <value>hdfs://hadoop0:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop0</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> 注意:$HBASE_HOME/conf/hbase-site.xml的hbase.rootdir的主机和端口号与$HADOOP_HOME/conf/core-site.xml的fs.default.name的主机和端口号一致 3.3 修改conf/regionservers,修改内容为hadoop1、hadoop2(每个一行) 4.把hbase文件夹复制到hadoop1、hadoop2的对应目录下,执行命令 scp -r /usr/local/hbase hadoop1:/usr/local scp -r /usr/local/hbase hadoop2:/usr/local 5.把hadoop0上的/etc/profile复制到其他节点,然后在其他节点执行source /etc/profile 6.首先关闭伪分布,执行命令stop-hbase.sh 7.在hadoop0上执行命令start-hbase.sh,启动集群
list,查看表
实时数据库openTSDB |
|