HBase와 Bigtable의 차이점
Bigtable에 액세스하는 한 가지 방법은 자바용 Apache HBase 클라이언트의 커스텀 버전을 사용하는 것입니다. 일반적으로 커스텀 설정된 클라이언트는 HBase의 표준 설치와 동일한 API를 노출합니다. 이 페이지에서는 자바용 Cloud Bigtable HBase 클라이언트와 표준 HBase 설치의 차이점을 설명합니다. 이러한 차이점은 대부분 Bigtable에서 자동으로 처리하는 관리 작업과 관련이 있습니다.
자바용 Cloud Bigtable HBase 클라이언트는 HBase에서 Bigtable로 마이그레이션하고 HBase API를 계속 사용하려는 고객을 위한 것입니다. 다른 모든 경우에는 Java 개발자가 Bigtable API를 호출하는 Java용 Cloud Bigtable 클라이언트를 대신 사용해야 합니다.
column family
column family를 만들 때 HBase 셸 또는 HBase API를 통해 블록 크기나 압축 방법을 구성할 수 없습니다. 블록 크기와 압축은 Bigtable에서 관리합니다.
HBase 셸을 사용하여 테이블에 대한 정보를 얻을 경우 항상 HBase 셸은 각 column family가 압축을 사용하지 않는다고 보고합니다. 실제로 Bigtable은 모든 데이터에 독점적인 압축 방법을 사용합니다.
Bigtable은 기본 스토리지를 관리하므로 다음 column family 설정은 무시됩니다.
BLOCKCACHEBLOCKSIZEBLOOMFILTERCACHE_BLOOMS_ON_WRITECACHE_DATA_IN_L1CACHE_DATA_ON_WRITECACHE_INDEX_ON_WRITECOMPRESS_TAGSCOMPRESSIONCOMPRESSION_COMPACTDATA_BLOCK_ENCODINGEVICT_BLOCKS_ON_CLOSEIN_MEMORYKEEP_DELETED_CELLSPREFETCH_BLOCKS_ON_OPENREPLICATION_SCOPE
VERSIONS, MIN_VERSIONS, TTL 설정은 Bigtable 가비지 컬렉션 정책으로 변환됩니다.
Bigtable에서 column family 이름이 정규 표현식 [_a-zA-Z0-9][-_.a-zA-Z0-9]*을 준수해야 합니다. HBase에서 Bigtable로 데이터를 가져올 경우 먼저 이 패턴에 따라 column family 이름을 변경해야 할 수 있습니다.
행 및 셀
- 개별 행에 ACL을 정의할 수 없습니다. Bigtable 승인된 뷰를 사용하면 테이블 데이터의 하위 집합에 대한 액세스 권한을 부여할 수 있지만 HBase API를 통해 노출되지는 않습니다.
- 개별 셀에 공개 상태를 설정할 수 없습니다.
- 태그는 지원되지 않습니다.
org.apache.hadoop.hbase.Tag클래스를 사용하여 개별 셀에 메타데이터를 추가할 수 없습니다. 셀에 추가하는 모든 태그는 셀이 작성되기 전에 삭제됩니다.
변형 및 삭제
- Bigtable의
Append작업은 리더와 작성자에 대해 완전한 원자성을 가집니다. 리더는 부분적으로 적용된Append작업을 읽을 수 없습니다. Increment작업은 원자적이지만Increment에 기간을 설정하는 것은 지원되지 않습니다.Table#mutateRow()에 전달하는RowMutations객체에는Put및Delete작업 또는Append및Increment작업이 포함될 수 있지만 둘 다 포함될 수는 없습니다.Append또는Increment작업이 포함된RowMutations객체는batch(),checkAndMutate()또는BufferedMutator에서 지원되지 않습니다.타임스탬프를 기준으로 특정 열의 특정 버전을 삭제할 수 있습니다. 하지만 다음 유형의 삭제는 지원되지 않습니다.
- 열의 최신 버전만 삭제
- 특정 타임스탬프가 있는 행의 모든 값 삭제
- 특정 타임스탬프 또는 그 이전에 column family의 모든 값 삭제
따라서
org.apache.hadoop.hbase.client.Delete클래스의 다음 메서드는 지원되지 않습니다. +new Delete(byte[] row, long timestamp)+addColumn(byte[] family, byte[] qualifier)+addFamily(byte[] family, long timestamp)+addFamilyVersion(byte[] family, long timestamp)HBase에서 마스킹을 삭제하지만, 삭제 요청 후 마스킹 요청이 전송될 때 Bigtable에서 삭제 후 마스킹을 수행하지 않습니다. 즉, Bigtable에서 셀에 전송된 쓰기 요청은 이전에 동일한 셀로 전송된 삭제 요청의 영향을 받지 않습니다.
가져오기 및 검색
- 역방향 스캔을 사용하면 행 범위를 역방향으로 읽을 수 있습니다. 자세한 내용은 역방향 스캔을 참조하세요.
- HBase와 달리 읽기 요청을 전송할 때 Bigtable은 예정된 가비지 컬렉션 주기에 삭제하도록 표시된 만료된 데이터를 자동으로 필터링하지 않습니다. 만료된 데이터를 읽지 않으려면 읽기 요청에서 필터를 사용하세요. 자세한 내용은 가비지 컬렉션 개요를 참조하세요.
- column family를 기준으로 각 행에 있는 값의 수를 제한하는 것은 지원되지 않습니다.
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)메서드를 호출할 수 없습니다. - 부분 결과는 지원되지 않습니다. 행은 항상 전체가 반환됩니다.
org.apache.hadoop.hbase.client.Scan#setBatch(int batch)및org.apache.hadoop.hbase.client.Scan#setAllowPartialResults(boolean allowPartialResults)메서드 호출은 무시됩니다. - 동기식
Table#getScanner(Scan)호출에서org.apache.hadoop.hbase.client.Scan#setCaching(int caching)는 클라이언트가 한 번에 가져오는 행 수를 제어합니다.AsyncTable#getScanner()는setCaching()를 무시합니다.org.apache.hadoop.hbase.client.Scan#setMaxResultSize(long maxResultSize)메서드 호출은 항상 무시됩니다.
보조 프로세서
보조 프로세서는 지원되지 않습니다. org.apache.hadoop.hbase.coprocessor 인터페이스를 구현하는 클래스를 만들 수 없습니다.
필터
다음 표에는 org.apache.hadoop.hbase.filter 패키지에서 지원되는 필터가 나와 있습니다. 해당 패키지의 다른 모든 필터는 지원되지 않으며 UnsupportedOperationException를 발생시킵니다.
| 지원됨 | 지원됨, 제한 있음 |
|---|---|
|
|
ColumnCountGetFilterColumnPrefixFilterFilterListFirstKeyOnlyFilterFuzzyRowFilterMultipleColumnPrefixFilterPrefixFilter 1RandomRowFilterTimestampsFilter
|
ColumnPaginationFilter 2ColumnRangeFilter 3FamilyFilter 4KeyOnlyFilter 5MultiRowRangeFilter 6PageFilter 7QualifierFilter 8RowFilter 4SingleColumnValueExcludeFilter 3, 9, 10SingleColumnValueFilter 9, 10ValueFilter 9WhileMatchFilter 6, 11
|
또한 다음 차이점이 Bigtable 필터에 영향을 미칩니다.
- 비교 연산자
BinaryComparator및RegexStringComparator만 지원됩니다. 다른 모든 비교 연산자는 지원되지 않으며UnsupportedOperationException를 발생시킵니다. - 정규 표현식 비교 연산자(
org.apache.hadoop.hbase.filter.RegexStringComparator)를 사용하는 필터에서 정규 표현식은 자바 문법이 아닌 RE2 문법을 사용합니다. - 커스텀 필터는 지원되지 않습니다.
org.apache.hadoop.hbase.filter.Filter에서 상속되는 클래스를 만들 수 없습니다. HBase에 상응하는 항목이 없는 Bigtable 필터를 사용하려면com.google.cloud.bigtable.hbase.filter.BigtableFilter로 래핑합니다. - 필터 표현식의 크기는 20KB로 제한되며 필터는 20개 수준을 초과하여 중첩될 수 없습니다. 필터 표현식의 크기를 줄이기 위한 해결 방법으로 필터 기준의 해시 값을 저장하는 보조 열을 사용합니다.
타임스탬프
Bigtable은 타임스탬프를 마이크로초 단위로 저장하고, HBase는 타임스탬프를 밀리초 단위로 저장합니다. 이러한 차이는 Bigtable용 HBase 클라이언트 라이브러리를 사용하고 데이터에 역방향 타임스탬프가 있을 때 적용됩니다.
클라이언트 라이브러리는 마이크로초와 밀리초 간에 전환하지만 Bigtable에서 저장할 수 있는 최대 HBase 타임스탬프가 Long.MAX_VALUE/1000이므로 이보다 큰 값은 모두 Long.MAX_VALUE/1000으로 변환됩니다. 따라서 큰 역방항 타임스탬프 값이 올바르게 변환되지 않을 수 있습니다.
관리
이 섹션에서는 자바용 Bigtable HBase 클라이언트가 org.apache.hadoop.hbase.client.Admin 인터페이스를 구현하는 방법을 설명합니다. Bigtable은 대부분의 클러스터 및 스토리지 관리 작업을 자동으로 처리하므로 많은 HBase 관리 메서드를 적용할 수 없습니다. 이 섹션에 지원되거나 효과가 없는 것으로 나열되지 않은 Admin 메서드는 지원되지 않으며 UnsupportedOperationException를 발생시킵니다.
테이블 관리
테이블 및 column family를 관리하기 위해 다음 Admin 메서드가 지원됩니다.
addColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily)및addColumnFamilyAsync(TableName tableName, ColumnFamilyDescriptor columnFamily)(HBase 1.x:addColumn(TableName tableName, HColumnDescriptor column))createTable(TableDescriptor desc),createTable(TableDescriptor desc, byte[][] splitKeys),createTable(TableDescriptor desc, byte[] startKey, byte[] endKey, int numRegions),createTableAsync(TableDescriptor desc),createTableAsync(TableDescriptor desc, byte[][] splitKeys)deleteColumnFamily(TableName tableName, byte[] columnName)및deleteColumnFamilyAsync(TableName tableName, byte[] columnName)(HBase 1.x:deleteColumn(TableName tableName, byte[] columnName))deleteTable(TableName tableName),deleteTableAsync(TableName tableName),deleteTables(Pattern pattern),deleteTables(String regex)disableTable(TableName tableName),disableTableAsync(TableName tableName),disableTables(Pattern pattern),disableTables(String regex)enableTable(TableName tableName),enableTableAsync(TableName tableName),enableTables(Pattern pattern),enableTables(String regex)getAlterStatus(TableName tableName)및getAlterStatus(byte[] tableName)getDescriptor(TableName tableName),getTableDescriptor(TableName tableName),getTableDescriptors(List<String> names),getTableDescriptorsByTableName(List<TableName> tableNames)isTableAvailable(TableName tableName)및isTableAvailable(TableName tableName, byte[][] splitKeys)isTableDisabled(TableName tableName)및isTableEnabled(TableName tableName)listTableDescriptors(),listTableDescriptors(List<TableName> tableNames),listTableDescriptors(Pattern pattern),listTableDescriptors(Pattern pattern, boolean includeSysTables)(HBase 1.x:listTables(),listTables(Pattern pattern),listTables(Pattern pattern, boolean includeSysTables),listTables(String regex),listTables(String regex, boolean includeSysTables))listTableNames(),listTableNames(Pattern pattern),listTableNames(Pattern pattern, boolean includeSysTables),listTableNames(String regex),listTableNames(String regex, boolean includeSysTables)modifyColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily)및modifyColumnFamilyAsync(TableName tableName, ColumnFamilyDescriptor columnFamily)(HBase 1.x:modifyColumn(TableName tableName, HColumnDescriptor column))modifyTable(TableDescriptor td),modifyTable(TableName tableName, TableDescriptor td),modifyTableAsync(TableDescriptor td),modifyTableAsync(TableName tableName, TableDescriptor td)tableExists(TableName tableName)truncateTable(TableName tableName, boolean preserveSplits)andtruncateTableAsync(TableName tableName, boolean preserveSplits)
다음과 같이 지원되는 테이블 관리 메서드는 Bigtable에서 다르게 작동하거나 특정 매개변수를 무시합니다.
- Bigtable 테이블은 사용 중지할 수 없습니다.
disableTable(),disableTableAsync(),disableTables(),enableTable(),enableTableAsync(),enableTables()는 클라이언트 메모리(isTableDisabled()및isTableEnabled()가 읽음)에서만 테이블 상태를 변경합니다. modifyTable()및modifyTableAsync()는 열 계열에만 변경사항을 적용합니다. 테이블 수준 속성은 무시됩니다.truncateTable()및truncateTableAsync()는 테이블의 모든 데이터를 삭제합니다.preserveSplits파라미터는 무시됩니다.includeSysTables매개변수를 허용하는listTableDescriptors(),listTables(),listTableNames()오버로드는includeSysTables를 무시합니다. Bigtable에는 시스템 테이블이 없기 때문입니다.isTableAvailable(TableName tableName, byte[][] splitKeys)는 테이블이 있는지 여부만 확인하고splitKeys매개변수를 무시합니다.- Bigtable의 스키마 수정은 동기식이므로
getAlterStatus()는 항상(0, 0)를 반환합니다.
테이블 압축 및 분할과 같은 작업은 자동으로 처리됩니다. 따라서 다음과 같은 메서드는 아무런 효과가 없습니다.
compact(TableName tableName)compact(TableName tableName, byte[] columnFamily)majorCompact(TableName tableName)majorCompact(TableName tableName, byte[] columnFamily)split(TableName tableName)split(TableName tableName, byte[] splitPoint)
스냅샷
HBase 스냅샷 메서드는 Bigtable 백업을 만들고 관리합니다. 백업은 특정 클러스터에 저장되므로 인스턴스에 클러스터가 두 개 이상 있는 경우 사용할 클러스터에 google.bigtable.snapshot.cluster.id 구성 속성을 설정해야 합니다. snapshot()로 만드는 백업은 구성 속성 google.bigtable.snapshot.default.ttl.secs의 초 수(기본값: 24시간)가 지나면 만료됩니다.
cloneSnapshot()는 백업에서 새 테이블로 복원합니다.
Admin에서는 다음 스냅샷 메서드가 지원됩니다.
cloneSnapshot(byte[] snapshotName, TableName tableName)cloneSnapshot(String snapshotName, TableName tableName)deleteSnapshot(byte[] snapshotName)deleteSnapshot(String snapshotName)snapshot(byte[] snapshotName, TableName tableName)snapshot(String snapshotName, TableName tableName)
또한 AsyncAdmin는 listSnapshots(), listSnapshots(Pattern
pattern), snapshot(SnapshotDescription snapshot)를 지원합니다. restoreSnapshot(), deleteSnapshots(), deleteTableSnapshots(), listTableSnapshots(), cloneSnapshot(String
snapshotName, TableName tableName, boolean restoreAcl)를 포함한 다른 모든 스냅샷 메서드는 지원되지 않으며 UnsupportedOperationException를 발생시킵니다.
리전 관리
Bigtable은 리전과 유사한 태블릿을 사용하며, 리전 정보를 검색하는 다음 메서드가 지원되며 표준 HBase와 차이가 있습니다.
getRegions(TableName tableName)및getTableRegions(TableName tableName)와 인터페이스org.apache.hadoop.hbase.client.RegionLocator의 메서드는 테이블의 row key 샘플을 기반으로 대략적인 경계를 반환합니다. 반환된 리전의 서버 이름은 실제 서버가 아닙니다.getRegionMetrics(ServerName serverName, TableName tableName)는serverName파라미터를 무시하고 테이블의 row key 샘플을 기반으로 대략적인 리전 크기 측정항목을 반환합니다.
Bigtable은 태블릿을 자동으로 관리하므로 다음 메서드는 영향을 미치지 않습니다.
assign(byte[] regionName)compactRegion(byte[] regionName)compactRegion(byte[] regionName, byte[] columnFamily)flushRegion(byte[] regionName)majorCompactRegion(byte[] regionName)majorCompactRegion(byte[] regionName, byte[] columnFamily)splitRegion(byte[] regionName)splitRegion(byte[] regionName, byte[] splitPoint)
HBase 1.x에서는 compactRegionServer(ServerName sn, boolean major), mergeRegions(byte[] encodedNameOfRegionA, byte[] encodedNameOfRegionB, boolean
forcible), move(byte[] encodedRegionName, byte[] destServerName), unassign(byte[] regionName, boolean force)도 영향을 미치지 않습니다. 이에 상응하는 HBase 2.x는 지원되지 않으며 UnsupportedOperationException를 발생시킵니다.
클러스터 상태 및 연결
Bigtable은 클러스터 유지보수 작업을 자동으로 처리하므로 Admin의 유지보수 메서드는 UnsupportedOperationException을 발생시킵니다. 다음 연결 및 상태 메서드만 지원됩니다.
close()는 효과가 없습니다.getClusterMetrics(),getClusterMetrics(EnumSet<Option> options),getClusterStatus()는 빈 서버 목록이 있는 플레이스홀더 값을 반환하고getClusterMetrics(EnumSet<Option> options)는options매개변수를 무시합니다.getConfiguration()는 클라이언트Configuration객체를 반환합니다.getConnection()는 클라이언트Connection객체를 반환합니다.
네임스페이스
Bigtable은 네임스페이스를 사용하지 않습니다. row key 프리픽스를 사용하여 네임스페이스를 시뮬레이션할 수 있습니다.
기본적으로 모든 네임스페이스 메서드는 UnsupportedOperationException를 발생시킵니다.
하지만 구성 속성 google.bigtable.namespace.warnings를 true로 설정하면 다음 메서드는 예외를 발생시키는 대신 경고를 로깅하고 아무런 영향을 미치지 않습니다(null 또는 빈 결과 반환).
createNamespace(NamespaceDescriptor descriptor)deleteNamespace(String name)deleteNamespaceAsync(String name)getNamespaceDescriptor(String name)listNamespaceDescriptors()listTableDescriptorsByNamespace(byte[] name)listTableDescriptorsByNamespace(String name)listTableNamesByNamespace(String name)modifyNamespace(NamespaceDescriptor descriptor)
google.bigtable.namespace.warnings가 true로 설정된 경우에도 listNamespaces()는 UnsupportedOperationException를 발생시킵니다.
기타 관리 기능
Bigtable은 다음 카테고리의 Admin 메서드를 지원하지 않으며, 이를 호출하면 UnsupportedOperationException이 발생합니다.
- 지역 그룹: Bigtable에서는 column family의 지역 그룹을 지정할 수 없습니다.
- 보조 프로세서 및 분산 프로시져: Bigtable은 보조 프로세서 또는 분산 프로시져를 지원하지 않습니다.
- 할당량: Bigtable 할당량에 대해 알아보려면 할당량 및 한도를 참조하세요.
- 복제: Bigtable은 인스턴스의 클러스터 간에 데이터를 자동으로 복제합니다. 자세한 내용은 복제 개요를 참조하세요. HBase에서 Bigtable로 복제하려면 HBase에서 Bigtable로 복제를 참조하세요.
- 액세스 제어: Bigtable은 액세스 제어에 IAM을 사용합니다.
- RegionServer 그룹: Bigtable은 서버를 자동으로 관리하며 RegionServer 그룹을 노출하지 않습니다.