更新hbase

This commit is contained in:
xiongraorao 2018-08-03 12:01:41 +08:00
parent a7c6568e6e
commit 5c1773e018
4 changed files with 69 additions and 3 deletions

View File

@ -37,6 +37,8 @@ dependencies {
// https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core
compile group: 'org.apache.hadoop', name: 'hadoop-mapreduce-client-core', version: '2.7.4'
// https://mvnrepository.com/artifact/org.apache.hbase/hbase-client
compile group: 'org.apache.hbase', name: 'hbase-client', version: '1.2.6'
}

View File

@ -0,0 +1,35 @@
package com.raorao.java.thread;
import java.util.Iterator;
import java.util.PriorityQueue;
/**
* 得到TopN的方法使用优先队列.
*
* @author Xiong Raorao
* @since 2018-08-03-10:18
*/
public class TopN {
public static void main(String[] args) {
PriorityQueue<Integer> p = new PriorityQueue<>(5);
int[] aa = new int[] {1, 2, 3, 4, 77, 22, 42, 35, 8, 12};
for (int i : aa) {
if (p.size() < 5) {
p.offer(i);
} else {
if (i < p.peek()) {
// do nothing
} else {
p.offer(i);
p.poll();
}
}
}
Iterator<Integer> iterator = p.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}

View File

@ -87,3 +87,13 @@ Kafka | 7.31 | 7.26 | 完成理论复习,代码实践未完成
- 7.30
1. 完成剑指Offer的题目
- 8.2
1. 完成中国银联的笔试
2. 复习完java并发
- 8.3
1. 复习HBase
2. 复习Linux

View File

@ -16,6 +16,7 @@
- [什么是热点](#什么是热点)
- [其他一些建议](#其他一些建议)
- [HBase 读写过程](#hbase-读写过程)
- [HBase 文件合并](#hbase-文件合并)
- [HBase 优化](#hbase-优化)
- [面试问题](#面试问题)
- [参考文档](#参考文档)
@ -265,9 +266,11 @@ HBase中的行是按照rowkey的字典顺序排序的这种设计优化了sca
# HBase 读写过程
hbase使用MemStore和StoreFile存储对表的更新。
数据在更新时首先写入Log(WAL log)和内存(MemStore)中MemStore中的数据是排序的当MemStore累计到一定阈值时就会创建一个新的MemStore并且将老的MemStore添加到flush队列由单独的线程flush到磁盘上成为一个StoreFile。于此同时系统会在zookeeper中记录一个redo point表示这个时刻之前的变更已经持久化了。(minor compact)
数据在更新时首先写入Log(WAL log)和内存(MemStore)中MemStore中的数据是排序的当MemStore累计到一定阈值时就会创建一个新的MemStore并且将老的MemStore添加到flush队列由单独的线程flush到磁盘上成为一个StoreFile。于此同时系统会在zookeeper中记录一个redo point表示这个时刻之前的变更已经持久化了。
当系统出现意外时,可能导致内存(MemStore)中的数据丢失此时使用Log(WAL log)来恢复checkpoint之后的数据。
前面提到过StoreFile是只读的一旦创建后就不可以再修改。因此Hbase的更 新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后就会进行一次合并(major compact),将对同一个key的修改合并到一起形成一个大的StoreFile当StoreFile的大小达到一定阈值后又会对StoreFile进行split等分为两个StoreFile。
前面提到过StoreFile是只读的一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后就会进行一次合并(major compact),将对同一个key的修改合并到一起形成一个大的StoreFile当StoreFile的大小达到一定阈值后又会对StoreFile进行split等分为两个StoreFile。
由于对表的更新是不断追加的处理读请求时需要访问Store中全部的StoreFile和MemStore将他们的按照row key进行合并由于StoreFile和MemStore都是经过排序的并且StoreFile带有内存中索引合并的过程还是比较快。
写请求处理过程
@ -281,6 +284,22 @@ hbase使用MemStore和StoreFile存储对表的更新。
6 将更新写入Memstore
7 判断Memstore的是否需要flush为Store文件。
# HBase 文件合并
在HBase中每当memstore的数据flush到磁盘后就形成一个storefile当storefile的数量越来越大时会严重影响HBase的读性能 所以必须将过多的storefile文件进行合并操作。Compaction是Buffer-flush-merge的LSM-Tree模型的关键操作主要起到如下几个作用
1合并文件
2清除删除、过期、多余版本的数据
3提高读写数据的效率
HBase中实现了两种compaction的方式minor and major:
minor compaction: Minor操作只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期版本清理不做任何删除数据、多版本数据的清理工作。
major compaction: Major操作是对Region下的HStore下的所有StoreFile执行合并操作最终的结果是整理合并出一个文件。
# HBase 优化
1. 预先分区