Medindo a performance do seu cluster Hadoop

O Hadoop não é uma aplicação web, um banco de dados e tampouco um webservice, você não conseguiria estressar um cluster Hadoop com teste de carga tradicional (afinal ele é feito pra suportar grandes volumes de dados).

Realizar um teste de estresse no cluster é um passo geralmente esquecido, porém muito importante quando você monta o seu ambiente hadoop, afinal, é importante ter um benchmark do cluster, ou seja, avaliar seu desempenho, executando uma variedade de tipos de jobs cada uma focado em um campo específico (indexação, consulta estatísticas preditivas, aprendizado de máquina, ...).

Bons testes de stresse nos ajudam a:

  • Assegurar que o software atende suas exigências de performances.
  • Garantir que o serviço vai entregar um tempo de resposta rápido, mesmo sob uma alta demanda de serviço.
  • Alcançar os limites de escalabilidade, que por sua vez é útil para planejar os próximos passos do desenvolvimento.

A Intel lançou o HiBench, uma ferramenta dedicada para executar esse tipo de teste. Neste artigo, vamos falar sobre essa ferramenta.

O que é o HiBench?

HiBench é uma coleção de scripts shell publicado sob a  Licença Apache 2 no GitHub: https://github.com/intel- Hadoop / HiBench

Ele permite realizar testes de estresse em um cluster Hadoop de acordo com o perfil de uso do cluster (Micro Benchmarks, Web Search, Machine Learning, Analytical Query).

Micro Benchmarks

WordCount

Este teste despacha a contagem do número de palavras a partir de uma fonte de dados.

A base de dados é gerada por um script de preparação que o HiBench executa na classe randomtextwriter do Hadoop.

Este teste pertence a uma classe de jobs que extraem uma pequena quantidade de informação a partir de uma grande fonte de dados.

É um teste de CPU bound

Sort

Este teste executa uma classificação na base de dados.

A base de dados é gerada por um script de preparação que se baseia na randomtextwriter do Hadoop.

Este teste é mais simples que você pode imaginar. Na verdade, mapear e reduzir são funções de identidade. A classificação é feita automaticamente durante a etapa de Shuffle & Merge do MapReduce.

É um teste de I/O bound

TeraSort

Este teste também executa a classificação na base de dados.

A base de dados é gerada pelos jobs Teragen que criam, por padrão, 1 bilhão de linhas de 100 bytes.

Estas linhas são então classificadas pelo método Terasort.  Ao contrário do Sort, Terasort fornece seu próprio formato de entrada e saída e também o seu próprio “Partitioner” que assegura que as chaves são distribuídas igualmente entre todos os nós.

Portanto, é um Sort “melhorado”, que visa proporcionar uma carga igual entre todos os nós durante o teste.

Com esta especificidade, este teste é para:

CPU bound para a fase Map

I/O bound para a fase Reduce

DFSIO

Este teste é dedicado ao HDFS. Destina-se a medir a taxa agregadas I/O e throughput do HDFS durante os processos de leitura e escrita.

Durante a fase de preparação, a base de dados é gerada e armazenada no HDFS.

Então, dois testes são executados:

Leitura da base de dados gerada

Gravação de uma grande quantidade de dados

O teste de gravação é basicamente a mesma coisa que a fase de preparação.

É um teste de I/O bound

Web Search

Nutch indexing

Este teste se concentra nas performances do cluster quando se trata de indexação de dados.

A fim de fazê-lo, o estágio de preparação gera os dados a serem indexados.

Em seguida, a indexação é realizada com Apache Nutch.

Este é um teste I/O bound com uma alta utilização da CPU durante a fase de Map

Page Rank

Este teste mede o desempenho do cluster para Jobs de PageRanking.

A fase de preparação gera a base de dados sob a forma de um gráfico, que podem ser processados utilizando o algoritmo de PageRank .

Em seguida, a indexação efetiva é realizada por uma cadeia de seis Jobs de MapReduce.

Este teste é CPU bound

