Avisos do Apache HBase no Azure HDInsight
Este artigo descreve vários avisos para ajudá-lo a otimizar o desempenho do Apache HBase no Azure HDInsight.
Otimizar o HBase para ler os dados gravados mais recentemente
Se o seu caso de uso envolve a leitura dos dados escritos mais recentemente do HBase, este aviso pode ajudá-lo. Para alto desempenho, é ideal que as leituras do HBase sejam servidas a partir do , em vez do memstore
armazenamento remoto.
O aviso de consulta indica que, para uma determinada família de colunas em uma tabela, > 75% das leituras que estão sendo atendidas do memstore
. Este indicador sugere que, mesmo que aconteça uma descarga no arquivo recente, o arquivo precisa ser acessado memstore
e isso precisa estar em cache. Os dados são primeiro gravados para memstore
o sistema acessa os dados recentes lá. Há uma chance de que os threads internos do flusher HBase detetem que uma determinada região atingiu o tamanho de 128M (padrão) e possam acionar um flush. Este cenário acontece até mesmo com os dados mais recentes que foram escritos quando o memstore
tinha cerca de 128 milhões de tamanho. Portanto, uma leitura posterior desses registros recentes pode exigir uma leitura de arquivo em vez de .memstore
Portanto, é melhor otimizar para que até mesmo os dados recentes que foram liberados recentemente possam residir no cache.
Para otimizar os dados recentes em cache, considere as seguintes definições de configuração:
Defina
hbase.rs.cacheblocksonwrite
comotrue
. Essa configuração padrão no HDInsight HBase étrue
, portanto, verifique se ela não foi redefinida parafalse
.Aumente o
hbase.hstore.compactionThreshold
valor para evitar que a compactação entre em ação. Por predefinição, este valor é3
. Você pode aumentá-lo para um valor mais alto como10
.Se você seguir a etapa 2 e definir compactionThreshold, mude
hbase.hstore.compaction.max
para um valor mais alto, por exemplo100
, e também aumente o valor da configuraçãohbase.hstore.blockingStoreFiles
para um valor mais alto, por exemplo300
.Se tiver certeza de que precisa ler apenas os dados recentes, defina
hbase.rs.cachecompactedblocksonwrite
a configuração como ON. Essa configuração informa ao sistema que, mesmo que a compactação aconteça, os dados permanecem em cache. As configurações também podem ser definidas a nível familiar.No Shell do HBase, execute o seguinte comando para definir
hbase.rs.cachecompactedblocksonwrite
a configuração:alter '<TableName>', {NAME => '<FamilyName>', CONFIGURATION => {'hbase.hstore.blockingStoreFiles' => '300'}}
O cache de blocos pode ser desativado para uma determinada família em uma tabela. Certifique-se de que está ativado para as famílias que têm os dados mais recentes lidos. Por padrão, o cache de blocos é ativado para todas as famílias em uma tabela. Caso você tenha desativado o cache de bloco para uma família e precise ativá-lo, use o comando alter do shell hbase.
Essas configurações ajudam a garantir que os dados estejam disponíveis em cache e que os dados recentes não sofram compactação. Se um TTL for possível em seu cenário, considere o uso da compactação em camadas de data. Para obter mais informações, consulte Apache HBase Reference Guide: Date Tiered Compaction
Otimize a fila de descarga
Este aviso indica que os rubores de HBase podem necessitar de ajustes. A configuração atual para manipuladores de descarga pode não ser alta o suficiente para lidar com o tráfego de gravação que pode levar à lentidão das descargas.
Na interface do usuário do servidor de região, observe se a fila de liberação cresce além de 100. Esse limite indica que as descargas estão lentas e você pode ter que ajustar a hbase.hstore.flusher.count
configuração. Por padrão, o valor é 2. Certifique-se de que as roscas máximas do flusher não aumentem além de 6.
Além disso, veja se você tem uma recomendação para ajuste de contagem de regiões. Se sim, sugerimos que experimente a afinação da região para ver se isso ajuda em rubores mais rápidos. Caso contrário, ajustar os fios do flusher pode ajudá-lo.
Ajuste da contagem de regiões
O aviso de ajuste de contagem de regiões indica que o HBase bloqueou atualizações e a contagem de regiões pode ser maior do que o tamanho de heap suportado idealmente. Você pode ajustar o tamanho da pilha, memstore
o tamanho e a contagem de regiões.
Como cenário de exemplo:
Suponha que o tamanho da pilha para o servidor de região é de 10 GB. Por padrão, o
hbase.hregion.memstore.flush.size
é128M
. O valor padrão parahbase.regionserver.global.memstore.size
é0.4
. O que significa que, dos 10 GB, 4 GB são alocados paramemstore
(globalmente).Suponha que haja uma distribuição uniforme da carga de gravação em todas as regiões e supondo que cada região cresça até 128 MB apenas então o número máximo de regiões nessa configuração é
32
regiões. Se um determinado servidor de região estiver configurado para ter 32 regiões, o sistema evitará melhor o bloqueio de atualizações.Com essas configurações em vigor, o número de regiões é 100. O global
memstore
de 4 GB está agora dividido em 100 regiões. Assim, efetivamente, cada região recebe apenas 40 MB paramemstore
. Quando as gravações são uniformes, o sistema faz flushes frequentes e tamanho menor da ordem < de 40 MB. Ter muitos fios de descarga pode aumentar a velocidadehbase.hstore.flusher.count
de descarga.
O aviso significa que seria bom reconsiderar o número de regiões por servidor, o tamanho da pilha e a configuração de tamanho global memstore
, juntamente com o ajuste de threads de liberação para evitar que as atualizações sejam bloqueadas.
Ajuste da fila de compactação
Se a fila de compactação do HBase crescer para mais de 2000 e acontecer periodicamente, você poderá aumentar os threads de compactação para um valor maior.
Quando há um número excessivo de arquivos para compactação, isso pode levar a mais uso de heap relacionado à forma como os arquivos interagem com o sistema de arquivos do Azure. Por isso, é melhor concluir a compactação o mais rápido possível. Algumas vezes, em clusters mais antigos, as configurações de compactação relacionadas à limitação podem levar a uma taxa de compactação mais lenta.
Verifique as configurações hbase.hstore.compaction.throughput.lower.bound
e hbase.hstore.compaction.throughput.higher.bound
. Se já estiverem definidos para 50M e 100M, deixe-os como estão. No entanto, se você definiu essas configurações para um valor mais baixo (o que era o caso com clusters mais antigos), altere os limites para 50M e 100M, respectivamente.
As configurações são hbase.regionserver.thread.compaction.small
e hbase.regionserver.thread.compaction.large
(os padrões são 1 cada).
Limite o valor máximo para esta configuração para ser inferior a 3.
Verificação completa da tabela
O aviso de verificação de tabela completa indica que mais de 75% das verificações emitidas são verificações de tabela/região completas. Você pode revisitar a maneira como seu código chama as verificações para melhorar o desempenho da consulta. Considere as seguintes práticas:
Defina a linha de início e parada adequada para cada verificação.
Use a API MultiRowRangeFilter para que você possa consultar intervalos diferentes em uma chamada de verificação. Para obter mais informações, consulte a documentação da API MultiRowRangeFilter.
Nos casos em que você precisa de uma verificação completa de tabela ou região, verifique se há a possibilidade de evitar o uso de cache para essas consultas, para que outras consultas que usam o cache não possam remover os blocos que estão quentes. Para garantir que as verificações não usem cache, use a API de verificação com a opção setCaching(false) em seu código:
scan#setCaching(false)