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çãoAppend
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
- As leituras inversas permitem-lhe ler um intervalo de linhas ao contrário. Para obter detalhes, consulte a secção Inverter análises.
- Ao contrário do HBase, quando envia um pedido de leitura, o Bigtable não filtra automaticamente os dados expirados que estão marcados para eliminação num próximo ciclo de recolha de lixo. Para evitar a leitura de dados expirados, use um filtro no pedido de leitura. Para mais informações, consulte a vista geral da recolha de lixo.
- A consulta de versões de famílias de colunas num intervalo de data/hora não é suportada. Não pode chamar os seguintes métodos:
org.apache.hadoop.hbase.client.Query#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
org.apache.hadoop.hbase.client.Get#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
org.apache.hadoop.hbase.client.Scan#setColumnFamilyTimeRange(byte[] cf, long minStamp, long maxStamp)
- A limitação do número de valores por linha por família de colunas não é suportada. Não pode chamar o método
org.apache.hadoop.hbase.client.Scan#setMaxResultsPerColumnFamily(int limit)
. - A definição do número máximo de células a devolver para cada chamada a
next()
não é suportada. As chamadas para o métodoorg.apache.hadoop.hbase.client.Scan#setBatch(int batch)
são ignoradas. - A definição do número de linhas para colocação em cache não é suportada. As chamadas para o método
org.apache.hadoop.hbase.client.Scan#setCaching(int caching)
são ignoradas.
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 |
---|---|---|
|
||
ColumnPrefixFilter FamilyFilter FilterList FuzzyRowFilter MultipleColumnPrefixFilter MultiRowRangeFilter PrefixFilter 6RandomRowFilter TimestampsFilter
|
ColumnCountGetFilter 1ColumnPaginationFilter 1ColumnRangeFilter 1FirstKeyOnlyFilter 1KeyOnlyFilter 2PageFilter 5QualifierFilter 3RowFilter 1, 4SingleColumnValueExcludeFilter 1, 4, 7SingleColumnValueFilter 4, 7ValueFilter 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)