写缓存的数据排序,当达到hbase数据刷写时机[[09_Hbase#^e1761e|刷写详情]],从内存写出为Hfile并上传到hdfs上落盘java自动换行:关放大阅读展开代码/hbase /data /<Namespace> (Namespaces in the cluster) /<Table> (Tables in the cluster) /<Region> (Regions for the table) /<ColumnFamily> (ColumnFamilies for the Region for the table) /<StoreFile> (StoreFiles for the ColumnFamily for the Regions for the table)
[!example|noborder grid]+ 读数据
shell自动换行:关放大阅读展开代码## 命令行读数据的格式: 1. 单独行 get 表名,rowkey,{COLUMN => 列族:列名} 2. 多行 scan
shell自动换行:关放大阅读展开代码## 命令行写数据的格式: put 表名,rowkey,列族:列名,value值 hbase> put 't1', 'r1', 'c1', 'value' hbase(main):018:0> put 't1','1000','cf1:name','KIKI'
如何读取刚刚写入hbase的最新数据?
可以使用flush 表名方式手动刷写memstore中的新数据到hfile,但是没有必要,因为读数据时,第一个读取的位置就是memstore
stroefile需要合并的原因
小文件问题,过多将占用namenode过多的内存每条记录存在版本的概念,相同rowkey的数据在value变更,或者删除都会产生版本,造成读取效率下降
^3192ef
写数据时的刷写时机
^e1761e
某个memstore大小达到l128M,会进行该region内所有memstore的flushregion内的所有ms数据达到所有region大小达到了hbase堆内存 * 0.4 * 0.95,就会触发hbase集群所有hbase堆内存 * 0.4,该regionserver就会停止接受写请求,直到所有regionserver大小低于hbase堆内存 * 0.4 * 0.95,取消阻塞当client频繁地访问一个或者几个region,可能超过了单台regionserver负载能力,导致该RS上的其他region也不可用的情况
java自动换行:关放大阅读展开代码// 使用phoenix在建维度表时指定该表的预分区 StringBuilder bu = new StringBuilder(); bu.append("create table if not exists ") .append(tp.getSinkTable()+ "(") .append(tp.getSinkColumns().replaceAll("[^,]+","$0 varchar")) .append(",constraint pk primary key (" + (tp.getSinkPk() == null? "id": tp.getSinkPk())) .append("))") .append(tp.getSinkExtend() == null? "": tp.getSinkExtend()); System.out.println("建表sql为:" + bu); /** phoenix加盐表原理: ①需要保证加盐表需要预先分区,比如将DIM_SKU_INFO预分为4个区, ② hash(rowkey)% salt_bucket 的得到新rowkey的前缀,并拼接,如当使用phoenix向hbae插入数据时,每条rowkey前加入ox00 ~ 0x03的字节,保证数据均匀分布在regionserver中 create table DIM_SKU_INFO( id varchar,,price varchar ,sku_name varchar, constraint pk primary key (id) ) SALT_BUCKETS = 4 */
分布再一个或者几个region上的数据比其他region超大,导致的数据倾斜
本质还是rowkey的不均匀分布造成的,需要重新设置rowkey
往往在读hbase数据时,不会只按照rowkey的一级索引查询,此时,就会进行hbase的全表扫描,效率低 1.全局索引(默认建表索引,也是电商实时项目中的选择)
sql自动换行:关放大阅读展开代码-- 对studen表的address字段建立本地索引 create index global_index on table STUDENT(address);
全局索引会建立一张新的索引表,新表的rowkey为 原表的rowkey + address
此时表数量增加,对比本地索引写速率下降(更新数据时需要额外维护一张或者多张索引表),对比原表没有索引时的全表扫描,读速率提升,适合读多写少的场景
2.本地索引
sql自动换行:关放大阅读展开代码-- 对studen表的name字段建立本地索引 create local index local_index on table STUDENT(name);
本地索引会为原表的每一条数据加入一条数据 数据 rowkey为 原row_key + name
但此时数据量增加,对比原表读效率提升,对比全局索引写速率提升
3.包含索引
sql自动换行:关放大阅读展开代码-- 对studen表的address字段建立包含索引 create index include_index on table STUENDT(name) INCLUDE(address);
包含索引include的字段在索引表中为普通字段,在读取数据时在磁盘中,减少加载索引表的内存占用
对比默认的全局索引,索引表需要全部加载入内存中,内存占用较包含索引表占用高
hbase利用rowkey的唯一性,实现幂等写入
项目中使用了Phoenix On HBase的模式,可以利用Phoenix提供的二级索引功能,实现HBase的二级索引
本文作者:hedeoer
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!