1.HBase是什么?
hbase是一种Nosql的分布式数据存储系统。具有可靠性,高能性,列存储,可伸缩的征,可以对大型数据进行实时、随机的读写访问。
2.应用场景
3.Hbase的注意事项:
4.HBase中表的特点
1.大 :
2.面向列:通过列进行检索
3.稀疏:空的(null)的数据所在的列,不占存储空间
4.无模式:包含的列的个数可以不一致,也可以不确定,可以随机指定
5.HBase表的结构(相当于四维表,row key 和family对应的数据是一个二维表(列和记录))
1)行键:就是用来访问HBase中的行 ,相当于Sql中的主键。 Hbase会对表中的数据按照行键进行排序(字典顺序)。
2)列簇:就是一组列的集合,在建表的时候指定
region:是hbase对表进行切割的单位。
hmaster:是hbase功能上的主节点,不是状态的主节点,如果master宕机,增删改不能用,查询可以使用。在region进行切分的时候负责负载均衡
regionserver:hbase中真正负责管理region的服务器。
zookeeper:负责集群节点之间的上下线感知
HDFS:存储hbase的表。
1.基本套路
/**
* 这是hbase的java api的第一个代码
* @throws IOException
* */
public static void main(String[] args) throws IOException {
/*
* 获取一个配置对象
*
* 要点:获取配置信息之后,就一定要告诉这个配置对象,说接下来要创建的连接是哪个hbase集群的连接
*
* */
Configuration config = HBaseConfiguration.create();
config.set("hbase.zookeeper.quorum", "qyl01:2181,qyl02:2181,qyl03:2181");
/**
* 通过配置对象创建连接
* */
Connection connection = ConnectionFactory.createConnection(config);
/**
* 通过连接获取管理员对象
* */
Admin admin=connection.getAdmin();
/**
* 通过管理员对象就可以对表进行各种操作
* */
HTableDescriptor[] listTables = admin.listTables();
/**
* 针对结果进行处理
* */
for(HTableDescriptor list:listTables){
System.out.println(list.getNameAsString());
}
connection.close();
}
2.数据的导入和导出
1)hbase数据写入hdfs形成一个结构化的二维表
思路:(用scan)
用TableMaprReduceUtill类的initTableMapperJob方法获取habse表中的每一行的result(通过scan查询),
将其结果作为Map中的value值,然后用Cell接收,通过CellUtil中的方法获取每一行的rowkey和family等,写入到hdfs中(整个过程不需要reduce的参与)
2)将hdfs上的数据转成hbase(用put)
思路:map方法获取表的数据
reduce将表中的数据以表中的第一个字段为rowkey,其余字段为列,写入到一个hbase表特定的列簇中.
3)mysql 数据导入到 hbase
jdbc:mysql://hadoop01/mytest
--username root
--password root
--table student
--hbase-table studenttest1
--column-family name
--hbase-row-key id
4)hbase 数据导入到 mysql(没有直接的命令)
可以把hbase的数据导入到hdfs中,然后再导入到mysql中。
5)HBase整合hive
create external table mingxing(rowkey string, base_info map, extra_info
map)
创建的字段类型为map类型
select * from mingxing;
select rowkey,base_info['name'] from mingxing;
select rowkey,extra_info['province'] from mingxing;
select rowkey,base_info['name'], extra_info['province'] from mingxing;
各个组件的职责:
Client的职责:
Zookeeper职责:
Master的职责:
RegionServer职责:
2、物理架构
StoreFile和Hfile结构
StoreFile 以 HFile 格式保存在 HDFS 上,请看下图 HFile 的数据组织格式:
HFile 分为六个部分:
Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后,DataBlockIndex会被读取到内存中,这样,当检索某个 key 时,不需要扫描整个 HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个block读取到内存中,再找到需要的key。DataBlockIndex 采用 LRU 机制淘汰。
HFile 的 Data Block,Meta Block 通常采用压缩方式存储,压缩之后可以大大减少网络 IO 和磁盘 IO,随之而来的开销当然是需要花费 cpu 进行压缩和解压缩。
目标 Hfile 的压缩支持两种方式:Gzip,LZO。
.1、建表高级属性
下面几个 shell 命令在 HBase 操作中可以起到很到的作用,且主要体现在建表的过程中,看
下面几个 create 属性
1、 BLOOMFILTER(布隆过滤器)
2、 VERSIONS(版本号)
3、 COMPRESSION(压缩)
默认不使用压缩,建议采用SNAPP压缩算法
设置:create ‘table’,{NAME=>‘info’,COMPRESSION=>‘SNAPPY’}
2、表设计
1、列簇设计
追求的原则是:在合理范围内能尽量少的减少列簇就尽量减少列簇。
最优设计是:将所有相关性很强的 key-value 都放在同一个列簇下,这样既能做到查询效率最高,也能保持尽可能少的访问不同的磁盘文件
2、RowKey 设计
HBase 中,表会被划分为 1…n 个 Region,被托管在 RegionServer 中。Region 二个重要的
属性:StartKey 与 EndKey 表示这个 Region 维护的 rowKey 范围,当我们要读/写数据时,如果 rowKey 落在某个 start-end key 范围内,那么就会定位到目标 region 并且读/写到相关的数据
RowKey设计的三原则
一、 rowkey 长度原则
原因如下:
二、rowkey 散列原则
三、 rowkey 唯一原则