Consultoria do Apache HBase no Azure HDInsight
Este artigo descreve várias consultorias para ajudá-lo a otimizar o desempenho do Apache HBase no Azure HDInsight.
Otimize o HBase para ler os dados gravados mais recentemente
Se seu caso de uso envolver a leitura dos dados gravados mais recentemente do HBase, esta consultoria pode ajudá-lo. Para alto desempenho, é ideal que as leituras do HBase sejam servidas de memstore
, em vez do armazenamento remoto.
O comunicado de consulta indica que, para uma família de colunas em uma tabela específica, > 75% de leituras estão sendo servidas a partir da memstore
. Esse indicador sugere que, mesmo que ocorra uma liberação na memstore
, o arquivo recente precisa ser acessado e estar no cache. Os dados são gravados primeiro na memstore
. O sistema acessa lá os dados recentes. Há uma chance de que os threads de liberação do HBase internos detectem que uma determinada região atingiu o tamanho de 128M (padrão) e pode disparar uma liberação. Esse cenário ocorre até mesmo com os dados mais recentes que foram gravados quando a memstore
tinha um tamanho de cerca de 128M. Portanto, uma leitura posterior desses registros recentes pode exigir uma leitura de arquivo em vez de ser feita na memstore
. Portanto, é melhor otimizar para que até mesmo dados recentes que foram liberados recentemente possam residir no cache.
Para otimizar os dados recentes no cache, considere as seguintes definições de configuração:
Defina
hbase.rs.cacheblocksonwrite
comotrue
. Essa configuração padrão no HBase do HDInsight étrue
, então, verifique se ele não foi redefinido parafalse
.Aumente o valor
hbase.hstore.compactionThreshold
para que você possa evitar a compactação desde o começo. Por padrão, esse valor é3
. Você pode aumentá-lo para um valor mais alto como10
.Se você seguir a etapa 2 e definir compactionThreshold, altere
hbase.hstore.compaction.max
para um valor mais alto, como100
, e também aumente o valor da configuraçãohbase.hstore.blockingStoreFiles
para um valor mais alto, como300
.Se você tiver certeza de que precisa ler apenas os dados recentes, defina a
hbase.rs.cachecompactedblocksonwrite
configuração para ATIVADO. Essa configuração informa ao sistema que, mesmo que ocorra a compactação, os dados permanecem no cache. As configurações também podem ser definidas no nível da família.No Shell do HBase, execute o seguinte comando para definir a
hbase.rs.cachecompactedblocksonwrite
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. Verifique se ele está ATIVADO para famílias que têm leituras de dados mais recentes. Por padrão, o cache de blocos está ativado para todas as famílias em uma tabela. Caso você tenha desabilitado o cache de blocos para uma família e precise ativá-lo, use o comando alter do Shell do HBase.
Essas configurações ajudam a garantir que os dados estejam disponíveis no cache e que os dados recentes não sejam compactados. 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 o Guia de Referência do Apache HBase: compactação em camadas de data
Otimize a fila de liberação
Essa consultoria indica que as liberações do HBase podem precisar de ajuste. A configuração atual para manipuladores de liberação pode não ser alta o suficiente para lidar com o tráfego de gravação, o que pode levar à lentidão das liberações.
Na interface do usuário do servidor de região, observe se a fila de liberação cresce acima de 100. Esse limite indica que as liberações são lentas e talvez você precise ajustar a configuração hbase.hstore.flusher.count
. Por padrão, o valor é 2. Certifique-se de que os threads de liberação máxima não aumentem além de 6.
Além disso, veja se você tem uma recomendação para o ajuste da contagem de regiões. Se sim, sugerimos que você tente o ajuste de região para ver se isso ajuda a obter descargas mais rápidas. Caso contrário, ajustar os threads de liberação pode ajudá-lo.
Ajuste da contagem de regiões
O comunicado de ajuste da contagem de regiões indica que o HBase bloqueou atualizações, e a contagem de regiões pode ser maior do que o tamanho ideal do heap suportado. Você pode ajustar o tamanho do heap, o tamanho da memstore
e a contagem de regiões.
Como exemplo de cenário:
Suponha que o tamanho do heap para o servidor de região seja de 10 GB. Por padrão, o
hbase.hregion.memstore.flush.size
é128M
. O valor padrão parahbase.regionserver.global.memstore.size
é0.4
. Isso significa que, de 10 GB, 4 GB são alocados para amemstore
(globalmente).Suponha que haja uma distribuição uniforme da carga de gravação em todas as regiões. Presumindo que cada região cresça até 128 MB apenas, o número máximo de regiões nessa configuração é de
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. A
memstore
global de 4GB agora está dividida em regiões de 100. Efetivamente, cada região obtém apenas 40 MB paramemstore
. Quando as gravações são uniformes, o sistema faz liberações frequentes e o tamanho menor da ordem é < 40 MB. Ter muitos threads de liberação pode aumentar a velocidade de liberaçãohbase.hstore.flusher.count
.
A consultoria quer dizer que seria bom reconsiderar o número de regiões por servidor, o tamanho do heap e a configuração do tamanho global da memstore
, junto com o ajuste dos 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 aumentar para mais de 2000 e ocorrer periodicamente, você poderá aumentar os threads de compactação para um valor maior.
Quando há um número excessivo de arquivos para compactação, ele pode levar a mais uso de heap relacionado ao modo como os arquivos interagem com o sistema de arquivos do Azure. Portanto, é 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 eles já estiverem definidos como 50M e 100M, deixe-os como estão. No entanto, se você tiver determinado essas configurações em um valor mais baixo (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 que essa configuração seja menor que 3.
Verificação de tabela completa
O aviso de verificação de tabela completa indica que mais de 75% das verificações emitidas são verificações completas de tabela/região. 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 de parada apropriada para cada verificação.
Use a API MultiRowRangeFilter para consultar intervalos diferentes em uma chamada de verificação. Para obter mais informações, confira a documentação da API MultiRowRangeFilter.
Nos casos em que você precisa de uma verificação completa de tabela ou de região, verifique se há uma possibilidade de evitar o uso do cache para essas consultas, para que outras consultas que usam o cache não possam remover blocos que estejam ativos. Para garantir que as verificações não usem cache, use a API escanear com a opção setCaching(false) no seu código:
scan#setCaching(false)