MapReduce é uma forma estabelecida de paralelizar consultas de dados, mas essa alternativa pode oferecer ainda mais benefícios?
Principais conclusões
- MapReduce e o pipeline de agregação são dois métodos para processamento de dados complexos no MongoDB. A estrutura de agregação é mais recente e mais eficiente.
- O MapReduce envolve a especificação de funções separadas de mapa e redução usando JavaScript, enquanto o pipeline de agregação usa operadores integrados do MongoDB.
- O pipeline de agregação é recomendado pelo MongoDB para melhor desempenho, mas o MapReduce oferece mais flexibilidade e é adequado para sistemas de arquivos distribuídos como o Hadoop.
MapReduce e o pipeline de agregação são os dois métodos que você pode usar para lidar com o processamento de dados complexos no MongoDB. A estrutura de agregação é mais recente e conhecida por sua eficiência. Mas alguns desenvolvedores ainda preferem manter o MapReduce, que consideram mais confortável.
Na prática, você deseja escolher um desses métodos de consulta complexos, pois eles atingem o mesmo objetivo. Mas como eles funcionam? Como eles são diferentes e qual você deve usar?
Como funciona o MapReduce no MongoDB
O MapReduce no MongoDB permite que você execute cálculos complexos em um grande volume de dados e agregue o resultado em um pedaço mais abrangente. O método MapReduce apresenta duas funções: mapear e reduzir.
Ao trabalhar com MapReduce no MongoDB, você especificará o mapa e as funções de redução separadamente usando JavaScript e inserirá cada uma no arquivo integrado mapReduce consulta.
A função map primeiro divide os dados recebidos em pares chave-valor, geralmente com base no agrupamento mapeado. É aqui que você especifica como deseja agrupar os dados. A função de redução executa cálculos personalizados nos valores de cada grupo de dados e agrega o resultado em uma coleção separada armazenada no banco de dados.
Como funciona o pipeline de agregação no MongoDB
O pipeline de agregação no MongoDB é uma alternativa aprimorada ao MapReduce. Assim como o MapReduce, ele permite realizar cálculos complexos e transformações de dados diretamente no banco de dados. Mas a agregação não requer escrever funções JavaScript dedicadas que podem reduzir o desempenho da consulta.
Em vez disso, ele usa operadores integrados do MongoDB para manipular, agrupar e calcular dados. Em seguida, agrega os resultados após cada consulta. Assim, o pipeline de agregação é mais personalizável, pois você pode estruturar a saída como quiser.
Como as consultas diferem entre MapReduce e agregação
Suponha que você queira calcular o total de vendas de itens com base nas categorias de produtos. No caso de MapReduce e agregação, as categorias de produtos se tornam as chaves, enquanto as somas dos itens em cada categoria se tornam os valores correspondentes.
Tome alguns exemplos de dados brutos para a declaração do problema descrito, que se parece com isto:
Vamos resolver esse cenário de problema usando MapReduce e um pipeline de agregação para diferenciar entre suas consultas e métodos de solução de problemas.
O método MapReduce
Usando Python como linguagem de programação base, o mapReduce consulta do cenário de problema descrito anteriormente se parece com isso:
import pymongo
client = pymongo.MongoClient(
"mongodb://localhost/"
)db = client.my_database
sales = db["sales"]
map_function =
function() {
emit(this.Section, this.Sold);
}reduce_function =
function(key, values) {
return Array.sum(values);
}result = db.command(
"mapReduce",
"sales",
map=map_function,
reduce=reduce_function,
out="section_totals"
)
doc = [doc for doc in db.section_totals.find()]
print(doc)
Se você executar isso com os dados de amostra originais, verá uma saída como esta:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Observe atentamente e você verá que os processadores map e reduce estão funções JavaScript dentro de variáveis Python. O código os passa para o mapReduce consulta, que especifica uma coleção de saída dedicada (section_totals).
Usando um pipeline de agregação
Além de fornecer uma saída mais suave, a consulta do pipeline de agregação é mais direta. Aqui está a aparência da operação anterior com o pipeline de agregação:
import pymongo
client = pymongo.MongoClient("mongodb://localhost/")
db = client.funmi
sales = db["sales"]pipeline = [
{
"$group": {
"_id": "$Section",
"totalSold": { "$sum": "$Sold" }
}
},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$totalSold"
}
}
]
result = list(sales.aggregate(pipeline))
print(result)
A execução dessa consulta de agregação fornecerá os seguintes resultados, que são semelhantes aos resultados da abordagem MapReduce:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Desempenho e velocidade da consulta
O pipeline de agregação é uma versão atualizada do MapReduce. O MongoDB recomenda usar o pipeline de agregação em vez do MapReduce, pois o primeiro é mais eficiente.
Tentamos afirmar essa afirmação ao executar as consultas na seção anterior. E quando executado lado a lado em uma máquina de 12 GB de RAM, o pipeline de agregação parecia ser mais rápido, com média de 0,014 segundos durante a execução. A mesma máquina levou em média 0,058 segundos para executar a consulta MapReduce.
Isso não é um parâmetro para concluir suas performances, mas parece apoiar a recomendação do MongoDB. Você pode considerar essa diferença de tempo insignificante, mas ela aumentará consideravelmente em milhares ou milhões de consultas.
Os prós e contras do MapReduce
Considere as vantagens e desvantagens do MapReduce para determinar onde ele se destaca no processamento de dados.
Prós
- Dá mais flexibilidade para personalização, pois você escreve o mapa e reduz as funções separadamente.
- Você pode facilmente salvar a saída em uma nova coleção do MongoDB dentro do banco de dados.
- Você pode usar MapReduce em sistemas de arquivos distribuídos como o Hadoop, que se integra facilmente ao MongoDB.
- Seu suporte para scripts de terceiros o torna mais escalável e fácil de aprender do que o pipeline de agregação. Portanto, alguém com experiência em desenvolvimento de JavaScript pode implementar o MapReduce.
Contras
- Requer script de terceiros; isso contribui para seu desempenho inferior ao do pipeline de agregação.
- O MapReduce pode ser ineficiente em termos de memória, exigindo vários nós, especialmente ao lidar com dados excessivamente complexos.
- Não é adequado para processamento de dados em tempo real, pois a consulta pode ser lenta.
Prós e contras do pipeline de agregação
E o pipeline de agregação? Considerar seus pontos fortes e fracos fornece mais informações.
Prós
- A consulta é multiestágio, geralmente mais curta, mais concisa e mais legível.
- O pipeline de agregação é mais eficiente, oferecendo uma melhoria significativa em relação ao MapReduce.
- Ele oferece suporte a operadores integrados do MongoDB que permitem projetar sua consulta com flexibilidade.
- Suporta processamento de dados em tempo real.
- O pipeline de agregação é facilmente ingerido no MongoDB e não requer scripts de terceiros.
- Você pode criar uma nova coleção MongoDB para as saídas se precisar salvá-las.
Contras
- Pode não ser tão flexível quanto o MapReduce ao lidar com estruturas de dados mais complexas. Como não usa scripts de terceiros, ele limita você a um método específico de agregação de dados.
- Sua implementação e curva de aprendizado podem ser desafiadoras para desenvolvedores com pouca ou nenhuma experiência com o MongoDB.
Quando você deve usar MapReduce ou Aggregation Pipeline?
Geralmente, é melhor considerar seus requisitos de processamento de dados ao escolher entre MapReduce e o pipeline de agregação.
Idealmente, se seus dados forem mais complexos, exigindo lógica e algoritmos avançados em um sistema de arquivos distribuído, o MapReduce pode ser útil. Isso ocorre porque você pode personalizar facilmente as funções de redução de mapa e injetá-las em vários nós. Vá para MapReduce se sua tarefa de processamento de dados exigir escalabilidade horizontal em vez de eficiência.
Por outro lado, o pipeline de agregação é mais adequado para computar dados complexos que não requerem lógica ou algoritmos personalizados. Se seus dados residirem apenas no MongoDB, faz sentido usar o pipeline de agregação, pois ele apresenta muitos operadores integrados.
O pipeline de agregação também é melhor para processamento de dados em tempo real. Se seu requisito de computação prioriza a eficiência em relação a outros fatores, você deseja optar pelo pipeline de agregação.
Execute cálculos complexos no MongoDB
Embora ambos os métodos do MongoDB sejam consultas de processamento de big data, eles compartilham muitas diferenças. Em vez de recuperar os dados antes de realizar os cálculos, o que pode ser mais lento, ambos os métodos realizam cálculos diretamente nos dados armazenados no banco de dados, tornando as consultas mais eficientes.
No entanto, um substitui o outro em desempenho, e você acertou. O pipeline de agregação supera o MapReduce em eficiência e desempenho. Mas, embora você queira substituir o MapReduce pelo pipeline de agregação a todo custo, ainda há áreas específicas do aplicativo em que o uso do MapReduce faz mais sentido.