Machine Learning(Aprendizado de Máquinas)

Naive Bayes Classifier

Este teste realiza uma classificação probabilística em uma base de dados.

Isso é explicado em profundidade na Wikipedia.

A fase de preparação gera a base de dados.

Então, os teste são realizados em cadeias de dois jobs MapReduce com  Mahout:

seq2sparse transforma uma fonte de dados de texto em vectores

trainnb calcula o modelo final utilizando vectores

Este é um teste I/O bound com uma alta utilização da CPU durante a fase Mapa do seq2sparse.

Ao usar este teste, não observamos uma carga real no cluster. Parece que é necessário ou fornecer sua própria fonte de dados ou aumentar muito o tamanho dos dados gerados durante a fase de preparação.

K-Means clustering

Este teste particiona a fonte de dados em vários clusters, onde cada elemento pertence ao cluster com a média mais próxima.

Isso é explicado em profundidade na Wikipedia.

A fase de preparação gera a fonte de dados.

Em seguida, o algoritmo é executado nessa fonte de dados através do Mahout .

O algoritmo de agrupamento K-Means é composto de duas etapas:

    • Iterações
      • Agrupamento

Cada um desses estágios executa jobs de MapReduce e tem um perfil de uso específico.

    • CPU bound para iterações
      • I/O bound para clustering

Analytical Query (Consulta Analítica)

Esta classe de testes realiza consultas que correspondem ao perfil de utilização de analistas de negócios e outros usuários do banco de dados.

A fonte de dados é gerada durante a fase de preparação.

Duas tabelas são criadas:

    • rankings
      • uservisits

Este é um esquema comum que podemos encontrar em muitas aplicações web.

Uma vez que a fonte de dados foi gerada, dois requests Hive   são executados:

    • join
      • agregation

Estes testes são I/O bound

Usando o HiBench

Executando um teste de estresse

Executar o HiBench não é muito difícil:

  • baixe os fontes no GitHub
  • Certifique-se de que ninguém está usando o cluster
  • Certifique-se que você configurou corretamente as variáveis de ambiente

Em seguida, o arquivo bin/hibench-config.sh contém todas as opções para ajustar antes de começar o teste de estresse. Ele inclui o diretório HDFS onde você quer escrever ambos os dados de origem e de resultado, o caminho do arquivo de relatório final sobre o sistema de arquivos local, ...

Uma vez configurado, garanta que o diretório HDFS onde você quer escrever sua base de dados e os resultados existe no cluster e execute o comando  bin/run-all.sh.  Agora você pode tomar um café ... ou dois.

Interpretação dos resultados

Os resultados são gravados no arquivo hibench.report com o seguinte formato CSV:

test_name end_date <jobstart_timestamp, jobend_ timestamp> size_in_bytes duration_ms rendimento

Esteja ciente de que o arquivo de resultado real não contém o cabeçalho da coluna acima.

O teste DFSIOE também escreve um arquivo CSV e uma interpretação de seus resultados em seu subdiretório dfsioe.

Limitações

HiBench por si só não é suficiente para um bom relatório de um teste de estresse. É necessário também recuperar as informações fornecidas pelo JobTracker/ResourceManager como o tempo de execução médio dos Maps, Reduces, Shuffle e Merges de todos os trabalhos, a fim de construir um relatório final preciso.

Quais são as alternativas?

Existe uma alternativa para HiBench, porém, mais focado em um perfil de uso específico.

GridMix

GridMix está incluído no Hadoop, além dos tipos de testes, como exemplo TeraSort, Sort, ...

No entanto, ele gera Jobs MapReduce, que estão focados em triagem grande quantidade de dados e não abrange outros perfis como Machine Learning.

Conclusão

Apesar de alguns inconvenientes, HiBench simplifica muito a análise comparativa de um cluster Hadoop.

No futuro, este domínio, certamente terá novas ferramentas com mais funcionalidades e uma melhor cobertura ou perfis de uso diferentes.

Acredito que esse é apenas o começo...