HBase와 Bigtable의 차이점

Bigtable에 액세스하는 한 가지 방법은 Java용 Apache HBase 클라이언트의 커스텀 버전을 사용하는 것입니다. 일반적으로 커스텀 설정된 클라이언트는 HBase의 표준 설치와 동일한 API를 노출합니다. 이 페이지에서는 자바용 Cloud Bigtable HBase 클라이언트와 표준 HBase 설치의 차이점을 설명합니다. 이러한 차이점은 대부분 Bigtable에서 자동으로 처리하는 관리 작업과 관련이 있습니다.

column family

column family를 만들 때 HBase 셸 또는 HBase API를 통해 블록 크기나 압축 방법을 구성할 수 없습니다. 블록 크기와 압축은 Bigtable에서 관리합니다.

HBase 셸을 사용하여 테이블에 대한 정보를 얻을 경우 항상 HBase 셸은 각 column family가 압축을 사용하지 않는다고 보고합니다. 실제로 Bigtable은 모든 데이터에 독점적인 압축 방법을 사용합니다.

Bigtable에서 column family 이름이 정규 표현식 [_a-zA-Z0-9][-_.a-zA-Z0-9]*을 준수해야 합니다. HBase에서 Bigtable로 데이터를 가져올 경우 먼저 이 패턴에 따라 column family 이름을 변경해야 할 수 있습니다.

행 및 셀

  • 개별 행에 ACL을 정의할 수 없습니다.
  • 개별 셀에 공개 상태를 설정할 수 없습니다.
  • 태그는 지원되지 않습니다. org.apache.hadoop.hbase.Tag 클래스를 사용하여 개별 셀에 메타데이터를 추가할 수 없습니다.

변형 및 삭제

  • Bigtable의 Append 작업은 리더와 작성자에 대해 완전한 원자성을 가집니다. 리더는 부분적으로 적용된 Append 작업을 읽을 수 없습니다.
  • 타임스탬프를 기반으로 특정 열의 특정 버전을 삭제할 수는 있지만 지정된 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에서 셀에 전송된 쓰기 요청은 이전에 동일한 셀로 전송된 삭제 요청의 영향을 받지 않습니다.

가져오기 및 검색

보조 프로세서

보조 프로세서는 지원되지 않습니다. org.apache.hadoop.hbase.coprocessor 인터페이스를 구현하는 클래스를 만들 수 없습니다.

필터

다음 표에는 지원되는 필터가 나와 있습니다. 이 모든 필터는 org.apache.hadoop.hbase.filter 패키지에 있습니다.

지원 지원됨, 제한 있음 지원되지 않음
  1. 단일 column family만 지원됩니다.
  2. setLenAsVal(true) 호출은 지원되지 않습니다.
  3. BinaryComparator 비교 연산자만 지원됩니다. EQUAL 이외의 연산자를 사용할 경우 단일 column family만 지원됩니다.
  4. 다음 비교 연산자만 지원됩니다.
    • BinaryComparator
    • 플래그(플래그는 무시됨) 및 EQUAL 연산자가 없는 RegexStringComparator
  5. PageFilterFilterList에 있는 경우 FilterList가 기본 동작인 MUST_PASS_ALL로 설정된 경우에만 PageFilter가 HBase와 유사하게 작동합니다. FilterListMUST_PASS_ONE으로 설정되면 Bigtable은 PageFilterMUST_PASS_ALL로 취급하고 PageFilter의 pageSize에 해당하는 행 개수만 반환합니다.
  6. 대부분의 경우 PrefixFilterPrefixFilter의 행을 검색합니다. 그러나 PrefixFilterFilterList에 속하고 연산자가 MUST_PASS_ONE인 경우 Bigtable은 암시적 범위를 파악할 수 없으며 대신 시작 행부터 중지 행까지 필터를 적용하지 않고 검색을 수행합니다. 이 경우 PrefixFilterBigtableExtendedScan 또는 필터 조합과 함께 사용하여 성능을 최적화할 수 있습니다.
  7. 속도가 느릴 수 있는 Bigtable 조건 필터를 사용합니다. 지원되지만 권장되지 않습니다.
