[공부] Hbase compaction

hbase 2016. 12. 16. 20:23


발로 번역해서 공부한 내용이다.

Hbase compaction을 공부하기 위해 여러 군데 흩어져 있는 내용을 짬뽕한 내용이다. 



hbase에 데이터가 바뀌면 commit log로 저장되는데, WAL(Write-Ahead Log)에 존재한다. 데이터는 이후 메모리 상의 Memstore에 저장된다. 메모리 상의 데이터가 설정된 최대값을 넘어서면 디스크에 HFile로 저장된다. 

이를 compaction(컴팩션)이라고 한다. 읽는 관점도 동일하게, 읽기 쉽게 저장되는 형태이기도 하다.



또한, 데이터가 변경/삭제되면서 이미 저장된 HFile에 필요 없는 데이터가 삭제 마킹(tombstone marking)이 되면서 지울 것은 지우고 합칠 것은 합치는 작업(compaction)을 진행한다.  하나의 리전(region)에서 한 저장소에서 HFile을 모아 병합한다. 


참고로, compaction은 두 가지 종류가 있다. 

- minor compaction : 작고 많은 HFile을 소수의 큰 HFile로 결합한다. compaction할 HFile 개수와 빈도를 제어할 수 있다. 특정 로우를 읽다가 디스크 읽기를 많이 하다가 전반적인 성능이 저하될 수 있기 때문이다...

- major compaction  : Region의 모든 Store 파일을 읽고 하나의 Store 파일에 저장한다.



CDH 4/HBase 0.96 이전의 기본 정책은 HFile의 목록을 살펴보고 전체 파일 수에 hbase.store.compaction.ratio를 곱한 값보다 작은 크기를 가진 파 중 첫 번째를 찾으려 한다. 만약 해당 파일을 찾으면 HFile과 그보다 작은 id를 가진 모든 파일이 컴팩션되도록 선택된다. 기본 정책은 RatioBasedCompactionPolicy이다(사실 이거 하나였다). 오래된 HFiles부터 시작된다. 하지만, 파일의 age와 size를 기반한 일부 가정이 잘못되었다.



CDH 5/HBase 0.96에서 https://issues.apache.org/jira/browse/HBASE-7516를 통해 사용자가 원하는 compaction(ExploringCompactionPolicy)을 진행할 수 있게 되었다. 모든 파일이 지정된 compaction 비율내에 있음을 보장한다. 그리고 compaction 비율 내에서 첫 번째 파일 집합만 선택하지 않고, 규칙을 위반하지 않은채 가장 IO가 적을 것 같은 것만 선택한다. compaction할 파일을 찾은 후 크기가 작은 파일이 대상이 된다. 그래서 IO 부하를 최소화하는 전략으로 변경했다. 벌크 로딩이 필요한 작업에서는 엄청난 성능 향상이 있다고 한다. 


ExploringCompactionPolicy을 사용하면 minor compaction이 효율적이라서 major compaction이 덜 발생해서 성능이 좋다고 한다. 그래서 기본 compaction 정책으로 사용되어 지금까지 쓰고 있다고 한다. 




ExploringCompactionPolicy에 대한 소스는 https://github.com/apache/hbase/blob/master/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/ExploringCompactionPolicy.java에 있으니 참고할 수 있다. 


ExploringCompactionPolicy이 확장되어 Stripe compaction(https://issues.apache.org/jira/browse/HBASE-7667)이 0.98, 0.99에 추가되었다. 또한 tiered-based compaction(https://issues.apache.org/jira/browse/HBASE-7055)은 개발 중이지만,2015년에 쓴 댓글이 마지막이라서 나올지 의문이다.



다음은 compaction 관련으로 Hortonworks에서 발표한 내용이다(동영상은 https://vimeo.com/69989292을 참조한다).


HBaseCon 2013: Compaction Improvements in Apache HBase from Cloudera, Inc.



참고로 https://hbase.apache.org/book.html#compaction을 참조하면, 

0.94의 RatioBasedCompactionPolicy 동작 순서와 0.96의 ExploringCompactionPolicy 동작 순서를 잘 알 수 있을 것이다. 그리고, hbase compaction property를 참조하면 hbase의 compaction를 더욱 이해할 수 있을 것 같다. 





참조 


https://hbase.apache.org/book.html#compaction


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


http://blog.cloudera.com/blog/2013/12/what-are-hbase-compactions/


https://www.linkedin.com/pulse/hbase-minor-major-compaction-explained-jeetendra-gangele


http://engineering.vcnc.co.kr/2013/04/hbase-configuration/




참고


cassandra의 compaction 전략은 다음을 참조한다. hbase의 compaction은 전체 클러스터의 설정이라면, cassandra의 compaction설정은 테이블 단위이다.


http://knight76.tistory.com/entry/cassadra-compaction-%EC%A0%84%EB%9E%B5

Posted by '김용환'
,