RecoPick



안녕하세요. RecoPick팀의 김성민 입니다.


이번 글에서는 HBase를 사용하면서, 궁금했던 점들 몇 가지를 질의 응답 형식으로 정리해 봤습니다.

FAQ와 다르게 자주하는 질문들이 아닌 것 같아서, 제목을 IAQ[각주:1]라고 했습니다.


Q1. HBase의 .META. 테이블도 split 될까?

A1. 안됨

HBase의 .META. 테이블은 region 정보를 저장하고 있는 특별한 테이블인데, BigTable 논문에서 .META. 테이블이 여러 region으로 나눠질 수 있도록 설계했지만, HBase에서는 .META. 테이블은 split 되지 않도록 구현했습니다. 그리고, -ROOT- 테이블은 .META. 테이블이 저장된 region 정보를 가지고 있기 때문에, split 되지 않습니다. 하지만, HBase에서는 .META. 테이블이 split 되지 않기 때문에, 0.94 이후 버전 부터는 -ROOT- 테이블을 없애고, .META. 테이블만 사용하도록 변경하였습니다.


.META. 테이블에 모든 region의 메타 정보(데이터가 저장된 위치 정보)를 저장하고, .META. 테이블이 split 되지 않기 때문에, HBase 클러스터는 최대 1개의 region에 저장할 수 있는 메타 정보 개수 만큼의 region을 저장할 수 있습니다. 즉, HBase 클러스터를 무한히 크게 할 수 없습니다.




Fig 1-(a). .META. 테이블 구조



Fig 1-(b). Zookeeper와 .META. 테이블 구조





Fig 1-(c). BigTable의 root, meta 테이블 구조


Q2. (minor/major) compaction 작업은 서로 다른 region들 사이에서도 진행되는가?

A2. 안됨.

HBase에서는 주기적으로 데이터 사이즈가 작은 파일들을 하나로 합쳐주는 compaction 작업을 진행합니다. 데이터를 저장할 때, 자동으로 split 해서 저장했다가, 파일 크기가 작은 파일들이 많이 생길 경우, 하나의 큰 파일로 합쳐주는 작업을 진행하는데, compaction 작업의 단위는 directory가 아니라 file 단위이기 때문에, 서로 다른 region에 있는 작은 파일들을 하나로 merge하지는 않습니다.

HBase에서 region은 HDFS상에서 하나의 directory를 의미하고, compaction의 동일한 region 즉, directory 내에 있는 파일들을 하나의 큰 파일로 합쳐주는 작업이라고 이해하시면 됩니다.




Fig 2. Minimum compaction threshold


Q3. HBase에서 저장하고자 하는 테이블(region)을 미리 split 한 후, 데이터를 저장할 때, major compaction이 시작되면, 데이터(HFile)가 없는 테이블(region)은 삭제 되는가?

A3. 안됨.

HBase에서는 write 연산이 빈번하게 연속적으로 발생할 경우, region split 역시 빈번하게 발생 하기 때문에, 미리 region을 split 해서 write할 때, region이 split되는 것을 회피해서 write 성능을 향상 시키는 방법을 종종 사용합니다. 그런데, 실제 write 연산을 수행하기 전에 region을 split 하는 것이기 때문에, 실제 데이터는 존재하지 않고, .META. 테이블에 rowkey와 region server 정보가 기록되어 있습니다. 이후, write 연산을 수행하면, 저장할 데이터의 row key가 미리 split한 region에 start과 end row key 범위에 들어있지 않은 경우, 특정 region에는 데이터가 전혀 존재하지 않을 수 있습니다. 이렇게 되면, major compaction을 할 때, region의 데이터 사이즈가 작기 때문에, 데이터가 존재하지 않은 region은 삭제 될 것 같다고 추측할 수 있습니다. 하지만, Q2에서 설명한 것 처럼, compaction은 여러 파일들을 하나로 합치는 작업이지 디렉터를 하나로 합치는 작업이 아닙니다. 따라서, region은 일종의 디렉터리이기 때문에, 데이터 즉, 파일을 하나도 가지고 있지 않은 region (비어 있는 디렉터리)들을 compaction 작업 시, 하나로 합치거나 삭제 되지 않습니다.




Fig 3. HBase Architecture - Storage


Q4. Region이 split 될 때, region의 데이터 크기를 기준으로 split 되는지, 아니면, region 내의 row key의 최소, 최대 값을 기준으로 하는지?

A4. 설정에 따라 다름.

Region을 split하는 정책은 "hbase.regionserver.region.split.policy" 라는 설정에 따라서, 결정됩니다.

0.94 이전 버전에서는 region이 데이터 크기를 기준으로 split 했지만, 이후에는 defalut 설정이 변경되었습니다.

다음과 같은 미리 정의된 Split policy가 있습니다. (물론, custom split policy를 구현하실 수도 있습니다.)


(1) ConstantSizeRegionSplitPolicy

(2) IncreasingToUpperBoundRegionSplitPolicy

(3) KeyPrefixRegionPolicy

(4) DelimitedKeyPrefixRegionSplitPolicy

(5) DisabledRegionSplitPolicy




Fig 4. HBase Region splitting


Q5. WAL (Write Ahead Log) 를 disable 시킨 상태에서 write을 수행 중이던 region server가 crash 될 경우, crash 이전까지 write한 데이터는 HBase에 저장되었을까?

A5. 알수 없음.

HBase에서 write 연산을 수행하면, WAL(HDFS)와 Memstore(Memory)에 데이터를 기록하는데, WAL을 사용하지 않을 경우, Memstore에만 데이터를 쓰고, Memstore에 더 이상 데이터를 쓸 수 없을 경우나, 혹은 일정 시간 간격으로 Memstore에 있는 데이터를 HDFS에 강제로 기록합니다. 그런데, 만약, Memstore의 데이터가 HDFS에 flush 되지 않은 시점에 region server가 crash된 경우, 메모리 상에 있는 Memstore 데이터가 사라지기 때문에, region server가 crash 되기 전에 write 한 데이터가 정상적으로 저장되었다고 확신할 수 없습니다.

만약, WAL을 사용했다면, 새로운 region server가 실행 되면서, WAL를 replay 하기 때문에, region server가 crash 되기 전의 데이터가 정상적으로 저장됩니다.




Fig 5-(a). HBase Write Path



Fig 5-(b). HBase Write Sequence Diagram



[참고 자료]

Q1. (1) http://blog.cloudera.com/blog/2013/04/how-scaling-really-works-in-apache-hbase/ 

       (2) https://blog.safaribooksonline.com/2012/11/16/tip-2-hbase-meta-layout/

(3) http://research.google.com/archive/bigtable.html


Q2. (1) http://hbase.apache.org/book.html#compaction


Q4. (1) http://hortonworks.com/blog/apache-hbase-region-splitting-and-merging/

       (2) http://hbase.apache.org/book/config.files.html#hbase.regionserver.region.split.policy


Q5. (1) http://hbase.apache.org/book/config.files.html#hbase.regionserver.optionalcacheflushinterval

       (2) http://www.slideshare.net/enissoz/hbase-and-hdfs-understanding-filesystem-usage

       (3http://blog.sematext.com/2012/07/16/hbase-memstore-what-you-should-know/

(4http://blog.cloudera.com/blog/2012/06/hbase-write-path/

(5http://www.larsgeorge.com/2010/01/hbase-architecture-101-write-ahead-log.html

 

  1. Peter Norvig의 Java IAQ에서 제목을 인용함(http://norvig.com/java-iaq.html) [본문으로]
Posted by recopick
TAG