Introdução
O recurso do Apache HBase Medium Object Storage (MOB) foi introduzido pelo HBASE-11339. Esse recurso melhora o acesso de leitura e gravação de baixa latência para valores de tamanho moderado (idealmente de 100K a 10MB com base nos resultados de nossos testes), tornando-o adequado para armazenar documentos, imagens e outros objetos de tamanho moderado [1]. O recurso Apache HBase MOB alcança essa melhoria separando os caminhos de E/S para referências de arquivo e objetos MOB, aplicando diferentes políticas de compactação a MOBs e, assim, reduzindo a amplificação de gravação criada pelas compactações do HBase. Os objetos MOB são armazenados em uma região especial, chamada de região MOB. Os objetos MOB de uma tabela são armazenados na região MOB como arquivos MOB, o que significa que haverá muitos arquivos MOB nessa região. Consulte a Figura 1 de [1] para a arquitetura Apache HBase MOB.
Figura 1 Arquitetura do Apache HBase MOB
Inicialmente, os arquivos MOB são relativamente pequenos (menos de 1 ou 2 blocos HDFS). Para melhorar a eficiência do Apache HDFS, os arquivos MOB são periodicamente mesclados em arquivos maiores por meio de uma operação chamada compactação de MOB , que é independente do processo normal de compactação. A versão inicial da compactação MOB regrava os vários arquivos MOB de um determinado dia em arquivos MOB maiores para aquele dia. Vamos usar a lista de arquivos de exemplo abaixo para deixar isso mais claro. A tabela t1 tem duas regiões (r1, r2), tem uma família de colunas (f1) e MOB habilitada. Você pode ver que existem dois prefixos; D279186428a75016b17e4df5ea43d080 corresponde ao valor de hash da chave inicial para a região r1 e D41d8cd98f00b204e9800998ecf8427e ao valor de hash da chave inicial para a região r2. Para a região r1, há dois arquivos MOB em 01/01/2016 e 02/01/2016 , e para a região r2, há 3 arquivos MOB em 01/01/2016 na região MOB, que é /hbase/data/ mobdir/data/default/t1/78e317a6e78a0fceb27b9fa0cb9dcf5b/f1.
>ls /hbase/data/mobdir/data/default/t1/78e317a6e78a0fceb27b9fa0cb9dcf5b/f1
D279186428a75016b17e4df5ea43d08020160101 f9d9713ab2fb4a8b825485f6a8acfcd5
D279186428a75016b17e4df5ea43d08020160101 af7713ab2fbf4a8abc5135f6a8467ca8
D279186428a75016b17e4df5ea43d08020160102 9013ab2fceda8b825485f6a8acfcd515
D279186428a75016b17e4df5ea43d08020160102 9a7978013ab2fceda8b825485f6a8acf
D41d8cd98f00b204e9800998ecf8427e20160101 fc94af623c2345f1b241887721e32a48
D41d8cd98f00b204e9800998ecf8427e20160101 d0954af623c2345f1b241887721e3259
D41d8cd98f00b204e9800998ecf8427e20160101 439adf4af623c2345f1b241887721e32
Após a compactação do MOB, dois arquivos MOB em 01/01/2016 e 02/01/2016 para a região r1 são compactados em um arquivo para cada dia. Três arquivos MOB em 01/01/2016 para a região r2 são compactados em um arquivo.
D279186428a75016b17e4df5ea43d08020160101 f49a9d9713ab2fb4a8b825485f6a8acf
D279186428a75016b17e4df5ea43d08020160102 bc9176d09424e49a9d9065caf9713ab2
D41d8cd98f00b204e9800998ecf8427e20160101 d9cb0954af623c2345f1b241887721e3
Como somente arquivos MOB do mesmo dia para uma região podem ser compactados juntos, o limite mínimo de arquivos MOB no diretório de região MOB única para uma família específica em um ano será de 365 x número de regiões. Com 1.000 regiões, em 10 anos, serão 365 x 1.000 x 10, 3,65 milhões de arquivos após a compactação MOB, e isso não para de crescer! Infelizmente, o Apache HDFS tem um limite de memória limitado para o número de arquivos em um diretório [2]. Depois que o número de arquivos MOB excede esse limite HDFS, a tabela MOB não é mais gravável. O número máximo padrão de arquivos em um diretório para Apache HDFS é 1 milhão. Para 1.000 regiões, ele atingirá esse limite em cerca de 3 anos. Com mais regiões, atingirá o limite mais rapidamente.
O HBASE-16981 introduz políticas de agregação de partição de compactação de MOB semanais e mensais para melhorar esse problema de dimensionamento de contagem de arquivos MOB por fatores de 7 ou ~30, respectivamente.
Design de políticas de partição de compactação de MOB semanais e mensais (HBASE-16981)
A idéia básica do HBASE-16981 é compactar arquivos MOB em uma semana ou um mês em menos arquivos maiores. A semana do calendário é definida pela ISO 8601, começa na segunda-feira e termina no domingo. Normalmente, com política semanal, após a compactação do MOB haverá um arquivo por semana por região; com política mensal, após a compactação do MOB haverá um arquivo por mês por região. O número de arquivos MOB no diretório de região MOB para uma família específica em um ano será reduzido para 52 x número de regiões com política semanal e 12 x número de regiões com política mensal. Isso reduz bastante o número de arquivos MOB após a compactação.
A abordagem proposta inicial
Quando a compactação MOB acontece, o HBase master seleciona e agrega arquivos MOB dentro de um mês ou uma semana em menos arquivos maiores. Dependendo da frequência com que a compactação MOB acontece, é possível que os arquivos sejam compactados várias vezes. Como exemplo, digamos que a operação de compactação MOB aconteça diariamente com política de agregação mensal. No dia 1, a compactação MOB compacta todos os arquivos do dia 1 em um arquivo. No dia 2, a compactação MOB compacta o arquivo do dia 1 e os arquivos do dia 2 em um novo arquivo; no dia 3, a compactação MOB compactará o arquivo do dia 2 e os arquivos do dia 3 em um novo arquivo, continuando até o último dia do mês. Nesse caso, os arquivos do dia 1 são compactados mais de 30 vezes e, portanto, amplificam a quantidade de E/S de gravação em mais de 30 vezes.
O objetivo de design do Apache HBase MOB é reduzir a amplificação de gravação criada pela compactação do MOB. Essa abordagem ingênua derrota o objetivo do design.
A abordagem final implementada
A fim de superar a deficiência da abordagem proposta inicial, a compactação faseada MOB é adotada para novas políticas semanais e mensais no HBASE-16981. A Figura 2 mostra como funciona com a política mensal, funciona de forma semelhante para a política semanal.
Figura 2 Compactação de MOB de preparo com política mensal
Como mostra a Figura 2, a compactação do MOB acontece em 15/11/2016. Os arquivos na semana do calendário atual são compactados com base na partição diária com o limite MOB configurado. Na Figura 2, os arquivos de 14/11/2016 são compactados juntos e os arquivos de 15/11/2016 são compactados juntos. Os arquivos nas últimas semanas do calendário do mês atual são compactados com base na partição semanal com limite semanal (configurado-MOB-threshold x 7). Na Figura 2, os arquivos de 1/11/2016 a 6/11/2016 são compactados juntos e os arquivos de 7/11/2016 a 13/11/2016 são compactados juntos. Os arquivos dos últimos meses são compactados com base na partição mensal com limite mensal (configurado-MOB-threshold x 28). Na Figura 2, os arquivos de 01/10/2016 a 31/10/2016 estão compactados juntos. Como se pode notar, a primeira semana do calendário de novembro de 2016 é de 31/10/2016 a 6/11/2016. Como 31/10/2016 está no mês passado, os arquivos desse dia são compactados com base na partição mensal, restando apenas 6 dias para a partição semanal (1/11/2016 ~ 6/11/2016). Após a compactação, há 5 arquivos se o limite de compactação do MOB e o tamanho do lote de compactação do MOB estiverem configurados adequadamente.
Com esse design, os arquivos MOB passam por compactações de 2 ou 3 estágios. Em cada estágio, partição diária, partição semanal ou partição mensal são aplicadas com o aumento do limite de compactação de MOB. Os arquivos MOB são compactados no máximo 3 vezes normalmente com política mensal e no máximo 2 vezes normalmente com política semanal durante sua vida útil.
Para mais detalhes sobre o projeto, consulte [3].
Uso
Por padrão, a política de partição de compactação MOB é diária. Para aplicar a política semanal ou mensal, há um novo atributo MOB_COMPACT_PARTITION_POLICY adicionado à família de colunas MOB. O usuário pode definir esse atributo ao criar uma tabela do shell do HBase.
>create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY => 'weekly’}
O usuário também pode alterar o MOB_COMPACT_PARTITION_POLICY da tabela existente do shell HBase.
>alter 't1', {NAME => 'f1', MOB_COMPACT_PARTITION_POLICY => 'monthly'}
Se a política mudar de diária para semanal ou mensal, ou de semanal para mensal, a próxima compactação MOB recompactará os arquivos MOB que foram compactados com a política anterior. Se a política mudar de mensal ou semanal para diária, ou de mensal para semanal, os arquivos MOB já compactados com a política anterior não serão recompactados com a nova política.
Conclusão
O HBASE-16981 resolve o problema de dimensionamento do número de arquivo com o Apache HBase MOB. Ele estará disponível na versão Apache HBase 2.0.0. O CDH suporta Apache HBase MOB no CDH 5.4.0+. HBASE-16981 tem backport e estará disponível no CDH 5.11.0.
Agradecimentos
Agradecimentos especiais a Jingcheng Du e Anoop Sam John pela ajuda no projeto e revisão do HBASE-16981, Jonathan Hsieh e Sean Busbey pela revisão do blog.
Referências
[1] https://clouderatemp.wpengine.com/blog/2015/06/inside-apache-hbases-new-support-for-mobs/
[2] https://clouderatemp.wpengine.com/blog/2009/02/the-small-files-problem/
[3] https://issues.apache.org/jira/browse/HBASE-16981