View
* 데이터 버저닝Data Versioning
- HBase의 특별한 기능 중 하나로 각 셀cell의 특정column 값에 여러 버전 을 저장할 수 있다. 각 버전에 타임스탬프timestamp를 사용하여 구현되었으며 내림차순으로 정렬된다. long integer 타입으로 millisecond로 환산되는데, 1970년 1월 1일 이후부터의 UTC 시간을 기록하고 있으며 이것을 유닉스시간UnixTime 이라고 한다. 그리고 최초의 시간을 Epoch라 한다.
- Timestamp는 명시적으로 입력하는 것도 가능한데, default로 HBase는 각 cell의 변경을 3개 까지 보관하며 기본적으로 scan을 통해서 조회하게 되면 내림차순이기 때문에 가장 최신의 데이터가 조회된다. 또한 저장되어 있는 모든 version의 데이터를 조회하는 것도 가능하며, timestamp 범위를 설정하여 그 시점의 값을 보는 것도 가능하다.
* 컴팩션Compaction
- HBase의 리전서버에 저장되어 있는 리전들은 CF(Column Family) 별로 HStore를 가지고 있는데, 이는 그 CF에 대한 memstore와 HFile 들로 구성된다.
- Memstore는 memory 영역에 있는 CF의 데이터이고 HFile은 로컬 디스크(HDFS)에 저장되어 있는 CF의 데이터로, 이렇게 계층화 하여 구성하는 이유는 HBase 테이블 구조에 맞추어 row key 기반으로 정렬해야되기 때문에 디스크 영역으로 바로 저장할 수 없으며 메모리 영역에서 정렬 후 저장해야 한다.
- HBase에서 쓰기작업(put, update 등)이 수행되는 경우 WAL(Write Ahead Log)에 데이터를 기록 후 memstore에 데이터를 쓰게 되며, 읽기작업(scan)의 경우 memstore를 우선적으로 확인 후 HFile을 탐색하여 요청한 내용을 확인하게 된다.
- 반복된 write 작업으로 memstore의 데이터의 크기가 설정한 임계값을 초과하게 되는 경우 memstore의 데이터를 HFile로 저장한다. 이렇게 다수의 HFile로 구성된 리전의 경우 HFile이 많아지게 되면 compaction이 발생해 여러개의 HFile을 더 큰 것으로 병합하게 되며, 그 결과로 작은 크기의 여러개의 HFile이 큰 크기의 HFile로 개수가 줄어들게 된다. 이러한 작업을 컴팩션compaction 이라고 한다.
- HBase의 컴팩션 작업은 minor compaction과 major compaction으로 수행되는데 minor compaction은 은 최근에 생성된 크기가 작은 파일을 설정된 크기의 HFile크기로 병합하게 되며, major compaction은 특정 리전의 CF의 모든 HFile을 하나로 병합한다.
- Minor compaction은 아래와 같은 설정을 통해 컴팩션을 수행 할 HFile의 개수를 설정한다.
> hbase.hstore.compaction.min : minor compaction을 수행할 HFile의 최소 개수를 설정
> hbase.hstore.compaction.max : minor compaction을 수행할 HFile 최대 갯수를 설정
- 다음 설정을 통해서는 컴팩션을 수행할 HFile의 크기를 지정할 수 있다.
> hbase.hstore.compaction.min.size : 이 값 보다 적은 HFile은 항상 minor compaction이 수행을 위한 탐색ExploringCompactionPolicy 시 포함된다. 이 값과 포함하여 hbase.hstore.compaction.ratio를 참조하여 컴팩션을 수행할 HFile을 선택하게 된다. 만약
> hbase.hstore.compaction.max.size : 이 크기보다 큰 HFile은 minor compaction에서 제외된다. 만약 minor compaction이 자주 발생하는데 큰 효과를 얻지 못하는 경우에는 이 값을 작게 설정하여 큰 파일들이 minor compaction에서 빠지도록 할 수 있다. (default :9223372036854775807, LONG.MAX_VALUE,byte
minor compaction 알고리즘은 hbase.hstore.compaction.ratio를 사용하여(default : 1.2 ) HFile(=storefile)의 크기를 설정하게 된다. ratio 값이 클 수록 큰 HFile을 포함하여 minor compaction을 수행하게되며, '.25' 와 같이
1 미만으로 설정하게되면 bigTable compaction 알고리즘과 유사하게 동작하게 된다. 대체로 1.0에서 1.4로 설정할 것을 권고한다. minor compaction 순서는 항상 오래된 파일이 우선적으로 compaction 수행된다.
----------------------------예제----------------------------
1) 설정 값
> hbase.hstore.compaction.ratio = 1.2f
> hbase.hstore.compaction.min = 3 (files)
> hbase.hstore.compaction.max = 5 (files)
> hbase.hstore.compaction.min.size = 10 (bytes)
> hbase.hstore.compaction.max.size = 1000 (bytes)
2) Region에 존재하는 HFile
> 120, 50, 23, 12, 8 (bytes)
3) 연산
. 120 < sum(50, 23, 12, 8) * 1.2 = 111.6 --- false
. 50 < sum(23, 12, 8) * 1.2 = 41.6 --- true
. 23 -- true, 이전파일이 포함되었으며 max-file limit이 5임으로 포함됨.
. 12 -- true, 동일
. 8 -- true , 동일
--------------------------------------------------------------
- Major comactpion은 minor compaction과 다르게 모든 HFile을 하나의 HFile로 구성한다. major compaction가 수행될지 minor compaction이 수행될지에 대한 결정은 memstore가 비워지고 난 뒤 compaction 상태확인을 통해 수행된다. compact / major_compact 쉘 명령 또는 API를 통해서 명시할 수 있으며 background thread를 통해서 수행할 수도 있는데 이는 compaction check를 위해 각 regionServer에서 instance를 하나씩 운용한다.
hbase.server.thread.wakefrequency(default:1000, millisecond) 를 통해 정기적으로 작업을 확인하고 hbase.server.thread.wakefrequency.multiplier를 사용하여 major compaction을 수행할 수 있다.
hbase.hregion.majorcompaction 속성은 주기적 수행시점(default: 24 h) 으로 compaction을 수행할 수 있도록 하며, hbase.hregion.majorcompaction.jitter(default0.2)는 모든 HFile에서 동시에 major compaction이 발생하는 것을 방지하기 위한 것으로 major compaction의 흩어짐 정도를 알려주는데, 0.2는 한번에 20%의 hfile 수 까지만 major compaction이 이루어질 수 있음을 의미한다.
Major compaction 이후에는 각 store에 대한 StoreFile(HFile)이 하나로 구성되는데, 이것은 JVM heap을 불필요하게 잡고 있는 것을 방지한다. major compaction 이후에 특정 StoreFile이 hbase.hregion.max.filesize보다 크다면 해당 store는 두개로 나뉘게 된다. 하나의 StoreFile에 동일한 ColumnFamily가 존재하는 것은 data locality를 고려하여 설계된 것으로 MapReduce작업을 수행할 때 locality가 높다면 map task가 줄어들게 된다.
* 출처 - http://blog.raremile.com/wp-content/uploads/2014/08/Data-Model.png - https://en.wikipedia.org/wiki/Apache_HBase
'02.IT공부(간헐적취미) > 빅데이터' 카테고리의 다른 글
[Phoenix] Feature#1 - Transaction (0) | 2018.05.20 |
---|---|
[HBase] hbase shell command, HBase 명령어 (0) | 2018.01.10 |
[HBase] Shard와 Region의 구조 (0) | 2018.01.08 |
[SPARK ON YARN ERROR] - TransportClient NoSuchMethodError (1) | 2018.01.01 |
Apache Storm 빌드 및 테스트 (1) | 2017.09.06 |