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
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 |
---|