一、什么是Hbase?
HBase 是一种列式的分布式数据库,是一种类似于数据库的存储层,适用于结构化和非结构化的存储,其底层依旧依赖 HDFS 来作为其物理存储。
二、什么是列式存储?列式存储有哪些优势?
每一列单独存放,数据即是索引。适合关注的不是整张表,而是某些字段。每一列单独存放,数据即是索引。只访问涉及得列,如果我们想访问单独一列(比如NAME)会相当迅速。
三、rowkey
rowkey是行的主键,Hbase支持3种检索方式:
(1) 通过单个Rowkey访问,即按照某个Rowkey键值进行get操作,这样获取唯一一条记录;
(2) 通过Rowkey的range进行scan,即通过设置startRowKey和endRowKey,在这个范围内进行扫描。这样可以按指定的条件获取一批记录;
(3) 全表扫描,即直接扫描整张表中所有行记录。
rowkey的设计原则:
长度原则:实际应用中越短越好,不要超过16个字节,以 byte[] 形式保存,一般设计成定长。
散列原则:如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。
唯一性原则:保证每个rowkey是惟一的
四、列族(column family):
hbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如courses:history , courses:math 都属于 courses 这个列族。访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能 帮助我们管理不同类型的应用。
五、Region
Region是HBase数据管理的基本单位。数据的move,数据的balance,数据的split,都是按照region来进行操作的。
六、Hbase Shell
创建表:create '表名称', '列族名'
hbase(main):009:0> create 't1','f1'
添加记录:put '表名称', '行名称', '列名称:', '值'
hbase(main):010:0> put 't1','row1001','f1:name','dongjie'
查看记录:get '表名称', '行名称'
查看表中的记录总数:count '表名称'删除记录:delete '表名' ,'行名称' , '列名称'
删除一张表:先要屏蔽该表,才能对该表进行删除,第一步 disable '表名称' 第二步 drop '表名称'
查看所有记录:scan "表名称"
查看某个表某个列中所有数据:scan "表名称" , ['列名称:']
更新记录:就是重写一遍进行覆盖
七、Hive与Hbase整合(只讲原理)
为什么Hive要与Hbase整合呢?因为Hbase不支持标准SQL查询,但是Hive支持。Hive查询速度慢,每次都要转化成MapReduce,性能较差。整合后Hive中创建的表能直接存储到Hbase,更新,插入等操作直接在Hbase中体现。
在Hive与Hbase整合的过程中,核心的步骤就是通过Hive绑定Hbase中的table表,绑定完之后,我们就可以通过Hive这个客户端工具对Hbase中的表进行查询了,那么如何进行绑定呢?—-关键在于Hbase中的table如何和hive中建立的table在column级别上建立映射关系。
create external table hivetable(rowkey string, column1 string, column2 string,column3 string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping"=":key,columnfamily1:column1, columnfamily1:column2,columnfamily2:column3")
tblproperties("hbase.table.name"="hbasetable");
上面这个建表语句表示在Hive中建立一个外部表—名字叫做hivetable,与其在Hbase中建立映射关系的表名字为hbasetable,映射关系如下:
hivetable —————————————hbasetable
rowkey<—————>key (Hive中的rowkey字段关联到Hbase中的行健key)
column1<————–>columnfamily1:column1 (hivetable中的column1映射到hbasetable中columnfamily1上的column1字段)
column2<————–>columnfamily1:column2 (hivetable中的column2映射到hbasetable中columnfamily1上的column2字段)
column3<————–>columnfamily2:column3 (hivetable中的column3映射到hbasetable中columnfamily2上的column3字段)
stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’ 的含义是:Hive与Hbase整合功能(互相通信)的实现主要是通过hive_hbase-handler.jar这个工具类来完成的,而语法中的HBaseStorageHandler指的就是这个工具类。