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
- Iterações
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
- CPU bound para iterações
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
- rankings
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
- join
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...