O HBase é um banco de dados flexível, mas seu desempenho depende de configuração e uso adequados. Este tópico descreve métodos para otimizar o desempenho de leitura. Em ambientes de produção, problemas como Full GC, erros de falta de memória (OOM), falhas de Region-In-Transition (RIT) e alta latência de leitura podem ocorrer. Embora hardware superior atenue essas questões, a otimização correta é essencial para obter o melhor desempenho.
As otimizações dividem-se nas seguintes categorias:
otimização no lado do cliente, otimização no lado do servidor e otimização da plataforma (ApsaraDB for HBase).
Otimização no lado do cliente
Solicitações get em lote
Solicitações em lote reduzem substancialmente as chamadas RPC entre cliente e servidor, o que melhora significativamente o throughput.
Result[] re= table.get(List<Get> gets)
Defina o tamanho do cache para grandes scans
Ao examinar grandes volumes de dados, o cliente envia uma única solicitação e o servidor retorna os dados em lotes. Esse mecanismo evita que transferências massivas sobrecarreguem o cliente ou o servidor. Por padrão, os dados são carregados em um cache local com capacidade para 100 linhas. Para grandes scans, isso pode gerar centenas ou até dezenas de milhares de solicitações RPC. Aumente o tamanho do cache nessas operações.
scan.setCaching(int caching) // For large scans, you can set this to 1000.
Especifique famílias de colunas ou qualificadores
O HBase é um banco de dados orientado a famílias de colunas. Dados da mesma família ficam armazenados juntos, separados das demais. Para reduzir E/S, sempre especifique as famílias de colunas necessárias ou qualificadores de coluna específicos na solicitação.
Desative o cache para tarefas offline
No acesso ao HBase para computação offline, os dados geralmente são lidos apenas uma vez. Para evitar preencher o blockcache com informações sem reutilização futura, desative-o nesses scans.
scan.setBlockCache(false)
Otimização no lado do servidor
Garanta o balanceamento da carga de solicitações
Verifique se a carga de leitura concentra-se em um ou poucos servidores, especialmente nos horários de pico. Monitore esse comportamento pela interface do usuário do HBase na Plataforma de Gerenciamento do HBase. Caso identifique um hotspot significativo, redesenhe a rowkey como solução definitiva. Como correção temporária, considere dividir a região quente.
Configure o tamanho do blockcache
O blockcache é um cache de leitura crítico para o desempenho. Para cargas de trabalho intensivas em leitura, use instâncias com proporção vCPU/memória de 1:4, como 8 vCPU/32 GiB ou 16 vCPU/64 GiB. Melhore o desempenho aumentando o tamanho do blockcache e reduzindo o do Memstore.
No console do ApsaraDB for HBase, defina hfile.block.cache.size como 0.5 e hbase.regionserver.global.memstore.size como 0.3; em seguida, reinicie o serviço.
Altere também hbase.regionserver.global.memstore.lowerLimit para 0.24.
Gerencie a contagem de HFiles
Operações de leitura exigem abertura de HFiles. Muitos HFiles aumentam as operações de E/S e a latência de leitura. Para controlar isso, execute major compaction periodicamente. Se a carga de trabalho for leve à noite, agende a major compaction para horários fora de pico.
Monitore o consumo de recursos das compactações
A compactação mescla HFiles menores em arquivos maiores, melhorando o desempenho de leitura subsequente, mas consumindo recursos significativos do sistema. Uma minor compaction normalmente não causa uso intenso de recursos, exceto se mal configurada. Evite executar major compaction durante horários de pico; agende-a para períodos de baixa demanda.
Use bloom filters corretamente
Um bloom filter ajuda a determinar se um HFile contém determinada linha, evitando operações de E/S desnecessárias e melhorando o desempenho de leitura. Ao criar uma tabela, ative o bloom filter na rowkey definindo BLOOMFILTER => 'ROW'.
Otimização da plataforma
Melhore a localidade dos dados
Se um HFile estiver no mesmo nó que fornece seus dados, o HBase poderá usar Short-Circuit Local Read para acesso mais rápido. A plataforma mantém alta localidade de dados por meio de otimizações. Após eventos como reinicializações ou expansões de disco, ela restaura automaticamente as regiões aos nós locais. Major compactions regulares também contribuem para melhorar a localidade dos dados.
Short-Circuit Local Read (ativado por padrão)
Normalmente, as operações de leitura do HDFS passam por um DataNode. Com o Short-Circuit Local Read ativado, o cliente ignora o DataNode e lê dados diretamente do disco local.
Hedged Read (ativado por padrão)
O sistema tenta primeiro uma leitura local via Short-Circuit Local Read. Contudo, leituras locais podem ficar lentas devido a problemas transitórios de disco ou rede. O Hedged Read mitiga esse problema. Quando o cliente inicia uma leitura local, ele aciona um temporizador curto. Se a leitura não terminar antes do tempo expirar, o cliente envia uma segunda solicitação a outro DataNode. O cliente utiliza a primeira resposta recebida e descarta a outra solicitação.
Desative o espaço de swap (desativado por padrão)
O espaço de swap é uma parte do disco rígido usada como memória virtual quando a memória física é insuficiente. Seu uso introduz latência significativa; portanto, ele vem desativado por padrão na plataforma ApsaraDB for HBase. Entretanto, desativar o swap pode elevar o valor de anon-rss, e a recuperação de páginas pode não liberar páginas suficientes, causando travamento do kernel. A plataforma adota medidas de isolamento para evitar essa situação.