HBase这篇文档是按照学习过程总结的是简易版大纲,其中包含的知识点是需要时间和耐心详细琢磨的。
Hbase:
Apache HBase是一个开源的,分布式的,版本化的非关系数据库,来自谷歌的bigtable,
目标:托管非常大的表 - 数十亿行X百万列 - 在商品硬件集群上
11.7
hbase:
传统数据库
非关系型数据库
hbase权威指南第一章
传统行式数据库:
数据是按行存储的
没有索引的查询使用大量I/O
建立索引和物化视图需要花费大量时间和资源
面向查询的需求,数据库必须被大量膨胀才能满足性能要求
没有实时性只能处理已有问题
列式数据库:
数据是按列存储-每一列单独存放
数据即是索引
指访问查询涉及的列-大量降低系统I/O
每一列由一个线索来处理-查询的并发处理
数据类型一致,数据特征相似-高效压缩
HBase特点
大:一个表可以有数十亿行,上百万列;
无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
面向列:面向列(族)的存储和权限控制,列(族)独立检索;
稀疏:对于空(null)的列,并不占用存储空间,表可以设计的非常稀疏;
数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳; 默认1个版本
数据类型单一:Hbase中的数据都是字符串,没有类型。
hbase中行与列(hbase权威指南第一章)
自动分区(hbase权威指南第一章)
HMaser(hbase权威指南第一章)
Hregionserver(hbase权威指南第一章)
列族的数量
-列族数量越少越好,即使同时有两个列族,查询的时候总是访问其中一个列族,不会同时访问。
-当一个表存在多个列族,当基数差距很大时,如A族有100万行,B族10亿行,A族可能会被分散到很多区域region,导致扫描A的效率降低。
-另外,多个列族在flush和compaction时,会造成很多I/O负担。
3)行键设计RowKey
a. 不要将RowKey设计成有序的形式,因为这样容易阻塞并行性,将负载压都在一台机器上
b. 定位一个单元,需要行,列名和时间戳。如果一个单元格的坐标很大,会占用内存,索引用光。所以,解决方法:列族名尽量小,如一个字符a,短属性名,而行键长度可读即可(行键长度对数据访问无太大影响),将数字字符转换为数字字节模式(节省空间)。
c. 倒序时间戳有助于找到找到最近版本值
d. 行键是在列族范围内有效,不同列族中可以拥有同样的行键
e. 行键永远不能变
11.9
HMaster:
管理meta表和其他表结构命名空间
管理Hregionserver
接收客户端请求
一般和namenode在一个节点上
ddl(创删表)
HRegionserver
管理region拆分合并
一般和datanode在同一节点上
memstore写入Hfile
表级操作(增删改查)
负载均衡(平均分配任务,让每个节点分配的任务量大致一样)
memstore()
默认存到内存memstore
memstore达到阀值把数据存到本地Hfile中
(将更新内容排序并以KeyValues形式存储到内存中,与将其存储在HFile中相同。每个列族只有一个Memstore,更新内容按照列族排序)
Hbase高可用
在hbase/conf目录下加一个文件backup-masters
里面存放主机列表(类似于配置regionserver)
创建表空间
老版本
Configuration conf = HBaseConfiguration.create();//加载配置文件
HBaseAdmin admin = new HBaseAdmin(conf);
NamespaceDescriptor ns = NamespaceDescriptor.create("t123").build();
admin.createNamespace(ns);
admin.close();
新版本
//加载配置文件
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
Admin admin = conn.getAdmin();
TableName tname = TableName.valueOf("wc");
HTableDescriptor htdesc = new HTableDescriptor(tname);
HColumnDescriptor hcdesc = new HColumnDescriptor("f1");
htdesc.addFamily(hcdesc);
admin.createTable(htdesc);
admin.close();
11.12
scan:
设置表级缓存
Scan的对象setCaching方法
filter:(让搜索条件更细致)
比较过滤器
专用过滤器
附加过滤器
自定义过滤器
hbase与mapreduce使用的类
inputformat-----》tableinputformat
recordreder-----》tablerecordreder
mapper -----》tablemapper
reducer -----》 tablereduer
11.13
hbase优化
垃圾回收优化
本地memstore分配缓冲区
压缩
拆分和合并的优化
负载均衡
合并region
客户端API最佳实践
禁止自动刷写
使用扫描缓存
限定扫描范围
块缓存
优化获取行键的方式