ColumnPrefixFilter
FamilyFilter
FilterList
FuzzyRowFilter
MultipleColumnPrefixFilter
MultiRowRangeFilter
PrefixFilter 6
RandomRowFilter
TimestampsFilter
ColumnCountGetFilter 1
ColumnPaginationFilter 1
ColumnRangeFilter 1
FirstKeyOnlyFilter 1
KeyOnlyFilter 2
PageFilter 5
QualifierFilter 3
RowFilter 1, 4
SingleColumnValueExcludeFilter 1, 4, 7
SingleColumnValueFilter 4, 7
ValueFilter 4
DependentColumnFilter
FirstKeyValueMatchingQualifiersFilter
InclusiveStopFilter
ParseFilter
SkipFilter
WhileMatchFilter

또한 다음 차이점이 Bigtable 필터에 영향을 미칩니다.

  • 정규 표현식 비교 연산자(org.apache.hadoop.hbase.filter.RegexStringComparator)를 사용하는 필터에서 정규 표현식은 자바 구문이 아닌 RE2 구문을 사용합니다.
  • 커스텀 필터는 지원되지 않습니다. org.apache.hadoop.hbase.filter.Filter에서 상속되는 클래스를 만들 수 없습니다.
  • 필터 표현식의 크기는 20KB로 제한됩니다. 필터 표현식의 크기를 줄이는 방법은 필터 기준의 해시 값을 저장하는 보조 열을 사용하는 것입니다.

타임스탬프

Bigtable은 타임스탬프를 마이크로초 단위로 저장하고, HBase는 타임스탬프를 밀리초 단위로 저장합니다. 이러한 차이는 Bigtable용 HBase 클라이언트 라이브러리를 사용하고 데이터에 역방향 타임스탬프가 있을 때 적용됩니다.

클라이언트 라이브러리는 마이크로초와 밀리초 간에 전환하지만 Bigtable에서 저장할 수 있는 최대 HBase 타임스탬프가 Long.MAX_VALUE/1000이므로 이보다 큰 값은 모두 Long.MAX_VALUE/1000으로 변환됩니다. 따라서 큰 역방항 타임스탬프 값이 올바르게 변환되지 않을 수 있습니다.

관리

이 섹션에서는 Bigtable에서 사용할 수 없거나 Bigtable에서 HBase와 다르게 작동하는 org.apache.hadoop.hbase.client.Admin 인터페이스의 메서드를 설명합니다. 이 목록은 완전한 목록이 아니며 최근에 추가된 HBase API 메서드를 반영하지 않을 수 있습니다.

관리 작업이 자동으로 처리되기 때문에 이러한 대부분의 메서드는 Bigtable에서 필요하지 않습니다. 일부 메서드는 Bigtable에서 지원하지 않는 기능과 관련되어 있어 사용할 수 없습니다.

일반 유지보수 작업

Bigtable은 대부분의 유지보수 작업을 자동으로 처리합니다. 따라서 다음과 같은 메서드는 사용할 수 없습니다.

  • abort(String why, Throwable e)
  • balancer()
  • enableCatalogJanitor(boolean enable)
  • getMasterInfoPort()
  • getOperationTimeout()
  • isCatalogJanitorEnabled()
  • rollWALWriter(ServerName serverName)
  • runCatalogScan()
  • setBalancerRunning(boolean on, boolean synchronous)
  • shutdown()
  • stopMaster()
  • updateConfiguration()
  • updateConfiguration(ServerName serverName)

지역 그룹

Bigtable에서 column family에 대한 지역 그룹을 지정할 수 없습니다 결과적으로 지역 그룹을 반환하는 HBase 메서드를 호출할 수 없습니다.

