1. 서론
이번 포스팅에서는 Hbase가 제공하는 클라이언트 API : 관리 기능에 대해 알아보겠습니다.
Hbase는 데이터를 조작하는 API 뿐 만이 아닌 데이터 정의를 위한 클라이언트 API도 제공하고 있습니다.
2. 스키마 정의
Hbase에서는 테이블 생성 시 테이블 및 컬럼패밀리의 스키마를 정의해야 합니다.
1) 테이블
Hbase는 데이터를 저장하는 가장 상위의 개념으로 테이블을 사용합니다.
이런, 테이블의 특성을 클라이언트에서는 아래와 같은 지시자 클래스로 제공합니다.
TableDescriptorBuilder.newBuilder(TableName tableName).build();
TableDescriptorBuilder.newBuilder(TableDescriptor tableDescriptor).build();
TableName tableName = TableName.valueOf("tableName");
TableDescriptor tableDescriptor = new ModifyableTableDescriptor(tableName);
Hbase 의 테이블 명은 hdfs의 실제 디렉터리로 생성이되기 때문에 파일명 규칙에 따라 만들어야 합니다.
Hbase의 테이블은 논리적인 개념이며, 물리적으로는 여러개의 리전으로 분리가 되며 각 리전은 Hbase Region Server에 존재하게 됩니다.
아래는 위 설명을 간략하게 나타낸 그림입니다.
2) 테이블 속성
테이블 지시자 클래스에는 속성 설정을 위한 Getter, Setter를 제공합니다.
이름
아래와 같이 테이블 이름을 가져올 수 있습니다.
byte[] tableName1 = tableDescriptor.getTableName().getName();
String tableName2 = tableDescriptor.getTableName().getNameAsString();
수정의 경우 마이너 버전에서는 setName으로 가능했으나 현재는 테이블을 새로 생성하여 migration하는 방법을 권장하고 있습니다.
컬럼패밀리
테이블 정의 시 가장 중요한 부분은 컬럼패밀리입니다.
컬럼패밀리의 경우 아래와 같은 API를 통해 조작이 가능합니다.
tableDescriptor.getColumnFamilies();
tableDescriptor.getColumnFamily(byte[] column);
tableDescriptor.hasColumnFamily(byte[] column);
Admin admin = connection.getAdmin();
admin.addColumnFamily();
admin.deleteColumnFamily();
파일 최대 크기
테이블내의 리전이 커질 수 있는 최대 파일 크기 또한 조작이 가능합니다.
API 명세는 아래와 같습니다.
tableDescriptor.getMaxFileSize();
((ModifyableTableDescriptor) tableDescriptor).setMaxFileSize(1024000);
최대 크기 설정은 리전 크기가 해당 값에 도달했을때 시스템이 리전을 분할하는 기준이 됩니다.
읽기 전용
쓰기가 아닌 일기 전용 테이블을 만들어야 하는 경우 아래와 같은 API를 사용하면 됩니다.
tableDescriptor.isReadOnly();
((ModifyableTableDescriptor) tableDescriptor).setReadOnly(true);
멤스토어 플러시 크기
아래는 멤스토어에 있는 데이터를 HFile로 write하는 트리거링을 바이트 단위로 조작하고 싶은 경우 사용하는 API 입니다.
tableDescriptor.getMemStoreFlushSize();
((ModifyableTableDescriptor) tableDescriptor).setMemStoreFlushSize(102400);
3) 컬럼패밀리
TableDescriptor 와 같이 컬럼패밀리에 대한 설정을 담고 있는 클래스는 ColumnFamilyDescriptor 입니다.
컬럼패밀리 또한 저장소 계층의 디렉터리 이름으로 사용되기 때문에 파일명 규칙을 따라 생성해야 합니다.
아래는 컬럼패밀리 지시자 클래스 정의입니다.
ColumnFamilyDescriptor columnFamilyDescriptor1 =
ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("")).build();
ColumnFamilyDescriptor columnFamilyDescriptor2 =
ColumnFamilyDescriptorBuilder.newBuilder(new ColumnFamilyDescriptorBuilder.ModifyableColumnFamilyDescriptor(Bytes.toBytes(""))).build();
이름
아래와 같이 이름을 읽을 수 있습니다.
byte[] name1 = columnFamilyDescriptor.getName();
String name2 = columnFamilyDescriptor.getNameAsString();
Setter를 통해 이름을 설정할 수 는 없습니다.
최대 버전 갯수
컬럼패밀리 별로 값의 버전을 몇 개까지 보유할 지 지정할 수 있습니다.
columnFamilyDescriptor.getMaxVersions();
((ModifyableColumnFamilyDescriptor)columnFamilyDescriptor).setMaxVersions(100);
압축
컬럼패밀리에 저장된 데이터에 특정 압축기법을 적용할 수 있습니다.
Algorithm algorithm1 = columnFamilyDescriptor.getCompactionCompressionType();
Algorithm algorithm2 = columnFamilyDescriptor.getCompressionType();
((ModifyableColumnFamilyDescriptor)columnFamilyDescriptor).setCompactionCompressionType(Algorithm.GZ);
((ModifyableColumnFamilyDescriptor)columnFamilyDescriptor).setCompressionType(Algorithm.GZ);
Algorithm 은 Hbase 클라이언트에서 제공하는 enum으로 아래 값들이 있습니다.
- LZO
- GZ
- NONE
- SNAPPY
- LZ4
- BZIP2
- ZSTD
기본은 NONE으로 압축하지 않습니다.
블록크기
Hbase는 컬럼패밀리별로 HFile을 저장하게 됩니다.
그렇기 때문에, HFile의 블록 크기를 컬럼패밀리 지시자를 통해 조작이 가능합니다.
columnFamilyDescriptor.getBlocksize();
((ModifyableColumnFamilyDescriptor)columnFamilyDescriptor).setBlocksize(1024);
기본 HFile의 블록크기는 64KB로 기본 HDFS의 블록 크기인 64MB에 비교하여 1/1024 의 크기입니다.
블록 캐시
Hbase는 I/O 자원을 효율적으로 사용하기 위해 scan 연산 시 모든 블록을 읽어 메모리에 상주시켜놓고 재사용하게 합니다.
메모리에 올렸기 때문에 디스크에는 다시 접근하지 않아 I/O를 절약합니다.
columnFamilyDescriptor.isBlockCacheEnabled();
((ModifyableColumnFamilyDescriptor) columnFamilyDescriptor).setBlockCacheEnabled(false);
유효기간
Hbase 에서는 컬럼패밀리에 속한 데이터의 버전 뿐만이 아닌 유효기간도 설정도 가능합니다.
기본은 영원히 저장하도록 되어 있으며, 유효기간을 지정하게 되면 주 컴팩션시 유효기간이 지난 데이터들을 찾아 삭제합니다.
columnFamilyDescriptor.getTimeToLive();
((ModifyableColumnFamilyDescriptor) columnFamilyDescriptor).setTimeToLive(1000);
인메모리
위 블록캐시에서 말한 메모리에 대한 설정도 가능합니다.
columnFamilyDescriptor.isInMemory();
((ModifyableColumnFamilyDescriptor) columnFamilyDescriptor).setInMemory(true);
3. HBaseAdmin
Hbase에는 RDBMS의 DDL과 흡사한 기능을 제공하는 HBaseAdmin 클래스를 제공합니다.
HBaseAdmin 인스턴스는 아래와 같이 가져올 수 있습니다.
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "");
Connection connection = ConnectionFactory.createConnection(conf);
HBaseAdmin hBaseAdmin = (HBaseAdmin) connection.getAdmin();
1) 기본 기능
HBaseAdmin은 아래와 같은 기본 기능을 제공합니다.
1. getConnection()
연결 인스턴스를 반환하는 메소드입니다.
2. getConfiguration()
HBaseAdmin 인스턴스를 생성할 때 사용된 설정 인스턴스를 반환합니다.
3. close()
HBaseAdmin 인스턴스가 점유하고 있는 모든 자원을 해제합니다.
2) 테이블 관련 기능
HBaseAdmin은 DDL과 같이 테이블 생성을 위한 메서드를 제공합니다.
1. 생성
void createTable(TableDescriptor desc) throws IOException;
void createTable(TableDescriptor desc, byte[] startKey, byte[] endKey, int numRegions) throws IOException;
void createTable(final TableDescriptor desc, byte [][] splitKeys);
메서드 2번째를 보시면 테이블 생성 시 row key의 시작키와 끝키를 지정하여 특정 리전에 존재하는 테이블을 생성시킬 수 있습니다.
이때, 시작키는 끝키보다 작아야하며, 기본적으로 Hbase 의 리전은 시작키를 포함하고 끝키는 포함하지 않습니다.
numResions는 테이블이 확보해야하는 최소 리전 수를 의미하며
최소 3 이상이어야 합니다.
아래는 테이블 생성하는 간단한 예제입니다.
Connection connection = ConnectionFactory.createConnection(HBaseConfiguration.create());
HBaseAdmin hBaseAdmin = (HBaseAdmin) connection.getAdmin();
TableDescriptor desc = TableDescriptorBuilder.newBuilder(TableName.valueOf("testTable")).build();
hBaseAdmin.createTable(desc);
2. 조회
테이블이 존재하는지, 혹은 지정한 테이블의 스키마 정의를 아래와 같은 메서드를 통해 가져올 수 있습니다.
boolean tableExists(final TableName tableName) throws IOException;
HTableDescriptor[] listTables() throws IOException;
HTableDescriptor[] listTables(Pattern pattern) throws IOException;
HTableDescriptor[] listTables(String regex) throws IOException;
HTableDescriptor getTableDescriptor(final TableName tableName) throws IOException;
3. 삭제
테이블 삭제는 아래 메서드를 사용하시면 됩니다.
void deleteTable(final TableName tableName) throws IOException;
4. 비활성
HBase에서는 테이블 삭제 전 필수로 비활성을 시켜야 합니다.
비활성 메서드는 아래와 같습니다.
void disableTable(final TableName tableName) throws IOException;
비활성화 메서드는 아래와 같은 동작을 HBase에게 수행하도록 합니다.
- 모든 리전 서버에서 아직 적용하지 않은 변경사항 처리
- 모든 리전 닫음
- 해당 테이블의 모든 리전이 어떤 서버에도 배치되어 있지 않다는 정보를 메타( .META. ) 테이블에 기록
5. 활성화
HBaseAdmin은 테이블의 활성화 메서드도 제공하고 있습니다.
void enableTable(final TableName tableName) throws IOException;
6. 확인
지정 테이블이 활성화되어 있는지, 비활성화 되어 있는지 등의 상태를 확인하는 메서드는 아래와 같습니다.
boolean isTableEnabled(final TableName tableName) throws IOException;
boolean isTableDisabled(TableName tableName) throws IOException;
boolean isTableAvailable(TableName tableName) throws IOException;
isTableAvailable 메서드의 경우에는 테이블의 활성화 상태가 아닌 단지 존재하는지를 체크하는 메서드입니다.
7. 변경
테이블에 대한 정의를 변경도 가능합니다.
void modifyTable(TableDescriptor td) throws IOException;
단, 변경도 삭제와 동일하게 먼저 테이블을 비활성화 시킨 후 수행하여야 합니다.
3) 스키마 관련 기능
HBaseAdmin은 테이블의 컬럼 패밀리에 대한 정의도 변경 가능합니다.
void addColumnFamily(final TableName tableName, final ColumnFamilyDescriptor columnFamily) throws IOException;
void deleteColumnFamily(final TableName tableName, final byte[] columnFamily) throws IOException;
void modifyColumnFamily(final TableName tableName, final ColumnFamilyDescriptor columnFamily) throws IOException;
4) 클러스터 관련 기능
HBaseAdmin 클래스는 클러스터에 관련된 정보를 확인 및 조작할 수 있는 메서드를 제공합니다.
1. void flush(final TableName tableName) throws IOException
멤스토어에 있는 정보들을 강제로 disk write 하도록 수행하는 메서드입니다.
2. void compact(final TableName tableName) throws IOException
지정한 테이블을 컴팩션 대기열에 넣는 메서드입니다.
3. void majorCompact(final TableName tableName) throws IOException
지정 테이블에 대해 주 컴팩션이 일어나도록 트리거링하는 메서드입니다.
4. void split(final TableName tableName) throws IOException
지정 테이블에 대해 분할 작업을 수행시키는 메서드입니다.
지정 테이블의 모든 리전을 이터레이트하여 분할 작업을 자동적으로 호출합니다.
5. void assign(final byte [] regionName) throws
MasterNotRunningException, ZooKeeperConnectionException, IOException
리전을 할당할 때 사용하는 메서드입니다.
6. void unassign(final byte [] regionName, final boolean force) throws IOException
assign과 반대로 리전을 해제할 때 사용하는 메서드입니다.
7. void move(final byte[] encodedRegionName, ServerName destServerName) throws IOException
지정 리전을 특정 서버로 이동시키는 메서드입니다.
즉, 클라이언트는 능동적으로 특정 리전을 현재 배치된 서버가 아닌 다른 서버로 옮길 수 있습니다.
8. boolean balancerSwitch(final boolean on, final boolean synchronous) throws IOException
리전 밸런서를 키거나 끄는 메서드 입니다.
리번 밸런서랑 해당 리전이 지정 크기보다 커지는 경우 분할 시켜 다른 리전 서버로 보내는 역할을 합니다.
9. synchronized void shutdown() throws IOException
클러스터를 중단할 때 사용합니다.
10. synchronized void stopMaster() throws IOException
마스터 서버를 중단할 때 사용합니다.
11. synchronized void stopRegionServer(final String hostnamePort) throws IOException
특정 리전 서버만을 중단 할 때 사용합니다.
4. 마무리
이번 포스팅에서는 클라이언트 API : 관리 기능에 대해 진행하였습니다.
다음 포스팅에서는 챕터 6장인 클라이언트 종류에 대해 진행하겠습니다.
'BigData > Hbase' 카테고리의 다른 글
(4) 클라이언트 API : 고급 기능 (0) | 2020.04.19 |
---|---|
(3) 클라이언트 API : 기본 기능 (0) | 2020.04.09 |
(2) 설치 (0) | 2020.04.08 |
(1) 소개 (0) | 2020.04.07 |