본문 바로가기메뉴 바로가기


kakao의 오픈소스 Ep3 – HBase Region Inspector

 

“카카오의 오픈소스를 소개합니다” 세번째는 jg.choi와 동료들이 개발한 HBase Region Inspector입니다.

HBase Region Inspector는 HBase의 여러 리젼에 분산된 데이터를 시각적으로 보여주는 실용적인 도구입니다.

카카오에서도 대규모 HBase 클러스터 운영에 큰 도움이 되고 있는 유용한 소프트웨어입니다. 특히 ClojureReact으로 작성되어 Clojure를 공부하려는 개발자들에게 유용할 것입니다.

HBase

카카오의 많은 서비스는 대용량의 데이터를 저장하고 서비스하기 위해 Apache HBase 를 사용하고 있습니다.

HBase 는 이미 잘 알려져 있으니 긴 설명이 필요하진 않을 것 같은데요. 간단히 한 문장으로 요약하자면 HBase 는 데이터를 여러 서버에 분산 저장하고 처리하는 Hadoop 기반의 분산 데이터 저장소입니다.

Region: 데이터 분산의 단위

분산 데이터 저장소이니 당연히 데이터가 여러 서버에 잘 분산 되어 있어야scalable 한 성능을 얻을 수 있죠. HBase 는 각 테이블 데이터를 여러 구간으로 나누는데 – RDBMS 의 range partitioning 과 동일한 방식 – 이렇게 나눈 각 구간의 데이터를 리젼 (region) 이라 부르고 분산의 기본 단위로 사용합니다. 다른 데이터 스토어에서는 유사한 개념을 partition, chunk 등의 명칭으로 부르기도 합니다.

리젼의 개념

(이미지 출처: HBase Architecture Analysis Part1(Logical Architecture))

HBase 클러스터 성능 관리의 핵심은 바로 이런 리젼들의 분산을 모니터링하고 관리하는 일입니다. 리젼들이 적절한 크기로, 또 적절한 범위로 나뉘어져 있는지, 모든 서버에 고르게 분산되어 있는지, 읽기나 쓰기가 몰린 리젼이 있지는 않은지, 특정 리젼 서버에 요청이 많은 리젼들이 다수 배치되어 있지는 않은지, 다양한 관점에서 살펴봐야 하죠.

그런데 안타깝게도 HBase 의 Web UI 를 통해서는 이러한 사항들을 효과적으로 파악하기가 힘듭니다. 각 리젼 서버는 다음과 같은 단순한 화면만을 제공하거든요.

지표들을 visual 하게 보여주지 않고 숫자로만 보여주니 상대적인 크고 작음이 머리 속에 잘 그려지지 않습니다. 읽기/쓰기 요청 수도 누적 횟수만 보여줄 뿐, 실제로 중요한 초당 요청 횟수를 보여주지는 않아요.

가장 큰 문제는 모아서 볼 수 없다는 점입니다. HBase 클러스터를 구성하는 서버의 대수가 수십대, 수백대를 넘어가는 경우에, 그 모든 서버들의 페이지를 일일이 열어 가며 확인 할 수는 없는 노릇이죠. 클러스터 전체 리젼들의 상태를 한 눈에 조망할 수 있는 방법이 없었습니다.

오픈소스 툴은 없을까?

분명 비슷한 아쉬움을 느낀 사람들이 있었겠죠. Hannibal 이라는 오픈소스 모니터링 툴이 있습니다. 다음과 같이 각 리젼 서버에 위치한 리젼들의 크기를 visual 하게 보여줍니다.

Hannibal 서버 모니터링 화면