네임스페이스

Bigtable은 네임스페이스를 사용하지 않습니다. row key 프리픽스를 사용하여 네임스페이스를 시뮬레이션할 수 있습니다. 다음과 같은 메서드는 사용할 수 없습니다.

  • createNamespace(NamespaceDescriptor descriptor)
  • deleteNamespace(String name)
  • getNamespaceDescriptor(String name)
  • listNamespaceDescriptors()
  • listTableDescriptorsByNamespace(String name)
  • listTableNamesByNamespace(String name)
  • modifyNamespace(NamespaceDescriptor descriptor)

리전 관리

Bigtable은 리전과 유사한 태블릿을 사용하며, 태블릿을 자동으로 관리합니다. 따라서 다음과 같은 메서드는 사용할 수 없습니다.

  • assign(byte[] regionName)
  • closeRegion(byte[] regionname, String serverName)
  • closeRegion(ServerName sn, HRegionInfo hri)
  • closeRegion(String regionname, String serverName)
  • closeRegionWithEncodedRegionName(String encodedRegionName, String serverName)
  • compactRegion(byte[] regionName)
  • compactRegion(byte[] regionName, byte[] columnFamily)
  • compactRegionServer(ServerName sn, boolean major)
  • flushRegion(byte[] regionName)
  • getAlterStatus(byte[] tableName)
  • getAlterStatus(TableName tableName)
  • getCompactionStateForRegion(byte[] regionName)
  • getOnlineRegions(ServerName sn)
  • majorCompactRegion(byte[] regionName)
  • majorCompactRegion(byte[] regionName, byte[] columnFamily)
  • mergeRegions(byte[] encodedNameOfRegionA, byte[] encodedNameOfRegionB, boolean forcible)
  • move(byte[] encodedRegionName, byte[] destServerName)
  • offline(byte[] regionName)
  • splitRegion(byte[] regionName)
  • splitRegion(byte[] regionName, byte[] splitPoint)
  • stopRegionServer(String hostnamePort)
  • unassign(byte[] regionName, boolean force)

스냅샷

다음과 같은 메서드를 사용할 수 없습니다.

  • deleteSnapshots(Pattern pattern)
  • deleteSnapshots(String regex)
  • isSnapshotFinished(HBaseProtos.SnapshotDescription snapshot)
  • restoreSnapshot(byte[] snapshotName)
  • restoreSnapshot(String snapshotName)
  • restoreSnapshot(byte[] snapshotName, boolean takeFailSafeSnapshot)
  • restoreSnapshot(String snapshotName, boolean takeFailSafeSnapshot)
  • snapshot(HBaseProtos.SnapshotDescription snapshot)

테이블 관리

테이블 압축과 같은 작업은 자동으로 처리됩니다. 따라서 다음과 같은 메서드는 사용할 수 없습니다.

  • compact(TableName tableName)
  • compact(TableName tableName, byte[] columnFamily)
  • flush(TableName tableName)
  • getCompactionState(TableName tableName)
  • majorCompact(TableName tableName)
  • majorCompact(TableName tableName, byte[] columnFamily)
  • modifyTable(TableName tableName, HTableDescriptor htd)
  • split(TableName tableName)
  • split(TableName tableName, byte[] splitPoint)

보조 프로세서

Bigtable에서는 보조 프로세서를 지원하지 않습니다. 따라서 다음과 같은 메서드는 사용할 수 없습니다.

  • coprocessorService()
  • coprocessorService(ServerName serverName)
  • getMasterCoprocessors()

분산 절차

Bigtable은 분산 절차를 지원하지 않습니다. 따라서 다음과 같은 메서드는 사용할 수 없습니다.

  • execProcedure(String signature, String instance, Map<String, String> props)
  • execProcedureWithRet(String signature, String instance, Map<String, String> props)
  • isProcedureFinished(String signature, String instance, Map<String, String> props)