Diferenças entre o HBase e o Bigtable

Uma forma de aceder ao Bigtable é usar uma versão personalizada do cliente Apache HBase para Java. Em geral, o cliente personalizado expõe a mesma API que uma instalação padrão do HBase. Esta página descreve as diferenças entre o cliente HBase do Cloud Bigtable para Java e uma instalação padrão do HBase. Muitas destas diferenças estão relacionadas com tarefas de gestão que o Bigtable processa automaticamente.

O cliente HBase do Cloud Bigtable para Java destina-se a clientes que estão a migrar do HBase para o Bigtable e querem continuar a usar a API HBase. Em todos os outros casos, os programadores Java devem usar o cliente do Cloud Bigtable para Java, que chama as APIs Bigtable.

Famílias de colunas

Quando cria uma família de colunas, não pode configurar o tamanho do bloco nem o método de compressão, quer com a shell do HBase, quer através da API HBase. O Bigtable gere o tamanho do bloco e a compressão por si.

Além disso, se usar o shell do HBase para obter informações sobre uma tabela, o shell do HBase indica sempre que cada família de colunas não usa compressão. Na realidade, o Bigtable usa métodos de compressão proprietários para todos os seus dados.

O Bigtable requer que os nomes das famílias de colunas sigam a expressão regular [_a-zA-Z0-9][-_.a-zA-Z0-9]*. Se estiver a importar dados para o Bigtable a partir do HBase, pode ter de alterar primeiro os nomes das famílias para seguirem este padrão.

Linhas e células

  • Não pode definir uma LCA para uma linha individual.
  • Não pode definir a visibilidade de células individuais.
  • As etiquetas não são suportadas. Não pode usar a classe org.apache.hadoop.hbase.Tag para adicionar metadados a células individuais.

Mutações e eliminações

  • As operações Append no Bigtable são totalmente atómicas para leitores e escritores. Os leitores nunca vão poder ler uma operação Append parcialmente aplicada.
  • A eliminação de uma versão específica de uma coluna específica com base na respetiva data/hora é suportada, mas a eliminação de todos os valores com uma data/hora específica numa determinada família de colunas ou linha não é suportada. Os seguintes métodos na classe org.apache.hadoop.hbase.client.Delete não são suportados:
    • new Delete(byte[] row, long timestamp)
    • addColumn(byte[] family, byte[] qualifier)
    • addFamily(byte[] family, long timestamp)
    • addFamilyVersion(byte[] family, long timestamp)
  • No HBase, deletes mask puts, mas o Bigtable não mascara as inserções após as eliminações quando os pedidos de inserção são enviados após os pedidos de eliminação. Isto significa que, no Bigtable, um pedido de gravação enviado para uma célula não é afetado por um pedido de eliminação enviado anteriormente para a mesma célula.

Obtém e analisa

Coprocessadores

Os coprocessadores não são suportados. Não pode criar classes que implementem a interface org.apache.hadoop.hbase.coprocessor.

Filtros

A tabela seguinte mostra os filtros suportados. Todos estes filtros estão no pacote org.apache.hadoop.hbase.filter.

Suportado Suportado, com limitações Não suportado
  1. Suporta apenas uma família de colunas.
  2. As chamadas para o número setLenAsVal(true) não são suportadas.
  3. Suporta apenas o comparador BinaryComparator. Se for usado qualquer operador que não seja EQUAL, apenas é suportada uma família de colunas.
  4. Apenas suporta os seguintes comparadores:
    • BinaryComparator
    • RegexStringComparator sem etiquetas (as etiquetas são ignoradas) e o operador EQUAL
  5. Se um PageFilter estiver num FilterList, PageFilter só funciona de forma semelhante ao HBase quando o FilterList está definido como MUST_PASS_ALL, que é o comportamento predefinido. Se o FilterList estiver definido como MUST_PASS_ONE, o Bigtable trata o PageFilter como um MUST_PASS_ALL e apenas devolve um número de linhas correspondente ao pageSize do PageFilter.
  6. PrefixFilter procura linhas na PrefixFilter na maioria dos casos. No entanto, se PrefixFilter fizer parte de um FilterList e tiver o operador MUST_PASS_ONE, o Bigtable não consegue determinar o intervalo implícito e, em alternativa, executa uma análise não filtrada da linha inicial à linha final. Use PrefixFilter com BigtableExtendedScan ou uma combinação de filtros para otimizar o desempenho neste caso.
  7. Baseia-se no filtro de condições do Bigtable, que pode ser lento. Suportado, mas não recomendado.
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

Além disso, as seguintes diferenças afetam os filtros do Bigtable:

  • Nos filtros que usam o comparador de expressões regulares (org.apache.hadoop.hbase.filter.RegexStringComparator), as expressões regulares usam a sintaxe RE2 e não a sintaxe Java.
  • Os filtros personalizados não são suportados. Não pode criar classes que herdem de org.apache.hadoop.hbase.filter.Filter.
  • As expressões de filtro têm um limite de tamanho de 20 KB. Como solução alternativa para reduzir o tamanho de uma expressão de filtro, use uma coluna suplementar que armazene o valor hash dos critérios de filtro.

Indicações de tempo

O Bigtable armazena indicações de tempo em microssegundos, enquanto o HBase armazena indicações de tempo em milissegundos. Esta distinção tem implicações quando usa a biblioteca cliente HBase para o Bigtable e tem dados com datas/horas invertidas.

A biblioteca de cliente faz a conversão entre microssegundos e milissegundos, mas, uma vez que a data/hora mais antiga do HBase que o Bigtable pode armazenar é Long.MAX_VALUE/1000, qualquer valor superior a esse é convertido em Long.MAX_VALUE/1000. Como resultado, os valores de data/hora invertidos grandes podem não ser convertidos corretamente.

Administração

Esta secção descreve os métodos na interface org.apache.hadoop.hbase.client.Admin que não estão disponíveis no Bigtable ou que se comportam de forma diferente no Bigtable em comparação com o HBase. Estas listas não são exaustivas e podem não refletir os métodos da API HBase adicionados mais recentemente.

A maioria destes métodos é desnecessária no Bigtable, porque as tarefas de gestão são processadas automaticamente. Alguns métodos não estão disponíveis porque estão relacionados com funcionalidades que o Bigtable não suporta.

Tarefas de manutenção geral

O Bigtable processa a maioria das tarefas de manutenção automaticamente. Como tal, os seguintes métodos não estão disponíveis:

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

Grupos de localidades

O Bigtable não permite especificar grupos de localidades para famílias de colunas. Como resultado, não pode chamar métodos HBase que devolvam um grupo de localidades.

Espaços de nomes

O Bigtable não usa espaços de nomes. Pode usar prefixos de chaves de linhas para simular espaços de nomes. Os seguintes métodos não estão disponíveis:

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

Gestão de regiões

O Bigtable usa tablets, que são semelhantes a regiões. O Bigtable gere os seus tablets automaticamente. Como tal, os seguintes métodos não estão disponíveis:

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

Instantâneos

Os seguintes métodos não estão disponíveis.

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

Gestão de tabelas

As tarefas, como a compactação de tabelas, são processadas automaticamente. Como tal, os seguintes métodos não estão disponíveis:

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

Coprocessadores

O Bigtable não suporta coprocessadores. Como tal, os seguintes métodos não estão disponíveis:

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

Procedimentos distribuídos

O Bigtable não suporta procedimentos distribuídos. Como tal, os seguintes métodos não estão disponíveis:

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