HBase BlockCache

채상은·2022년 1월 12일
1

HBase

목록 보기
1/4
post-thumbnail

Type of HBase Block

Data Block

HFile의 구성 요소중 하나인 Data Block은 Key-Value의 형태로 이루어진 데이터를 저장하고 있는 block이다. 즉 Data Block은, MemStore로 부터 Flush operation이 수행되었을 때, MemStore에 저장하고 있던 Key-Value Format의 user data를 저장하고 있는 block이다.

Index Block

HFile의 구성 요소중 하나인 Index Block은 HFile 내부에 Data Block의 위치 정보를 저장하고 있는 block이고, 이는 read performance를 향상시키기 위해 존재한다. Index Block은 각각의 Data Block 내부에 저장하고 있는 가장 첫번 째 Cell (Key-Value Format Data)의 정보를 가지고 있으며 이는 HFile의 Cell이 정렬되어 있다는 특징을 활용해서 빠르게 요청되는 Cell을 찾을 수 있다.

Bloom Block

HFile의 구성 요소중 하나인 Bloom Block은 Index Block과 같은 목적을 가지고 저장되어 있는 데이터이며, 이 또한 read performance를 향상시키기 위해 존재한다. Bloom Block은 각각의 HFile 내부에 존재하며, 이는 bloom filter에 대한 정보를 가지고 있다. Bloom Filter는 reader가 원하는 Cell이 특정 Data Block에 속하는지의 여부를 검사하는데 사용되는 확률적 자료 구조이다. Bloom Filter에 의해 특정 Cell이 특정 Data Block에 저장되어 있다고 판단된 경우 실제로는 Cell이 Data Block에 속하지 않는 Positive Error가 발생하는 것이 가능하지만, 반대로 Cell이 Data Block에 저장되어 있지 않는 것으로 판단되었는데 실제로는 Cell이 Data Block에 속하는 Negative Error를 절대로 발생하지 읂는다는 특성이 있다.

Meta Block

마지막으로, HFile의 구성 요소중 하나인 Meta Block은 HFile에 대한 전반적인 정보를 저장하고 있다.

HBase BlockCache

BlockCache는 각 region server마다 존재하며, 하나의 region server에 속해있는 모든 region은 하나의 BlockCache를 공유한다. HBase는 크게 3가지 종류의 BlockCache를 사용한다.

LruBlockCache

Overview of LruBlockCache

LruBlockCache는 기본적으로 JVM heap 내부에 존재하는 자료구조이다. LruBlockCache는 데이터를 3가지 영역으로 나누어서 구분을 하며, 이는 Single-Access Area, Multi-Access Area, 그리고 In-Memory Area이다. 각 영역의 Default 크기는 BlockCache를 1:2:1의 비율로 나누어 가지고 있다 (25%, 50%, 25%).

특정 query에 의해 HDFS로 부터 처음 불려지는 block은 single-access area에 caching되게 된다. LruBlockCache는 Least-Recently-Used algorithm을 사용하여 오래 사용되지 않는 Block을 evict하는 정책을 사용한다. 만약, single-access area에 속해져있는 block이 한번 이상 불리게 되면 (Reference Count >=2), 해당 block은 multi-access area로 이동하게 된다 (Promoted). 반대로 multi-access area에 존재하는 block이 지속적으로 evict되어 reference count가 0으로 떨어지게 된다면 LruBlockCache에서 삭제되게 된다. 추가적으로, multi-access area에 저장되어 있는 block이 evict된다면, reference count를 감한 후 VimtimHandler에 의해 다시 multi-access area 또는 single-access area에 caching되게 된다.

LruBlockCache Evict operation

SlabCache

SlabCache는 LruBlockCache와 달리 JVM(Java Virtual Machine) heap 외부에 존재하는 자료구조이다 (Off-heap). 따라서, JVM의 Garbage Collection에서 부터 발생하는 Overhead로 부터 영향을 받지 않게 된다. SlabCache는 block의 크기에 따라 서로 다른 위치에 block이 caching되게 된다. Default configuration으로는 크기에 따라 2가지 영역으로 분류되며 이는 각각 80%,20%의 SlabCache 영역을 차지하게 된다.

80%를 차지하고 있는 영역에는, target block의 크기가 유사한 block들이 위치하게 된다. 반대로 20%를 차지하고 있는 영역에는, target block의 크기보다 2배 크기의 block들이 위치하게 된다. 만약 두개의 영역의 target block의 크기보다 크기가 큰 block은 caching 하지 않는다.

BucketCache

BucketCache는 heap, off-heap, 그리고 file mode 중 하나를 선택하여 사용할 수 있다. BucketCache는 각각의 operation mode에 상관없이, cached block을 target block size에 해당하는 bucket에 저장하는 정책을 사용한다.

Heap mode는 target block size에 해당하는 bucket을 JVM 위에 생성한다. 이와는 다르게 off-heap mode는 SlabCache와 같은 방법으로 DirectByteBuffer를 사용하여 JVM heap 외부에 bucket을 생성한다. BucketCache는 각각의 operation mode에 상관없이, 14개의 서로 다른 target block size에 대한 bucket을 생성하고 각각의 bucket은 LruBlockCache와 같이 single-access area, multi-access-area, in-memory area로 이루어 진다(25%, 50%, 25%). 또한 block eviction은 LRU 알고리즘을 사용한다.

Multi-Level Caching

SlabCache와 BucketCache는 LruBlockCache와 함께 multi-level caching 방식을 구현할 수 있다. Multi-level Caching 인스턴스는 L1 cache 와 L2 cache로 구성되어 있으며, LruBlockCache-SlabCache, LruBlockCache-BucketCache 2가지 조합으로 구성될 수 있다.

DoubleBlockCache (LruBlockCache-SlabCache)

DoubleBlockCache는 L1 Cache와 L2 Cache에 모두 block을 caching한다. 두개의 Cache는 독립적으로 작동하고, caching과 evict가 독립적으로 이루어진다.

CombinedBlockCache (LruBlockCache-BucketCache)

CombinedBlockCache는 L1 Cache와 L2 Cache를 DoubleBlockCache와 다르게 유기적으로 관리한다. LruBlockCache 방식을 사용하고 있는 L1 Cache에는 Bloom block과 Index block의 caching 공간으로 사용된다. 반면, Data Block은 L2 Cache에 direct하게 저장된다.

만약 L1에 caching 되어 있는 block이 evict된다면, block을 cache에서 삭제하는 것이 아니라 L2 cache로 이동하게 된다(Demoted).

profile
M.S Student in Data Intensive Computing Lab SKKU.

0개의 댓글