![Hannibal 리젼 모니터링 화면

좋은 시도인 것은 분명하나 단순히 리젼의 크기 정보만을 보여줄 뿐이라 많은 통찰을 주지는 못합니다. 더 이상 업데이트 되지 않고 있기도 합니다.

그래서 만든 hbase-region-inspector

그래서 결국 hbase-region-inspector 라는 (밋밋한 이름의) 툴을 만들기로 했습니다. 목표로 했던 것은 다음과 같습니다.

  • 클러스터의 전체적인 상태를 한눈에 조망할 수 있을 것
  • 다양한 지표를 확인할 수 있을 것
  • 필요 시 리젼을 옮길 수 있을 것
  • 설치하고 사용하기 쉬울 것

프로젝트는 빠른 개발을 위해 ClojureReact 을 이용해 구현되었습니다. Clojure 에 관심이 많은 분이라면 왜 Om 이나 Reagent 를 사용하지 않았는지 궁금해 하실 지도 모르겠네요. 그건 단순히 필자가 JavaScript 개발자가 아닌데다 React 도 처음 써보는 입장이라 추상화 계층을 하나 더 두기는 부담스러워서 그랬던 것이죠.

사용법

hbase-region-inspector 는 실행 가능한 바이너리 또는 JAR 의 형태로 배포되고 있습니다. 사용하시는 클러스터에 맞는 바이너리 파일을 다운로드 하시고 실행 권한을 부여하신 후 (chmod +x ...), 다음과 같이 실행하시면 됩니다.

./hbase-region-inspector ZOOKEEPER_QUORUM HTTP_PORT [INTERVAL]

쉽죠?

실행 화면

지정한 포트를 브라우저에서 열어보시면 다음과 같은 화면을 보실 수 있습니다.

각 리젼 서버별 리젼 분포와, 각 리젼의 크기, 누적 요청 수, 초당 요청 수, 스토어파일의 개수, 멤스토어의 크기 등 다양한 정보를 확인 할 수 있습니다.

구체적인 동작은 아래의 영상에서 확인하세요.

Demo

활용 사례

사용하기 쉽다 보니 카카오에서는 여러 팀에서 이 툴을 사용해 HBase 상태를 모니터링하고 있습니다. 웹서버의 형태로 실행되므로, 현재 상태를 공유하기에도 편리하죠. 다양한 문제 상황에 대한 진단과 파악도 용이해졌는데요, 실제로 다음과 같은 사례들을 진단하는데 활용했습니다.

  • 특정 리젼에 과도하게 많은 요청이 몰리고 있는 상황
  • 리젼 개수 기준으로는 고르게 분산되었지만, 요청 횟수는 특정 서버에 쏠린 상황
  • Rowkey 를 잘못 만들어 의도와는 다르게 특정 리젼의 사이즈만 커진 상황

한계

아직 몇 가지 아쉬운 점들이 있기는 합니다. hbase-region-inspector 는 현재 현황을 파악하는데는 도움이 되지만, 변화 이력을 추적하기에는 적합하지 않습니다 (3차원 그래프가 필요할까요?).

또한 리젼의 개수가 수만개를 넘어가는 대형 클러스터를 대상으로 실행하는 경우, 브라우저가 무척이나 힘들어 하는 모습을 보게 됩니다.

(미안 크롬 …)

오픈소스

자랑할 만한 수준의 코드는 아니지만 – 아니 사실 그 반대이지만 – 다른 HBase 사용자 분들께도 유용하리라는 판단에 오픈소스로 공개하게 되었습니다. 소스코드와 바이너리는 아래 링크에서 보실 수 있습니다.

  • https://github.com/kakao/hbase-region-inspector
  • https://github.com/kakao/hbase-region-inspector/releases

사용해 보시고 피드백 주세요. 저의 비루한 JavaScript 코드를 다듬어 주실 분도 기다려 봅니다.

Avatar
jg.choi 카카오에서 대용량 데이터 처리를 위한 플랫폼을 만들고 관리하고 있습니다. 개발 생산성 향상에 관심이 많아 여러 오픈소스 툴들을 개발해오고 있습니다.
Top Tag
2021
2021-new-krew
Ad Platform
Ad tech
adaptive-hash-index
adt
adtech
agile
agilecoach
ai
algorithm
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
Analyzer
android
angular
anycast
App2App
applicative
Architecture
arena
ast
async
aurora
babel
babel7
Backend
BApp
bgp
big-data
binary
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
CF
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codereview
coding
coding test
Collaborative Filtering
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
desktop
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
Electron
employeecard
emscripten
eslint
extract-text
Feature List
Featured
Feedback
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
GHC
github
globalpollution
go
Grace Hopper Celebration
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
ICPC Sinchon
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
JCMM
JIRA
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaobrain
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
MAB
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mm
mobil
mocking
monad
monorepo
ms-office
MSA
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
Nickface
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
parallel
PBA
performance
planning poker
Platform
polyfill
programming-contest
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
sharding
shopping
Shuffle Partition
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
thread
Thread-Debugging
time-wait
tmux
Topic Modeling
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web-cache
web-worker
webapp
webgl
WebSocket
webworkers
weekly
Women Technologists
work
workplatform
개인화 추천
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석
일하는방식
협업
All Tag
2021
2021-new-krew
Ad Platform
Ad tech
adaptive-hash-index
adt
adtech
agile
agilecoach
ai
algorithm
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
Analyzer
android
angular
anycast
App2App
applicative
Architecture
arena
ast
async
aurora
babel
babel7
Backend
BApp
bgp
big-data
binary
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
CF
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codereview
coding
coding test
Collaborative Filtering
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
desktop
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
Electron
employeecard
emscripten
eslint
extract-text
Feature List
Featured
Feedback
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
GHC
github
globalpollution
go
Grace Hopper Celebration
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
ICPC Sinchon
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
JCMM
JIRA
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaobrain
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
MAB
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mm
mobil
mocking
monad
monorepo
ms-office
MSA
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
Nickface
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
parallel
PBA
performance
planning poker
Platform
polyfill
programming-contest
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
sharding
shopping
Shuffle Partition
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
thread
Thread-Debugging
time-wait
tmux
Topic Modeling
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web-cache
web-worker
webapp
webgl
WebSocket
webworkers
weekly
Women Technologists
work
workplatform
개인화 추천
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석
일하는방식
협업

위로