본문 바로가기

Hadoop/Hbase

HBase Table 관리

HBase는 HBase를 관리하기 위한 HBase Shell이라는 유용한 프로그램을 제공합니다.

이번 포스팅에서는 HBase Shell을 이용해 Table을 관리하는 법을 살펴보겠습니다.

테이블 생성 (Create)

create ‘<table name>’,’<column family>’ 

테이블을 생성하려면, Table Name과 Column Family를 인자로 넣어줍니다. 컬럼패밀리는 여러개일 수 있습니다.

Column Family가 생소한 분들은 Google이 2006년에 발표한 유명한 논문인 Bigtable: A Distributed Storage System for Structured Data 을 읽는 것을 추천드립니다. 논문 링크는 아래와 같습니다.

https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf

 

아래와 같이 "test-table" 이름의 테이블이 "cf1", "cf2" 컬럼패밀리 두 개를 가지도록 잘 생성된 것을 확인할 수 있습니다.

hbase(main):007:0> create "test-table", "cf1", "cf2"
0 row(s) in 1.3400 seconds

=> Hbase::Table - test-table
hbase(main):008:0> describe
describe             describe_namespace
hbase(main):008:0> describe "test-table"
Table test-table is ENABLED
test-table
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION
=> 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
{NAME => 'cf2', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION
=> 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
2 row(s) in 0.0420 seconds

테이블을 생성하면, 기본적으로 1개의 리전만 생성됩니다. HBase는 Auto Sharding을 지원하기 때문에, 데이터가 들어오다가 점점 리전이 커지면 2개로 분할되고, 더 많이 들어오면 또 분할되며 여러개의 리전이 여러개의 리전서버로 부하가 분산되는 효과를 누릴 수 있습니다.

 

 그러나 대용량 데이터가 들어온다면 Region Split을 할 때는 CPU 사용량이 많아져 HBase 클러스터에 부하가 될 수 있습니다. 만약, 데이터가 많이 들어올 것이 확신된다면 초기에 아래와 같이 테이블을 생성할 때 미리 리전을 Split하는 것이 좋습니다.

hbase(main):001:0> create 'test-table2', 'cf1', {SPLITS => ['row-100', 'row-200', 'row-300', 'row-400', 'row-500']}
0 row(s) in 2.4300 seconds

=> Hbase::Table - test-table2

 

Region presplit

HBase Web UI에서, SPLIT 뒤에 적어준 키를 기준으로 리전이 미리 분할되어있는 것을 확인할 수 있습니다.

테이블 수정(Alter)

만약 테이블을 수정하고 싶다면 alter 명령어를 사용하면 됩니다. 아래 예제는 테이블의 "cf1" 컬럼패밀리의 압축알고리즘을 "SNAPPY"로 바꾸는 예시입니다

hbase(main):012:0> alter 'test-table', NAME => "cf1", COMPRESSION => "SNAPPY"
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 2.0210 seconds

hbase(main):013:0> describe
describe             describe_namespace
hbase(main):013:0> describe "test-table"
Table test-table is ENABLED
test-table
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION
=> 'SNAPPY', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
{NAME => 'cf2', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION
=> 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
2 row(s) in 0.0240 seconds

만약 테이블의 여러개의 속성을 변경하고 싶다면, 뒤에 콤마로 연결하여 바꿔주면 됩니다. 아래는 DATA_BLOCK_ENCODING과 TTL을 변경하는 예시입니다.

hbase(main):014:0> alter 'test-table', NAME => "cf1", DATA_BLOCK_ENCODING => "FAST_DIFF", TTL => "15552000"
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9140 seconds

hbase(main):015:0> describe "test-table"
Table test-table is ENABLED
test-table
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'FAST_DIFF', TTL => '15552000 SECONDS
(180 DAYS)', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
{NAME => 'cf2', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION
=> 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
2 row(s) in 0.0270 seconds

컴팩션

HBase는 빠른 성능을 위해 메모리상에서 데이터를 수정 또는 제거를 합니다. 그리고 이를 반영하기 위한 Compaction을 수행함으로서 영구적으로 데이터가 저장되게됩니다. 

 

컴팩션은, HBase에서 주기적으로 수행하지만, "major_compact" 명령어로 관리자가 원할 때에도 수행할 수 있습니다.

hbase(main):009:0> major_compact 'test-table2'
0 row(s) in 0.0650 seconds

major_compact는 아래와 같이 테이블, 컬럼패밀리, 리전 등 다양한 범위를 지정할 수 있습니다.

          Run major compaction on passed table or pass a region row
          to major compact an individual region. To compact a single
          column family within a region specify the region name
          followed by the column family name.
          Examples:
          Compact all regions in a table:
          hbase> major_compact 't1'
          hbase> major_compact 'ns1:t1'
          Compact an entire region:
          hbase> major_compact 'r1'
          Compact a single column family within a region:
          hbase> major_compact 'r1', 'c1'
          Compact a single column family within a table:
          hbase> major_compact 't1', 'c1'

컴팩션을 수행이 완료되면 해당 테이블이나 리전의 로컬리티가 상승하게 되어 읽기, 쓰기 성능에 도움이 됩니다. 다만 컴팩션 과정은 CPU나 Disk, Network I/O에 부하를 많이 주기 때문에 자주 수행되어서는 안됩니다.

 

 

 

'Hadoop > Hbase' 카테고리의 다른 글

HBase Client 프로그래밍 with JAVA  (4) 2022.03.12